图书商城网站开发的目的,网站换域名怎么做,安徽旅游在线网站建设,软件技术的就业方向文章目录 问题可能原因分析可能原因分析尝试各种解决方案尝试解决过程 解决办法#xff1a; 调整 overcommit_meory参数overcommit_memory详解什么是 overcommit_memory#xff1f;overcommit_memory 的选项及其含义配置 overcommit_memory查看当前设置设置 overcommit_memor… 文章目录 问题可能原因分析可能原因分析尝试各种解决方案尝试解决过程 解决办法 调整 overcommit_meory参数overcommit_memory详解什么是 overcommit_memoryovercommit_memory 的选项及其含义配置 overcommit_memory查看当前设置设置 overcommit_memory配置 overcommit_ratio 参数设置对系统的影响启发式内存分配0总是允许内存分配1禁止过度分配2 实例与使用建议数据库服务器高性能计算应用 RedHat官网调优指南 临时或永久改变系统的内存管理行为临时调整内存参数永久调整内存参数参考命令 问题
启动的时候直接抛出如下异常
Native memory allocation (mmap) failed to map 2879048192 bytes for committing reserved memory在 Linux 上部署项目时遇到 Native memory allocation (mmap) failed to map 2879048192 bytes for committing reserved memory 错误这通常表明系统在尝试分配内存时遇到了问题。虽然 free 命令显示有足够的可用内存并且 ulimit -a 显示内存没有被限制但仍可能有其他原因导致该问题。 可能原因分析
可能原因分析 内存碎片化 尽管 free 显示有足够的可用内存但这些内存可能不是连续的。mmap 需要分配连续的内存块如果内存碎片化严重可能无法找到足够大的连续内存块。 地址空间不足 32 位系统的虚拟地址空间有限即使物理内存充足虚拟地址空间也可能不足。64 位系统通常不太可能出现这个问题但在极端情况下例如系统运行多个内存密集型应用程序也可能发生。 内核参数限制 某些内核参数如 vm.max_map_count、vm.overcommit_memory可能限制了内存分配。 容器或虚拟机限制 如果在 Docker 容器或虚拟机中运行应用程序容器或虚拟机本身可能有内存限制。 尝试各种解决方案 检查内存碎片化 使用 cat /proc/meminfo 查看内存详细信息。重点关注 MemFree、MemAvailable、HugePages_Total 和 HugePages_Free。使用 sudo sysctl -a | grep vm.min_free_kbytes 确认内核保留的最小空闲内存。 调整内核参数 vm.max_map_count最大 mmap 区域数。sudo sysctl -w vm.max_map_count262144vm.overcommit_memory内存过度提交策略。 【我们通过调整参数临时修复了该问题】sudo sysctl -w vm.overcommit_memory1检查虚拟地址空间 确保系统运行在 64 位模式下。检查应用程序是否有特定的内存限制。 检查容器/虚拟机限制 对于 Docker 容器docker inspect container_id | grep Memory对于虚拟机检查虚拟机管理工具的内存设置。 尝试解决过程 检查内存详细信息 cat /proc/meminfo检查内核参数 sudo sysctl -a | grep vm调整内核参数 sudo sysctl -w vm.max_map_count262144
sudo sysctl -w vm.overcommit_memory1检查 Docker 容器内存设置 docker inspect container_id | grep Memory 解决办法 调整 overcommit_meory参数
调整 overcommit_meory参数。 overcommit_memory详解
在 Linux 操作系统中内存分配是一个关键的任务。内存的高效使用和管理直接影响系统的性能和稳定性。overcommit_memory 是一个重要的内核参数用于控制内存分配策略。
什么是 overcommit_memory
overcommit_memory 是 Linux 内核中的一个参数通过 /proc/sys/vm/overcommit_memory 文件进行配置。它决定了内核如何处理内存分配请求尤其是在可用物理内存不足的情况下。
overcommit_memory 的选项及其含义
overcommit_memory 参数有三个可能的值每个值对应一种特定的内存分配策略 0 - 启发式内存分配默认值 内核根据一定的启发式算法决定是否允许内存分配请求。内核会考虑当前的内存使用情况和预期的内存需求通常会允许合理范围内的内存过度分配。优点灵活性较高适合大多数应用场景。缺点可能在内存非常紧张时导致 OOMOut Of Memory错误。 1 - 总是允许内存分配 内核允许所有内存分配请求无论当前的内存使用情况如何。这意味着即使系统内存已经耗尽内核也会继续分配内存。优点极大的灵活性确保所有内存分配请求都能成功。缺点可能导致严重的内存不足问题甚至导致系统崩溃。 2 - 禁止过度分配 内核严格限制内存分配只有在有足够的物理内存和交换空间时才允许内存分配请求。这个策略会结合 overcommit_ratio 参数来确定可用的内存总量。优点提高系统稳定性防止 OOM 错误。缺点降低内存分配灵活性可能拒绝一些合理的内存分配请求。
配置 overcommit_memory
可以通过以下命令查看和设置 overcommit_memory 参数
查看当前设置
cat /proc/sys/vm/overcommit_memory设置 overcommit_memory
例如将 overcommit_memory 设置为 1
echo 1 /proc/sys/vm/overcommit_memory配置 overcommit_ratio
如果 overcommit_memory 设置为 2还需要配置 overcommit_ratio 参数来决定可用内存总量。overcommit_ratio 是一个百分比值表示可分配的物理内存和交换空间的比例。
echo 50 /proc/sys/vm/overcommit_ratio这个配置表示内核允许分配的内存总量为物理内存加上 50% 的交换空间。
参数设置对系统的影响
启发式内存分配0
这种设置平衡了灵活性和稳定性适合大多数应用场景。系统会尝试合理地分配内存防止过度分配但在极端情况下可能仍会遇到 OOM 错误。
总是允许内存分配1
这种设置提供了最大的灵活性但也伴随着最高的风险。适用于需要极大内存灵活性的场景如高性能计算或科学计算但需注意可能的内存不足问题。
禁止过度分配2
这种设置提供了最大的稳定性适用于需要严格内存控制的场景如数据库服务器或关键业务应用。通过合理设置 overcommit_ratio可以确保系统不会因内存不足而崩溃。
实例与使用建议
数据库服务器
对于数据库服务器建议使用禁止过度分配的策略设置 overcommit_memory 为 2并合理配置 overcommit_ratio 以确保稳定性。例如对于一个拥有 16GB 内存和 8GB 交换空间的系统可以将 overcommit_ratio 设置为 50
echo 2 /proc/sys/vm/overcommit_memory
echo 50 /proc/sys/vm/overcommit_ratio高性能计算应用
对于高性能计算应用可以考虑启用总是允许内存分配的策略设置 overcommit_memory 为 1以确保所有内存分配请求都能成功
echo 1 /proc/sys/vm/overcommit_memoryRedHat官网调优指南 临时或永久改变系统的内存管理行为
https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-captun
在 Linux 上调整内存相关参数可以临时或永久改变系统的内存管理行为。
临时调整内存参数
临时调整内存参数可以通过向 /proc/sys 文件系统中的相应文件写入值来实现。这种方法在系统重启后会失效需要重新设置。 调整 overcommit_memory 参数 echo 1 /proc/sys/vm/overcommit_memory调整 overcommit_ratio 参数 echo 50 /proc/sys/vm/overcommit_ratio调整 max_map_count 参数 echo 262144 /proc/sys/vm/max_map_count调整 nr_hugepages 参数 echo 128 /proc/sys/vm/nr_hugepages调整其他相关参数 echo 65536 /proc/sys/kernel/msgmax
echo 65536 /proc/sys/kernel/msgmnb
echo 1985 /proc/sys/kernel/msgmni
echo 4294967296 /proc/sys/kernel/shmall
echo 68719476736 /proc/sys/kernel/shmmax
echo 4096 /proc/sys/kernel/shmmni
echo 32768 /proc/sys/kernel/threads-max
echo 65536 /proc/sys/fs/aio-max-nr
echo 1048576 /proc/sys/fs/file-max永久调整内存参数
为了使内存参数的调整在系统重启后依然有效可以将这些设置写入 /etc/sysctl.conf 文件或在 /etc/sysctl.d/ 目录下创建一个新的配置文件。 编辑 /etc/sysctl.conf 文件 sudo nano /etc/sysctl.conf添加以下内容 vm.overcommit_memory 1
vm.overcommit_ratio 50
vm.max_map_count 262144
vm.nr_hugepages 128
kernel.msgmax 65536
kernel.msgmnb 65536
kernel.msgmni 1985
kernel.shmall 4294967296
kernel.shmmax 68719476736
kernel.shmmni 4096
kernel.threads-max 32768
fs.aio-max-nr 65536
fs.file-max 1048576创建新的配置文件例如 /etc/sysctl.d/99-custom.conf sudo nano /etc/sysctl.d/99-custom.conf添加相同的内容 vm.overcommit_memory 1
vm.overcommit_ratio 50
vm.max_map_count 262144
vm.nr_hugepages 128
kernel.msgmax 65536
kernel.msgmnb 65536
kernel.msgmni 1985
kernel.shmall 4294967296
kernel.shmmax 68719476736
kernel.shmmni 4096
kernel.threads-max 32768
fs.aio-max-nr 65536
fs.file-max 1048576应用配置 sudo sysctl -p参考命令 临时调整参数 echo 1 /proc/sys/vm/overcommit_memory
echo 262144 /proc/sys/vm/max_map_count永久调整参数 sudo nano /etc/sysctl.d/99-custom.conf
sudo sysctl -p