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 filesConnection 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/somaxconncat /proc/sys/fs/file-max
临时扩大限制 echo 1024 > /proc/sys/net/core/somaxconnulimit -n 65535
永久扩大限制 修改 /etc/sysctl.conf/etc/security/limits.conf,重启服务
验证调整 sysctl <参数>cat /proc/<PID>/limits

通过以上步骤,可有效检查并扩大Linux系统的TCP连接限制,避免因资源不足导致的服务异常。

posted @ 2025-11-11 19:06  蓝迷梦  阅读(61)  评论(0)    收藏  举报