TL;DR
echo -e "net.core.default_qdisc=fq\nnet.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf && echo -e "* soft nofile 65535\n* hard nofile 65535\nroot soft nofile 65535\nroot hard nofile 65535" | sudo tee -a /etc/security/limits.conf && sysctl -p
请注意:部分配置需要重新启动服务或重新登录才能应用,若要确保完全应用,重启是最简单的方法。
这一调优适用于面向公开网络环境的Web服务器、反向代理、CDN节点等需要处理大量并发连接的应用,对于纯内网、低延迟、无丢包环境,这些内核配置的优势并不明显。
本文中的命令和配置文件路径在主流的Linux发行版(如 Ubuntu, Debian 等)上通用。在其他系统上,路径可能略有差异,但优化原理是相同的。
命令解析
这是一个由三个&&
组成的命令,只有上一个命令正确执行,下一个命令才会执行。
- 配置网络内核参数
echo -e "net.core.default_qdisc=fq\nnet.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
使用root权限向/etc/sysctl.conf
写入以下配置内容:
net.core.default_qdisc=fq
,指示内核启用fq (Fair Queue)网络队列算法,它能更公平地处理数据包,降低排队延迟。net.ipv4.tcp_congestion_control=bbr
,指示内核启用bbr (Bottleneck Bandwidth and Round-trip propagation time)TCP拥塞控制算法,BBR
是Google开发的一种算法,它不依赖丢包来判断网络拥塞,而是通过测量网络的带宽和往返延迟来调节发送速率。
BBR算法需要Linux内核版本至少为4.9或更高,可以通过执行uname -r
检查内核版本。
- 提高文件句柄数限制
echo -e "* soft nofile 65535\n* hard nofile 65535\nroot soft nofile 65535\nroot hard nofile 65535" | sudo tee -a /etc/security/limits.conf
使用root权限向/etc/security/limits.conf
写入以下配置内容:
* soft nofile 65535
,为所有用户(*) 配置65535的最大文件句柄数软限制,即每个进程能打开的最大文件句柄数为65535。* hard nofile 65535
,为所有用户(*) 配置65535的最大文件句柄数硬限制,对于非root用户,可以在硬限制范围内调节自己的软限制。root soft nofile 65535
与root hard nofile 65535
,出于安全考虑,由通配符*
或用户组@groups
指定的软硬限制不会影响root用户,若要为root用户也启用这一限制,必须显式地为root用户启用同样的限制值。
在 Linux 系统中,每一个网络连接套接字都会占用一个文件句柄。因此,提高最大文件句柄数的限制,等同于提高了服务器处理并发连接的能力。
- 立刻应用网络内核参数改动
sysctl -p
指示网络内核立刻应用参数改动
对于文件句柄数的调节,需要用户重新登录才能应用,对于任何已经启动的服务或者程序,重启它们就能修改,但最简单的方法依然是进行一次完全重启:sudo reboot
。
效果检查
可执行以下命令检查是否正确应用:
$ sudo sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
$ sudo sysctl net.core.default_qdisc
net.core.default_qdisc = fq
$ ulimit -n
65535
若输出是这一值,说明应用成功。
关于 systemd 服务的特别说明
对于由 systemd
管理的系统服务(如 Nginx),直接修改 /etc/security/limits.conf
可能无法生效。systemd
通过自己的配置文件来管理服务的资源限制。
你可以通过修改 /etc/systemd/system.conf
和 /etc/systemd/user.conf
文件来全局提高 systemd
服务的限制:
[Manager]
DefaultLimitNOFILE=65535
修改后,需要执行 sudo systemctl daemon-reexec
并重启相关服务才能生效。
更推荐的做法是为特定的服务创建覆盖配置,例如为 Nginx 服务提高限制:
- 创建目录:
sudo mkdir -p /etc/systemd/system/nginx.service.d/
- 创建配置文件:
sudo nano /etc/systemd/system/nginx.service.d/override.conf
- 写入以下内容
[Service]
LimitNOFILE=65535
- 重新加载配置并重启服务:
sudo systemctl daemon-reload && sudo systemctl restart nginx
这样可以更精确地控制每个服务的资源,也是现代 Linux 系统管理中更规范的做法。