跳到主要内容

常见内核参数调优总结

· 阅读需 7 分钟
老司机
Maintainer of this proj

总结一下常见的内核参数调优

1. 常见参数列表

参数所属子系统取值范围调优示例功能说明优化场景及影响
fs.file-max文件系统取决于系统内存,通常为数十万至数百万1024000系统级最大文件描述符数。适用于高并发服务器,防止文件句柄耗尽导致服务不可用。
fs.inotify.max_user_watches文件系统通常为8192 ~ 数百万8192000单用户最大inotify监视数。适合文件监控密集的应用,如IDE、文件同步工具,防止监视资源不足。
fs.inotify.max_user_instances文件系统通常为128 ~ 数百万8192000单用户最大inotify实例数。配合max_user_watches使用,防止应用启动失败。
net.core.somaxconn网络128 ~ 6553565535每个socket监听等待应用程序accept队列最大长度。适用于高并发网络服务,提升连接排队能力,减少拒绝服务。
net.core.netdev_max_backlog网络128 ~ 6553510000进入网卡还没被内核协议栈处理的报文最大长度。适用于高并发网络服务,防止接收队列溢出。
net.ipv4.tcp_max_syn_backlog网络128 ~ n40960内核保持的未被 ACK 的 SYN 包最大队列长度。适用于高并发网络服务,防止半连接队列溢出。
net.ipv4.tcp_max_tw_buckets网络1024 ~ 65535180000TIME-WAIT套接字最大数量。适用于高并发网络服务,防止TIME-WAIT套接字耗尽。
net.ipv4.tcp_tw_reuse网络0 或 11允许重用TIME-WAIT状态的套接字。适合高连接频率客户端如 nginx 反向代理等,减少TIME-WAIT端口耗尽。
net.ipv4.tcp_fin_timeout网络1 ~ 60秒15TCP连接FIN-WAIT-2状态超时时间。减少关闭连接等待时间,释放资源,适合连接频繁的服务器。
net.ipv4.ip_local_port_range网络1024 ~ 6553515000 60999本地端口分配范围。扩大范围可支持更多短连接,适合高并发客户端或代理服务器。
net.ipv4.tcp_keepalive_time网络1 ~ 7200秒30最大闲置时间从最后一个 data packet之后多长时间开始发送探测包,单位秒,用于检测死连接,适合长连接服务,防止资源浪费。容器内此参数必须比宿主机小,否则可能出现 write:broken pipe报错
net.ipv4.tcp_keepalive_intvl网络1 ~ 300秒30探测间隔时间在此期间连接上传输了任何内容都不影响探测的发送,单位是秒
net.ipv4.tcp_keepalive_probes网络1 ~ 103最大失败次数超过此值后将通知应用层连接失效
net.ipv4.ip_forward网络0 或 11是否启用IP转发。路由器或网关必开,普通主机一般关闭。
net.ipv4.tcp_timestamps网络0 或 11启用TCP时间戳。提高网络性能和防止序列号回绕,但可能泄露时间信息。
net.ipv4.tcp_tw_recycle网络0 或 10快速回收TIME-WAIT套接字。一般禁用,因导致NAT环境连接问题。
net.ipv4.tcp_syncookies网络0 或 11启用SYN Cookies。提高TCP连接建立速度,适合高并发服务器。
net.ipv4.tcp_mem网络3个整数,以空格分隔3043587 4058117 6087174TCP内存分配参数。调整参数可优化TCP连接建立速度,适合高并发服务器。
net.ipv4.tcp_rmem网络3个整数,以空格分隔4096 87380 33554432TCP接收缓冲区参数。调整参数可优化TCP连接建立速度,适合高并发服务器。
net.ipv4.tcp_wmem网络3个整数,以空格分隔4096 65536 33554432TCP发送缓冲区参数。调整参数可优化TCP连接建立速度,适合高并发服务器。
net.core.rmem_max网络1024 ~ 1677721616777216接收缓冲区最大长度。适用于高并发网络服务,防止接收缓冲区溢出。
net.core.wmem_max网络1024 ~ 1677721616777216发送缓冲区最大长度。适用于高并发网络服务,防止发送缓冲区溢出。
net.core.rmem_default网络1024 ~ 167772161048576接收缓冲区默认长度。适用于高并发网络服务,防止接收缓冲区溢出。
net.core.wmem_default网络1024 ~ 16777216524288发送缓冲区4096 65536 33554432 默认长度。适用于高并发网络服务,防止发送缓冲区溢出。
net.ipv4.tcp_congestion_control网络算法名称,如cubic、bbr等cubicTCP拥塞控制算法。适用于高并发网络服务,优化网络性能。BBR 算法,适用于 4.9 以上的所有内核,建议使用 4.19 以上内核
vm.swappiness虚拟内存管理0 ~ 1000swap使用倾向,0尽量不使用swap,100积极使用。数据库等内存敏感应用常设为0以减少IO延迟。
vm.overcommit_memory虚拟内存管理0、1、21内存分配策略:0启发式,1总是允许,2严格限制。1适合内存充足环境,2适合内存紧张防止OOM。
vm.dirty_background_ratio虚拟内存管理0 ~ 1005脏页比例达到该值时触发后台写回。适用于数据库等需要频繁写入的应用,防止写回过多导致性能下降。
vm.max_map_count虚拟内存管理通常为65530 ~ 数百万,具体上限依赖内存1024000设置单个进程最大内存映射区域数量。适用于数据库(如Elasticsearch)等需要大量内存映射的应用,防止映射不足导致失败。
kernel.pid_max内核调度32768 ~ 41943034194303最大进程ID。适合容器或高并发进程场景,避免PID耗尽。
kernel.randomize_va_space内存管理/安全0、1、22地址空间布局随机化等级,0关闭,2完全启用。增强安全性,防止攻击。

半/全连接 半全连接队列是 server 端影响连接建立最常见两个限制,概念如下:

  1. 半连接队列:存放处于 TCP_NEW_SYN_RECV 状态的 sock,此时三次握手尚未完成,内核需要一个队列暂存。通常来说,这个参数和 /proc/sys/net/ipv4/tcp_max_syn_backlog 有关,修改后可立即生效;
  2. 全连接队列:存放完成三次握手,但进程尚未 accept 的队列的 sock。这个参数通常由两个部分确定,分别是 listen 函数的第二个参数和 /proc/sys/net/core/somaxconn 共同决定,小的为准,修改后需重启进程才能生效。

两者的关系:半连接队列受全连接队列影响的,道理也很简单,全连接都已经满了,也没必要再处理半连接了。在排除全连接队列影响下,两者的关系不同内核也一直在调整,不考虑 syncookie 情况下当前的 4.14/4.19 syn-sock 入队的条件如下:

  • 全连接队列未满;
  • tcp_max_syn_backlog - 半连接队列深度 > tcp_max_syn_backlog*1/4;
  • tcp_max_syn_backlog - 半连接队列深度 < 1/4 且client地址不久前成功连接过。

网络收包流程图