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 里。


By .