谨慎调整内核参数:vm.min_free_kbytes

内核参数:内存相关

内存管理从三个层次管理内存,分别是node, zone ,page;

64位的x86物理机内存从高地址到低地址分为: Normal DMA32 DMA.随着地址降低。

[[email protected] /home/ahao.mah]
#cat /proc/zoneinfo  |grep "Node"
Node 0, zone      DMA
Node 0, zone    DMA32
Node 0, zone   Normal
Node 1, zone   Normal

每个zone都有自己的min low high,如下,但是单位是page

[[email protected] /home/ahao.mah]
#cat /proc/zoneinfo  |grep "Node 0, zone" -A10
Node 0, zone      DMA
  pages free     3975
        min      20
        low      25
        high     30
        scanned  0
        spanned  4095
        present  3996
        managed  3975
    nr_free_pages 3975
    nr_alloc_batch 5
--
Node 0, zone    DMA32
  pages free     382873
        min      2335
        low      2918
        high     3502
        scanned  0
        spanned  1044480
        present  513024
        managed  450639
    nr_free_pages 382873
    nr_alloc_batch 584
--
Node 0, zone   Normal
  pages free     11105097
        min      61463
        low      76828
        high     92194
        scanned  0
        spanned  12058624
        present  12058624
        managed  11859912
    nr_free_pages 11105097
    nr_alloc_batch 12344
low = 5/4 * min
high = 3/2 * min

[[email protected] /home/ahao.mah]
#T=min;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=499 MB

[[email protected] /home/ahao.mah]
#T=low;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=624 MB

[[email protected] /home/ahao.mah]
#T=high;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=802 MB

min 和 low的区别:

  1. min下的内存是保留给内核使用的;当到达min,会触发内存的direct reclaim
  2. low水位比min高一些,当内存可用量小于low的时候,会触发 kswapd回收内存,当kswapd慢慢的将内存 回收到high水位,就开始继续睡眠

内存回收方式

内存回收方式有两种,主要对应low ,min

  1. direct reclaim : 触发min水位线时执行
  2. kswapd reclaim : 触发low水位线时执行

在el5下有一个参数: vm.extra_free_kbytes

这个参数含义是: low = min_free_kbytes*5/4 + extra_free_kbytes . 但是在7u下没有此参数.

[[email protected] /root]
#sysctl  -a | grep free
vm.min_free_kbytes = 512000
vm.extra_free_kbytes = 512000
[[email protected] /root]
#sysctl  -a | grep free
vm.min_free_kbytes = 512000
vm.extra_free_kbytes = 512000
fs.quota.free_dquots = 0

[[email protected] /root]
#T=min;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=499 MB

[[email protected] /root]
#T=low;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=1124 MB

[[email protected] /root]
#echo "499*5/4 + (512000/1024)"| bc
1123

注意

最近有业务线在调大min值得时候导致物理机hang引发故障,得出一些经验和建议:

  1. 对于线上128G的内存的机器,可以考虑将min设置为512M左右。因为,太大了,可能会导致内存的浪费;当然如果只有40G的物理机,更不要考虑把min设置超过1G了,这样会导致频繁的触发内存回收;具体优化也要根据业务来看。
  2. 关键是在于调整内存的内核参数的时候! 调大的风险远大于调小的风险! 如果有人想将vm.min_free_kbytes 调大,千万要注意当前的水位,如果一旦调大vm.min_free_kbytes 立刻触发direct reclaim,可能会导致机器hang住,ping的通,ssh不上,影响业务!hang住的原因是当vm.min_free_kbytes 是512M的时候,此时 free只有1G,此时正常运行,此时如果调大vm.min_free_kbytes 到5G,将会direct reclaim失败。
时间: 2024-10-10 19:52:14

谨慎调整内核参数:vm.min_free_kbytes的相关文章

内核参数vm.overcommit_memory和vm.overcommit_ratio

(1)vm.overcommit_memory 执行grep -i commit  /proc/meminfo 看到CommitLimit和Committed_As参数. CommitLimit是一个内存分配上限,CommitLimit = 物理内存 * overcommit_ratio(默认50,即50%) + swap大小 Committed_As是已经分配的内存大小. -------- vm.overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0.1.2 0: (

安装完redis必须设置内核参数vm.overcommit_memory = 1

必须设置 /etc/sysctl.conf #vm.overcommit_memory = 1 # sysctl -p 否则会遇到 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. 今天搞elk的时候就遇到了这样问题. 版权声明:本文为博主原创文章,未经博主允许不得转载.

nginx性能优化及内核参数调整

Nginx配置参数优化 Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_processes 该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程. worker_rlimit_nofile 它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400. 还需要在系统里执行ulimit -n 10

修改内核参数 dad_transmits

修改内核参数 dad_transmits 最近在学习ipv6的相关知识. 自己控制ipv6 地址冲突检测(dad)发出的报文后,地址配置后,发现多一次ns报文.这很奇怪.经过排查,发现是内核自己发了一次ns报文.所以需要把内核发出的ns报文给禁掉.需要修改内核参数.第一次调整内核参数,内心是激动的.在/proc/sys/net/ipv6/conf/all找到了该参数.但是修改的时候发现问题.通过vim不让修改./proc/sys/net/ipv6/conf找到对应的网口 批量修改直接修改配置文件

技巧-Linux内核参数调整办法

技巧 -Linux内核参数调整办法 ulimit设置 ulimit -n 要调整为100000甚至更大. 命令行下执行 ulimit -n 100000即可修改.如果不能修改,需要设置 /etc/security/limits.conf,加入 * soft nofile 262140 * hard nofile 262140 root soft nofile 262140 root hard nofile 262140 * soft core unlimited * hard core unli

Linux 内核参数 和 Oracle相关参数调整

Linux 内核参数 和 Oracle相关参数调整 分类: Oracle Basic Knowledge2009-10-14 12:23 9648人阅读 评论(0) 收藏 举报 oraclelinuxsemaphorearraysdatabaseoracle10g Linux 内核参数的大小和Oracle 有很大的关闭,比如ORA-27102的错误,就是因为内核参数的大小不当造成.具体参考Blog: Upon startup of Linux database get ORA-27102: ou

[Linux]技巧-Linux内核参数调整办法【兄弟连技术分享】

ulimit设置 ulimit -n 要调整为100000甚至更大. 命令行下执行 ulimit -n 100000即可修改.如果不能修改,需要设置 /etc/security/limits.conf,加入 * soft nofile 262140 * hard nofile 262140 root soft nofile 262140 root hard nofile 262140 * soft core unlimited * hard core unlimited root soft co

Sysctl命令及linux内核参数调整

一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 命令格式: sysctl [-n] [-e] -w variable=value sysctl [-n] [-e] -p (default /etc/sysctl.conf) sysctl [-n] [-e] –a 常用参数的意义: -w  临时改变某个指定参数的值,如 # sysctl -w net.ipv4.ip_forward=1 -a  

安装Oracle需要调整的linux内核参数

在安装Oracle的时候需要调整linux的内核参数,但是各参数代表什么含义呢,下面做详细解析. Linux安装文档中给出的最小值: fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 4294967295 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 900