Linux内核参数优化总结

如何修改Linux内核参数

方法一

通过直接修改 /proc/sys/ 下对应的目录(abi  debug  dev  fs  fscache  kernel  net  sunrpc  user  vm)

例如 echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle

方法二

通过sysctl.conf文件查看和修改内核参数,调整完成后使用sysctl -p使之生效

网络相关


与网络相关的内核调整参数

  • fs.file-max = 6553500

表示系统级别最大能打开的文件句柄数,是针对整个系统,并非某个用户(与ulimit -n有区别的,后者是指单个进程的限制)

  • net.ipv4.tcp_tw_reuse

默认是0,即关闭状态,1代表开启,表示允许处于TIME_WAIT的socket连接,用于新的TCP连接(谨慎使用作用比net.ipv4.tcp_tw_recyle更柔和一些,但是必须与net.ipv4.tcp_timestamps参数配合使用否则不生效,生产保持默认即关闭

+ 0 - disable + 1 - global enable + 2 - enable for loopback traffic only,官方原文 - Allow to reuse TIME-WAIT sockets for new connections when it is  safe from protocol viewpoint. Default value is 0

  • net.ipv4.tcp_tw_recyle

默认是0,关闭状态,1代表开启,内核快速回收TIME_WAIT的连接(谨慎使用,对请求客户端为NAT环境,将是毁灭性的;生产保持默认即关闭,与net.ipv4.tcp_timestamps配合使用否则不生效,kernel4.12正式移除这个参数

  • net.ipv4.tcp_timestamps

在新版本的内核中CentOS7以上默认开启,其功能的本质就是记录数据包的发送时间

  • net.ipv4.tcp_keepalive_time

表示当启用keepalive时,TCP发送keepalive消息的频率,默认值是7200秒,可以适当把时间改小,让系统快速检查无效的TCP连接,回收无效的TCP连接

  • net.ipv4.tcp_keepalive_intvl

当keepalive_time发起探测后,并检查失败后,TCP发起的重试keepalive探测间隔

  • net.ipv4.tcp_keepalive_probes

当keepalive_time发起的探测,并认为失败,执行tcp_keepalive_intvl的次数回收无效的socket或者TCP连接,具体公式= tcp_keepalive_time + tcp_keepalive_probes * tcp_keepalive_intvl ,超时即回收

  • net.ipv4.tcp_fin_timeout

当服务器主动关闭连接时,socket保持在FIN_WAIT_2阶段的最大等待时间,超时即释放连接,默认值是60秒,如果要修改的话需要重新编译内核

  • net.ipv4.tcp_max_tw_buckets

代表系统允许TIME_WAIT套接字数量的最大值,就是系统的TIME_WAIT上限,因为过多的TIME_WAIT会使系统在网络处理能力变慢

  • net.ipv4.tcp_max_syn_backlog

表示系统TCP三次握手时,接受SYN队列的最大长度,可以根据实际业务场景适当调高此值,用来缓解web服务器高并发时无法处理过多的新请求,避免丢失新请求连接

该参数决定了系统中处于SYN_RECV状态的TCP连接数量。SYN_RECV状态指的是当系统收到SYN后,作为SYN+ACK响应后等待对方回复三次握手阶段中的最后一个ACK的阶段。对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。默认值大小会受实例内存的影响,默认值最大为2048
  • net.ipv4.tcp_rmem

定义了TCP接收连接窗口的套接字缓冲区大小(最小值 默认值 最大值)不常用参数 保持默认即可

  • net.ipv4.tcp_wmem

定义了TCP发送连接窗口的套接字缓存区大小(最小值 默认值 最大值)不常用参数 保持默认即可

  • net.ipv4.tcp_syn_retries

内核在三次握手时无法建立TCP连接时,发送的SYN的次数,大于重试次数即断开连接,官方建议值即默认值3

  • net.ipv4.tcp_synack_reties

内核在三次握手时第二次,一般是指服务端LITEN端,请求方发起连接,接收方回应的SYN+ACK这个阶段,最大重试次数,默认值是5次,当请求方没有回应ACK时,服务端发送的最大重试交次数 

  • net.core.somaxconn
该参数定义了系统中每一个端口最大的监听队列的长度,是个全局参数。该参数和net.ipv4.tcp_max_syn_backlog有关联,后者指的是还在三次握手的半连接的上限,该参数指的是处于ESTABLISHED的数量上限。若您的ECS实例业务负载很高,则有必要调高该参数。listen(2)函数中的参数backlog 同样是指明监听的端口处于ESTABLISHED的数量上限,当backlog大于net.core.somaxconn时,以net.core.somaxconn参数为准

摘抄阿里云官方解释

 内存相关


 以下内核参数是与内存相关的

  • vm.dirty_backgound_bytes/vm.dirty_backgound_ratio

当操作系统中的脏页数量或者比率大于dirty_backgoud_bytes/dirty_backgound_ratio时,系统内核守护线程开始执行脏页数据换出,意思就是写入磁盘中。这二个参数同一时间只能配置其中一个后者会覆盖前者,其中dirty_background_ratio代表(a percentage of total available memory that contains free pages and reclaimable pages仅计算 空闲+可回收的页并 不代表所有内存的百分比)

  • vm.dirty_bytes / vm.dirty_ratio

与前面二个参数不同之处是,这二个参数绝对的意思,超出阈值系统会阻挡新的IO请求,直到脏页数据低于设定的阈值,在经常遇到内存IO卡顿时需要留意这二个参数,可以适当的调整一下(这二个参数与上面一样,在OS同一时间只能存在一个,后者覆盖前者)

  • vm.dirty_expire_centisecs

单位是1/100s,即10ms。意思在内存缓存中大于该时间的数据视旧数据,需要页换出,即写入磁盘中,默认值是3000(注意这个值只是计数,不是实质的时间秒 3000*10ms=30000m即30s),对于写入频率的应用,则可以适当的调低该参数,但是也不能过低也会影响IO

  • vm.dirty_writeback_centisecs

代表内核多久进行一次将内存中的缓存数据写入磁盘,检查频率的意思,单位是1/100s,如果设置为0,表示禁用检查

  • vm.vfs_cache_pressure

代表内存回收缓存倾向性默认值为100,如果大于100,内核倾向于回收direcotry & inode的缓存;如果小于100,内核倾向于保留directroy & inode的缓存

  • vm.drop_caches

该参数表示回收那些类型的缓存,可选值1、2、3

1表示清除pagecache

2表示清除slab分配器的对象

3表示清除1 & 2

如果在紧急时,也可以手动回收缓存 echo 3 > /proc/sys/vm/drop_caches

  • vm.oom_dump_tasks

保持默认即可,默认值1,代表当操作系统触发OOM时,将一些 pid, uid, tgid, vm size, rss, pgtables_bytes, swapents, oom_score_adj输出到 dmesg中,便于排查错误

  • vm.oom_kill_allocating_task = 0

保持默认即可,默认值0。通常设置为0,代表尽可能KILL消耗最多内存的进程,当然必需要判断PID的oom_score的值,该值越大代表被kill的概率高

  •  vm.panic_on_oom

默认值是0,表示当系统内存耗尽时,开启oom killer,kill系统消耗最多内存的进程,系统具体kill的那个进程是基于PID的oom_score的值,通常kill掉进程oom_score值最高的

共有三个参数oom_adj oom_score oom_score_adj

如何评定进程的oom_score分数,通过内核中的oom_badness函数进行计算的,分为系统评分 & 用户评分

用户评分对应的就是oom_score_adj的值,最高1000,最低-1000,通常-1000代表禁止kill该进程,该参数oom_score_adj可以人为为应用程序指定值,但一定要合理的指定,以免系统KILL掉其它系统的特殊进程,一般情况下,不会把用户应用进程设置为-1000

系统评分,则根据该进程内存的 RSS PageTalbe SWAP 三者使用的内存占比进行评分,消耗最多对评分越高,通常该值写入到oom_score中

oom_adj的值 范围是 -17~15 OS根据实际情况进行评定

参考文献 https://blog.csdn.net/Hearbeat/article/details/82793258

  • vm.overcommit_memory

默认值是0,表示柔和一点的,试探性的申请系统内存,个人猜是根据可用内存进行计算

1 代表忽略系统内存配额,超额使用,不考虑操作系统中有多少内存,一句话随便用

2 代表禁止overcommit,对申请内存有配额限制,如果过超额则拒绝,具体的CommitLimit的值可以通过/proc/meminfo中的CommitLimit值获得,而CommitLimit的计算公式= Physical RAM * vm.overcommit_ratio / 100) + Swap

当设置vm_overcommit_ratio时仅在vm.overcommit_memory = 2 才生效

  •  vm.overcommit_kbytes

表示在系统中最大允许内存超额的值,具体值,在同一时间与vm.overcommit_ratio只能生效其中一个,一个是百分比,一个是具体数值

  •  vm.min_free_kbytes

LinuxVM预留的最小保留内存

 

 

原文地址:https://www.cnblogs.com/apink/p/15562506.html