当服务器有多个api应用,或者网站的时候,会出现网页打不开。但是cpu、内存等都很空闲。这种情况,有可能是网站的文件数设置不正确。
查询服务器支持的TCP连接数:
ulimit -n
默认是1024
需要增加方法:
编辑/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
前面的*,表示任何的用户的连接数都设置这个值
| 项 | 作用 |
|---|
| soft | 进程默认可用上限 |
| hard | soft 的最大允许值 |
确认这个文件存在:
cat /etc/pam.d/common-session | grep pam_limits
如果没有,补一行:
session required pam_limits.so
查询 listen 队列
sysctl net.core.somaxconn
增大 listen 队列 somaxconn:
echo "net.core.somaxconn = 4096" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
查询TCP 半连接队列
sysctl net.ipv4.tcp_max_syn_backlog
echo "net.ipv4.tcp_max_syn_backlog = 4096" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
TIME_WAIT / 短连接复用
echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
如果是2,表示允许 TCP 连接在 TIME_WAIT 状态下,被“更激进地”复用(包括对外主动连接)
比= 1更宽松。
验证 TCP 是否够用
# 查看监听状态
ss -ltn
# 查看 TIME_WAIT 状态
ss -ant | grep TIME-WAIT | wc -l
# 查看当前 fd 限制
root@WIN-V50OVF8TIBU:~# ulimit -Sn
1024
root@WIN-V50OVF8TIBU:~# ulimit -Hn
1048576
ulimit -Sn是当前的bash的文件数限制,与业务无关,ulimit -n 也是。不用管
# 测试 backlog 队列
sudo ss -lntp | grep 5007
查询systemctl的配置情况:
systemctl show --property=DefaultLimitNOFILE --property=DefaultLimitNPROC
systemd 全局默认设置:
编辑文件/etc/systemd/system.conf
设置(或取消注释):
DefaultLimitNOFILE=65535
DefaultLimitNPROC=4096
保存后,重启systemctl
systemctl daemon-reexec
再重启所有业务
一次性查看所有python业务是否正常了:
for pid in $(pidof python); do
echo "=== PID $pid ==="
cat /proc/$pid/limits | grep -E "Max open files|Max processes"
done
查询python进程的状态
ps -o pid,stat,%cpu,cmd -C python