10-Linux内核优化

nobility 发布于 2022-11-07 3061 次阅读


Linux内核优化

vm.overcommit_memory

启动Redis实例时会报警告:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

overcommit_memory参数设置为0,后台保存功能在内存紧张的情况下可能会失败,要解决这个问题,将vm.overcommit_memory = 1写入/etc/sysctl.conf,再重启后有效,或执行sysctl vm.overcommit_memory=1命令让它生效

该参数的值可以使用cat /proc/sys/vm/overcommit_memory命令查看,设置就根据警告的提示进行设置即可

overcommit_memory参数的含义:

含义
0 内核将检查是否有足够的可用内存,如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程
1 表示内核允许超量使用内存直到用完为止
2 表示内核绝不过量的使用内存,即整个系统地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改。

THP(Transparent huge page)

启动Redis实例时会报警告:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

你在内核中支持并启用了透明大页(THP),该特性可能会造成Redis延时和内存使用问题,为了解决这个问题,使用root用户运行echo never > /sys/kernel/mm/transparent_hugepage/enabled命令,并将其添加到你的/etc/rc.local中,以便在重启后保留该设置,Redis重启后THP才是禁用的

该参数的值可以使用cat /sys/kernel/mm/transparent_hugepage/enabled命令查看,若输出[always] madvise never表示启用了THP,若输出always madvise [never]表示禁用了THP,设置就根据警告的提示进行设置即可

要注意的是红帽的Linux中该设置的路径是/sys/kernel/mm/redhat_transparent_hugepage/enabled

ulimit

文件句柄:同一个文件可以被同时打开的个数

启动Redis实例时可能会报警告:#You requested maxclients of 10000 requiring at least 10032 max file descriptors.# Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.# Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

你设置的最大请求连接数是10000个,至少需要10032个文件句柄。Redis不能设置打开文件个数为10032个,因为系统报错:操作不允许。当前最大打开文件是4096个,将最大连接数设置为4064个,以匹配较低的ulimit,如果需要更多的最大连接数,请使用ulimit -n命令增加

为了Redis的性能考虑,一般使用ulimit -n命令增加文件句柄

TCP backlog

TCP backlog通过队列的方式来临时缓存TCP请求的,如果设置太长,导致请求可能迟迟得不到处理,同样会触发客户端的超时重传,并且会浪费内存,如果设置过短,会导致触发大量的TCP重传,导致网络带宽的拥塞

启动Redis实例时可能会报警告:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

无法设置TCP backlog为511,原因是/proc/sys/net/core/somaxconn设置的值较低,为128。如果Linux的TCP backlog小于Redis设置的TCP backlog,那么在Redis启动时会提示Redis的TCP backlog被迫降至Linux的TCP backlog

该参数的值可以使用cat /proc/sys/net/core/somaxconn命令查看,使用echo 511 > /proc/sys/net/core/somaxconn命令进行设置

OOM killer

当内存使用超出时,操作系统按照一定规则杀死某些进程,进程启动时会在/proc/目录下生成以该进程号为名的目录,该进程目录中的oom_adj文件的值,就是被杀死的概率,概率越小,越不容易被杀死

对于Redis来说,由于有高可用的存在,一般无需依赖该机制

swappiness

对于交互分区的使用,Redis是基于内存的数据库,所以为了性能考虑,不要使用交互分区,设置为0即可

使用cat /proc/sys/vm/swappiness命令查看设置的值

vm.swappiness=0写入/etc/sysctl.conf,重启后生效,或执行echo 0 > /proc/sys/vm/swappiness命令让其生效

策略
0 Linux3.5以及以上:宁愿用OOM Killer也不用swap
Linux3.4以及更早:宁愿用swap也不用OOM Killer
1 Linux3.5以及以上:宁愿用swap也不用OOM killer
60 默认值
100 操作系统会主从使用swap

NTP(Net Time Protocol)

NTP服务就是网络对时服务,防止多台机器出现时间不一致

尽管Redis Cluster或Redis Sentinel依赖选举的时间为本地时间,如果有不一致不会出错,时间上最好还是应该一致的,因为查日志找问题时,日志时间不准确也是比较麻烦的

此作者没有提供个人介绍
最后更新于 2022-11-07