Linux内核参数调整
ulimit 设置
ulimit -n 要调整为 100000 甚至更大。 命令行下执行 ulimit -n 100000 即可修改。通过ulimit -n的更改仅适用于当前会话,如果需要永久生效,需要设置 /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 core unlimited
root hard core unlimited
注意,修改 limits.conf 文件后,需要重启系统生效(测试重新登录会话就可以通过ulimit -n查看到修改后的结果)。ulimit -n将仅显示软限制。要获得硬限制,您需要做ulimit -Hn。
*不适用于root用户,所以必须明确声明,如果要应用更改而无需重新启动,请/etc/pam.d/common-session通过在文件末尾添加以下行来进行修改:
session required pam_limits.so
内核设置
Linux 操作系统修改内核参数有 3 种方式:
-
修改
/etc/sysctl.conf文件,加入配置选项,格式为key = value,修改保存后调用sysctl -p加载新配置 -
使用
sysctl命令临时修改,如:sysctl -w net.ipv4.tcp_mem="379008 505344 758016" -
直接修改
/proc/sys/目录中的文件,如:echo "379008 505344 758016" > /proc/sys/net/ipv4/tcp_mem
第一种方式在操作系统重启后会自动生效,第二和第三种方法重启后失效
net.unix.max_dgram_qlen = 100
swoole 使用 unix socket dgram 来做进程间通信,如果请求量很大,需要调整此参数。系统默认为 10,可以设置为 100 或者更大。或者增加 worker 进程的数量,减少单个 worker 进程分配的请求量。
net.core.wmem_max
修改此参数增加 socket 缓存区的内存大小
net.ipv4.tcp_mem = 379008 505344 758016
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_tw_reuse
是否 socket reuse,此函数的作用是 Server 重启时可以快速重新使用监听的端口。如果没有设置此参数,会导致 server 重启时发生端口未及时释放而启动失败
net.ipv4.tcp_tw_recycle
使用 socket 快速回收,短连接 Server 需要开启此参数。此参数表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,Linux 系统中默认为 0,表示关闭。打开此参数可能会造成 NAT 用户连接不稳定,请谨慎测试后再开启。
消息队列设置
当使用消息队列作为进程间通信方式时,需要调整此内核参数
-
kernel.msgmnb = 4203520,消息队列的最大字节数
-
kernel.msgmni = 64,最多允许创建多少个消息队列
-
kernel.msgmax = 8192,消息队列单条数据最大的长度
FreeBSD/MacOS
-
sysctl -w net.local.dgram.maxdgram=8192
-
sysctl -w net.local.dgram.recvspace=200000 修改 Unix Socket 的 buffer 区尺寸
开启 CoreDump
设置内核参数
kernel.core_pattern = /data/core_files/core-%e-%p-%t
通过 ulimit -c 命令查看当前 coredump 文件的限制
ulimit -c
如果为 0,需要修改 /etc/security/limits.conf,进行 limit 设置。
开启 core-dump 后,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助
其他重要配置
-
net.ipv4.tcp_syncookies=1
-
net.ipv4.tcp_max_syn_backlog=81920
-
net.ipv4.tcp_synack_retries=3
-
net.ipv4.tcp_syn_retries=3
-
net.ipv4.tcp_fin_timeout = 30
-
net.ipv4.tcp_keepalive_time = 300
-
net.ipv4.tcp_tw_reuse = 1
-
net.ipv4.tcp_tw_recycle = 1
-
net.ipv4.ip_local_port_range = 20000 65000
-
net.ipv4.tcp_max_tw_buckets = 200000
-
net.ipv4.route.max_size = 5242880
查看配置是否生效
如:修改 net.unix.max_dgram_qlen = 100 后,通过
cat /proc/sys/net/unix/max_dgram_qlen
如果修改成功,这里是新设置的值。
高并发请求出现 Cannot assign requested address
调低time_wait状态端口等待时间:
- 调低端口释放后的等待时间,默认为60s,修改为15~30s
plain
sysctl -w net.ipv4.tcp_fin_timeout=30
- 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0,修改为1,释放TIME_WAIT端口给新连接使用
plain
sysctl -w net.ipv4.tcp_tw_reuse=1
- 修改tcp/ip协议配置,快速回收socket资源,默认为0,修改为1
plain
sysctl -w net.ipv4.tcp_tw_recycle=1
可能解决办法2
增加可用端口port_range:
- 确认port_range范围
plain
# sysctl -a |grep port_range
net.ipv4.ip_local_port_range = 50000 65000
- 修改配置
plain
# vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535
改完后,执行命令“sysctl -p”使参数生效。
可能解决办法3
net.ipv4.tcp_max_tw_buckets = 524288
`tcp_max_tw_buckets` 是一个与TCP协议相关的内核参数,主要用于控制TIME-WAIT状态的套接字(socket)数量。在Linux操作系统中,当一个TCP连接关闭后,为了确保网络上的最后一个ACK能够被接收,并处理可能的迟到的分组,该连接会进入TIME-WAIT状态。每个处于TIME-WAIT状态的连接都会占用系统资源。
`tcp_max_tw_buckets` 参数设定了系统可以同时保持的TIME-WAIT套接字的最大数量。如果达到这个限制,新的TIME-WAIT套接字将不会被创建,系统可能会强制关闭旧的连接以释放资源,这通常会导致"TCP: time wait bucket table overflow"这样的错误日志出现。调整这个参数可以帮助管理服务器上可用的资源,尤其是在高并发连接的场景下尤为重要。
可以通过修改 `/proc/sys/net/ipv4/tcp_max_tw_buckets` 文件的值来调整这个参数,或者使用 `sysctl` 命令进行配置。适当调整这个值可以根据你的服务器性能和应用需求优化网络性能。不过,需要注意的是,不恰当地增大这个值可能导致消耗更多的系统内存,而过小则可能影响到网络服务的正常运行。因此,调整时需要根据实际情况来进行权衡。