Linux 服务器初始化
Table of Contents
1 文件描述符数量限制
# /etc/sysctl.d/zzz-mysysctl.conf fs.nr_open=2000000 fs.file-max=2000000
# /etc/security/limits.conf * soft nofile 600000 * hard nofile 600000
这大概是限制连接数的最大因素,使用 ulimit -n
你当前可以打开的最大文件描述符数量,默认是1024。也就是说,你只能同时处理1024个连接。只要是对外开放的服务器,都应该扩大这个限制。需要通过修改内核参数和 ulimit
配置文件来修改。
/etc/security/limits.conf
会被软件更新覆盖掉,可以在
/etc/security/limits.d/xxx.conf
里面写。
fs.nr_open
表示一个进程可以打开的最大文件数量,默认值是 \(2^{20}=1048576\) ,一般是足够的,可以不修改。 fs.file-max
表示内核准备的最大描述符数量,现代发行版都把这个值默认设置很大,如果不够用的话再设置。
ulimit
是对用户的限制,使用的数量超过 soft
会有系统警告,不能超过 hard
。有时候不仅需要设置 nofile
,还要增加 nproc
,但现代的程序一般是不会使用那么多进程数量的。
2 网络优化
# /etc/sysctl.d/zzz-mysysctl.conf # ... net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_fin_timeout = 30 net.ipv4.ip_local_port_range = 2048 65000 net.ipv4.tcp_rmem = 4096 32768 262142 net.ipv4.tcp_wmem = 4096 32768 262142 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 net.core.netdev_max_backlog = 81920 net.core.somaxconn = 262144 net.ipv4.tcp_window_scaling = 1 net.ipv4.ip_local_port_range 10000 64000
- net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_max_tw_buckets
TIME_WAIT 状态的连接意义不大, tcp_tw_reuse
参数设置为1表示可以把 TIME_WAIT 连接用于新的连接。 TIME_WAIT 状态的连接数量也没必要太多,设置 tcp_max_tw_buckets
以及时清理这些连接。
有些内核参数指南都建议把net.ipv4.tcp_tw_recycle设置为1,用于快速减少TIME-WAIT状态的TCP连接数,但在客户端处于NAT环境时经常导致连接失败,我们建议设置为0。
- net.ipv4.tcp_keepalive_time
TCP 发送 keepalive 消息的频度,以检查连接是否仍然存活。默认是 2 小时,改为10分钟可以更快清理无效连接。
- net.ipv4.tcp_fin_timeout
FIN_WAIT_2 状态超时时间,不需要太长。
- net.ipv4.ip_local_port_range
端口号数量限制,性能测试的客户端,或者反向代理的nginx需要设置这个。
- rmem 和 wmem
TCP 发送/接收缓存的最小值、默认值、最大值,以及内核套接字缓存大小限制。根据实际业务逻辑和硬件成本考虑。现代服务器内存应该都很大,可以设置大一些。
- net.core.netdev_max_backlog
处理来自网卡的数据包的缓存队列长度。
- net.core.somaxconn
listen
的 backlog 参数限制,默认是 128,有必要改大点。
- net.ipv4.tcp_window_scaling
支持更大的 TCP 窗口 (超过 64k)。
3 方便调试
# /etc/sysctl.conf kernel.core_uses_pid = 1
- kernel.core_uses_pid
core 文件名要添加 pid 作为后缀,不然会相互覆盖。
4 汇总
# /etc/sysctl.d/zzz-mysysctl.conf fs.nr_open=2000000 fs.file-max=2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_fin_timeout = 30 net.ipv4.ip_local_port_range = 2048 65000 net.ipv4.tcp_rmem = 4096 32768 262142 net.ipv4.tcp_wmem = 4096 32768 262142 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 net.core.netdev_max_backlog = 81920 net.core.somaxconn = 262144 net.ipv4.tcp_window_scaling = 1 kernel.core_uses_pid = 1
# /etc/security/limits.conf * soft nofile 600000 * hard nofile 600000
有的系统有个文件夹 /etc/security/limits.d/
,可以把 limits.conf
的配置内容写到 /etc/security/limits.d/90-nproc.conf
里。