Linux 常用内核参数说明

sysctl 命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录 /proc/sys 中。

sysctl 命令对内核参数的修改仅在当前生效,重启系统后参数丢失。如果希望参数永久生效可以修改配置文件 /etc/sysctl.conf

常用内核参数说明

内核参数 取值范围 含义 使用说明
kernel.hung_task_timeout_secs = 120 int 设置系统检测到进程阻塞(如 `D` 状态)后,等待进程结束的时常。
如果进程未在规定时间内结束,系统认为该进程无响应,则自动杀死以避免系统奔溃

mem

内核参数 取值范围 含义 使用说明
vm.min_free_kbytes = 2097152 单位 KB 设置系统最小剩余内存,以避免缓存不释放导致的死机
vm.oom-kill = 0 0,1
默认值为 1,开启
是否启用 OOM-killer。
特定情况下,可能不希望核心执行 OOM killer 的工作,关闭 OOM killer。 例如,排错时
echo 0 > /proc/sys/vm/oom-kill 临时关闭 [1]
vm.overcommit_memory = 0 0,1,2 内存分配策略
/proc/sys/vm/overcommit_memory
vm.overcommit_memory 详细说明
vm.overcommit_ratio = 50 int
default = 50
vm.overcommit_memory = 2 时才生效,配置允许 overcommit 的百分比 vm.overcommit_memory 详细说明
vm.panic_on_oom = 0 0,1
默认为 0 ,开启
表示当内存耗尽时,内核会触发 OOM killer 杀掉最耗内存的进程
vm.oom_kill_allocating_task = 0 0,1
默认为 0 ,不启用
OOM-Killer 时,是否选择当前正在申请内存的进程进行 kill

vm.overcommit_memory

Linux 对大部分申请内存的请求都回复 yes,以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。当 Linux 发现内存不足时,会发生 OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。

oom-killer 发生时,Linux 会选择杀死哪些进程?选择进程的函数是 oom_badness 函数(在 mm/oom_kill.c 中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟 oom_score_adj 有关,而且 oom_score_adj 可以被设置(-1000最低,1000最高)。

overcommit 内存分配策略,可选值:0、1、2

  • 0 - 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

  • 1 - 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

  • 2 - 表示内核允许分配超过所有物理内存和交换空间总和的内存

    当系统分配的内存超过 swap+N%*物理RAM (N%由 vm.overcommit_ratio 决定)时,会拒绝 commit

脚注