TCP 连接占用情况
在Linux系统中,检查TCP连接是否占满(即达到系统或进程限制)并扩大相关限制,需分步骤进行。以下是详细操作指南:
一、检查TCP连接是否占满
1. 查看当前TCP连接总数
ss -tun | wc -l
# 或
netstat -tun | wc -l
- 作用:统计所有TCP连接数(包括监听和非监听状态)。
- 对比参考值:
- 若连接数接近系统或进程限制(见下文),则可能占满。
2. 检查系统级限制
(1) 内核参数 net.core.somaxconn
cat /proc/sys/net/core/somaxconn
- 作用:定义单个监听套接字(Socket)的最大排队连接数(默认通常为
128)。 - 若占满表现:
- 应用日志报错
Too many open files或Connection refused。 ss -l | grep LISTEN显示Recv-Q值接近somaxconn。
- 应用日志报错
(2) 全局文件描述符限制
cat /proc/sys/fs/file-max
- 作用:系统允许打开的最大文件描述符数(包括TCP连接、文件等)。
- 检查当前使用量:
cat /proc/sys/fs/file-nr | awk '{print $1}' # 已分配的文件描述符数
3. 检查进程级限制
(1) 单进程最大连接数
ulimit -n # 当前用户的限制
cat /proc/<PID>/limits | grep "Max open files" # 指定进程的限制
- 若占满表现:
- 进程日志报错
Can't open so many files。 lsof -p <PID> | wc -l显示接近限制值。
- 进程日志报错
(2) 进程实际连接数
lsof -p <PID> | grep TCP | wc -l # 统计某进程的TCP连接数
二、扩大TCP连接限制
1. 临时调整(重启失效)
(1) 修改 somaxconn(系统级)
echo 1024 > /proc/sys/net/core/somaxconn
# 或使用 sysctl(永久生效需写入配置文件)
sysctl -w net.core.somaxconn=1024
(2) 修改 file-max(系统级)
echo 1000000 > /proc/sys/fs/file-max
sysctl -w fs.file-max=1000000
(3) 调整进程文件描述符限制
ulimit -n 65535 # 仅对当前会话有效
2. 永久调整(需写入配置文件)
(1) 修改 /etc/sysctl.conf
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
sysctl -p # 生效配置
(2) 修改 /etc/security/limits.conf(进程级)
# 针对所有用户或特定用户(如nginx)
* soft nofile 65535
* hard nofile 65535
nginx soft nofile 65535
nginx hard nofile 65535
- 生效方式:重新登录用户或重启系统。
(3) 针对Systemd服务(如Nginx、MySQL)
# 编辑服务配置文件(如 /etc/systemd/system/nginx.service)
[Service]
LimitNOFILE=65535
# 重新加载配置并重启服务
systemctl daemon-reload
systemctl restart nginx
三、验证调整结果
1. 检查内核参数
sysctl net.core.somaxconn
sysctl fs.file-max
2. 检查进程限制
cat /proc/<PID>/limits | grep "Max open files"
ulimit -n # 当前用户
3. 压力测试(可选)
使用工具如 ab(Apache Benchmark)或 wrk 模拟高并发连接,观察是否报错:
ab -n 10000 -c 100 http://localhost/ # 测试HTTP服务
四、常见问题排查
1. 连接数仍不足
- 原因:
- 防火墙(如
iptables/nftables)限制了连接速率。 - 网络设备(如负载均衡器)有连接数限制。
- 防火墙(如
- 解决:
iptables -L -n -v # 检查防火墙规则
2. 端口耗尽
- 现象:
ss -tunap显示大量TIME_WAIT状态连接。 - 解决:
- 调整内核参数加速端口复用:
sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recycle=1 # 注意:在NAT环境下可能有问题 - 增加可用端口范围:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
- 调整内核参数加速端口复用:
总结
| 步骤 | 命令/操作 |
|---|---|
| 检查连接总数 | ss -tun | wc -l |
| 查看系统限制 | cat /proc/sys/net/core/somaxconn、cat /proc/sys/fs/file-max |
| 临时扩大限制 | echo 1024 > /proc/sys/net/core/somaxconn、ulimit -n 65535 |
| 永久扩大限制 | 修改 /etc/sysctl.conf 和 /etc/security/limits.conf,重启服务 |
| 验证调整 | sysctl <参数>、cat /proc/<PID>/limits |
通过以上步骤,可有效检查并扩大Linux系统的TCP连接限制,避免因资源不足导致的服务异常。
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/19211337

浙公网安备 33010602011771号