内核参数优化

sysctl 设置

kernel name描述建议值(value)
kernel.shmall设置系统中共享内存段的总页数16380388
kernel.shmmax设置系统中单个共享内存段的最大大小16773517312
vm.swappiness调整系统在内存吃紧时候对交换空间(swap)的利用程度。1
vm.dirty_background_ratio控制系统在后台将脏数据写入磁盘的阈值3
vm.dirty_ratio控制系统在前台将脏数据写入磁盘的阈值。80
vm.dirty_expire_centisecs控制系统中脏数据的过期时间。500
vm.dirty_writeback_centisecs控制脏数据写回的频率。100
fs.aio-max-nr限制异步 I/O操作的数量。3145728
fs.file-max限制系统中打开的文件描述符的数量。6815744
kernel.shmmni系统中共享内存标识符的最大数量。4096
kernel.sem配置系统中的信号量机制。250 32000 100 128
net.ipv4.ip_local_port_range可供系统动态分配的本地端口范围9000 65500
net.core.rmem_default系统中套接字接收缓冲区的默认大小(以字节为单位)。262144
net.core.rmem_max系统中套接字接收缓冲区的最大大小(以字节为单位)。4194304
net.core.wmem_default系统中套接字发送缓冲区的默认大小(以字节为单位)。262144
net.core.wmem_max系统中套接字发送缓冲区的最大大小(以字节为单位)。1048586
net.core.somaxconn系统中监听套接字的最大队列长度。4096
net.ipv4.tcp_max_syn_backlog半连接队列的最大长度,等待完成三次握手的连接的最大数量。4096
net.ipv4.tcp_keepalive_intvlTCP keepalive消息的发送间隔,单位为秒。20
net.ipv4.tcp_keepalive_probes在认定连接失效之前,内核发送 TCP keepalive 消息的次数。3
net.ipv4.tcp_keepalive_timeTCP keepalive功能的启动时间。60s
net.ipv4.tcp_memTCP socket 接收缓冲区的内存分配策略。单位字节8388608 12582912 16777216
net.ipv4.tcp_fin_timeoutTCP连接的FIN-WAIT-2状态结束之后,内核将等待确认FIN的时间(以秒为单位)。5
net.ipv4.tcp_synack_retries发送SYN-ACK之后等待接收到ACK的重试次数。2
net.ipv4.tcp_syncookies启用或禁用TCP SYN cookies。1
net.ipv4.tcp_tw_recycle控制是否启用 TIME-WAIT 状态的快速回收0

Limit 设置

Limit name描述建议值(value)
* soft nofile每个用户会话打开的文件描述符数量的软限制。单位是文件描述符(file descriptors)1024000
* hard nofile每个用户会话打开的文件描述符数量的硬限制。单位是文件描述符(file descriptors)1024000
* soft nproc所有用户的软限制进程数量设置为无限制unlimited
* hard nproc所有用户的硬限制进程数量设置为无限制unlimited
* soft core所有用户的软限制核心转储文件大小设置为无限制unlimited
* hard core所有用户的硬限制核心转储文件大小设置为无限制unlimited
* soft memlock所有用户的软限制锁定内存的大小设置为无限制unlimited
* hard memlock所有用户的硬限制锁定内存的大小设置为无限制unlimited

一键写入并生效

cat > kernel_optimize.sh << EOF
cp -i /etc/sysctl.conf /etc/sysctl.conf-`date +%Y%m%d-%H%M%S`

shmall=`awk '($1 == "MemTotal:"){print $2}' /proc/meminfo`
shmmax=`expr $shmall \* 1024`

# kernel.shmall = 2097152          --(物理内存G*1024*1024)
# kernel.shmmax = 536870912        --(物理内存G*1024*1024*1024)
# kernel.shmall = 2097152
# kernel.shmmax = 2147483648

echo "kernel.shmall = $shmall"                   >> /etc/sysctl.conf
echo "kernel.shmmax = $shmmax"                   >> /etc/sysctl.conf

echo 'vm.swappiness = 1'                         >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio = 3'             >> /etc/sysctl.conf
echo 'vm.dirty_ratio = 80'                       >> /etc/sysctl.conf
echo 'vm.dirty_expire_centisecs = 500'           >> /etc/sysctl.conf
echo 'vm.dirty_writeback_centisecs = 100'        >> /etc/sysctl.conf

echo 'fs.aio-max-nr = 3145728'                   >> /etc/sysctl.conf
echo 'fs.file-max = 6815744'                     >> /etc/sysctl.conf
echo 'kernel.shmmni = 4096'                      >> /etc/sysctl.conf
echo 'kernel.sem = 250 32000 100 128'            >> /etc/sysctl.conf
echo 'net.ipv4.ip_local_port_range = 9000 65500' >> /etc/sysctl.conf
echo 'net.core.rmem_default = 262144'            >> /etc/sysctl.conf
echo 'net.core.rmem_max = 4194304'               >> /etc/sysctl.conf
echo 'net.core.wmem_default = 262144'            >> /etc/sysctl.conf
echo 'net.core.wmem_max = 1048586'               >> /etc/sysctl.conf

echo 'net.core.somaxconn = 4096'                               >> /etc/sysctl.conf
echo 'net.ipv4.tcp_max_syn_backlog = 4096'                     >> /etc/sysctl.conf
echo 'net.ipv4.tcp_keepalive_intvl = 20'                       >> /etc/sysctl.conf
echo 'net.ipv4.tcp_keepalive_probes = 3'                       >> /etc/sysctl.conf
echo 'net.ipv4.tcp_keepalive_time = 60'                        >> /etc/sysctl.conf
echo 'net.ipv4.tcp_mem = 8388608 12582912 16777216'            >> /etc/sysctl.conf
echo 'net.ipv4.tcp_fin_timeout = 5'                            >> /etc/sysctl.conf
echo 'net.ipv4.tcp_synack_retries = 2'                         >> /etc/sysctl.conf
echo 'net.ipv4.tcp_syncookies = 1'                             >> /etc/sysctl.conf
echo 'net.ipv4.tcp_tw_recycle = 0 '                            >> /etc/sysctl.conf

echo "\n\e[1;31m 检查:设置内核参数 ... 操作完成! \e[0m"
/sbin/sysctl -p > /dev/null 2>&1
EOF

执行脚本

sh kernel_optimize.sh

注意:因机器性能不同,kernel.shmall和kernel.shmmax需用计算后才能填入。

计算公式:

1. kernel.shmall

awk '($1 == "MemTotal:"){print $2}' /proc/meminfo

2. kernel.shmmax

expr shmall \* 1024
最后修改:2024 年 05 月 25 日
如果觉得我的文章对你有用,请随意赞赏