博客 / Linux/ 关于服务器TCP连接的数量统计命令详解

关于服务器TCP连接的数量统计命令详解

关于服务器TCP连接的数量统计命令详解

一、查看哪些IP连接本机

使用 netstat 命令可以查看当前系统的网络连接状态。

netstat -an

二、查看TCP连接数

1. 统计80端口连接数

此命令统计所有与80端口相关的连接(包括监听、已建立等状态)。

netstat -nat | grep -i "80" | wc -l

2. 统计HTTP服务进程数

此命令统计名为 "httpd" 的进程数量,通常用于 Apache 服务器。

ps -ef | grep httpd | wc -l

3. 统计状态为 "ESTABLISHED" 的连接数

此命令统计所有已建立的 TCP 连接。

netstat -na | grep ESTABLISHED | wc -l

4. 查看连接最多的IP地址

此命令可以找出已建立连接(ESTABLISHED)中,连接数最多的 IP 地址,常用于排查异常连接。

netstat -na | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn

类似地,可以查看处于 SYN 状态的连接来源 IP:

netstat -na | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn

三、Apache服务器相关统计

1. 查看Apache当前并发访问数

此命令统计 Apache 服务的已建立连接数,可与配置文件中的 MaxClients 参数对比。

netstat -an | grep ESTABLISHED | wc -l

2. 查看Apache进程数

以下两个命令均可用于统计 httpd 进程数,适用于 prefork 等模式。

ps aux | grep httpd | wc -l
# 或
ps -ef | grep httpd | wc -l

返回的数字大致表示 Apache 当前能够处理的并发请求数。

3. 查看所有80端口的请求总数

netstat -nat | grep -i "80" | wc -l

4. 查看所有已建立的连接总数

netstat -na | grep ESTABLISHED | wc -l

5. 查看所有建立连接的详细记录

netstat -nat | grep ESTABLISHED

四、查看TCP连接状态分布

一个非常实用的命令,可以统计并列出所有 TCP 连接的状态及其数量。

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

输出示例:

TIME_WAIT 8947
FIN_WAIT1 15
FIN_WAIT2 1
ESTABLISHED 55
SYN_RECV 21
CLOSING 2
LAST_ACK 4

TCP连接状态详解

  • LISTEN: 侦听来自远方的TCP端口的连接请求。
  • SYN-SENT: 在发送连接请求后等待匹配的连接请求。
  • SYN-RECEIVED: 在收到和发送一个连接请求后等待对方对连接请求的确认。
  • ESTABLISHED: 代表一个打开的连接,正在进行正常数据传输。
  • FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认。
  • FIN-WAIT-2: 从远程TCP等待连接中断请求。
  • CLOSE-WAIT: 等待从本地用户发来的连接中断请求。
  • CLOSING: 两边同时尝试关闭,等待远程TCP对连接中断的确认。
  • LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认。
  • TIME-WAIT: 等待足够的时间(2MSL)以确保远程TCP接收到连接中断请求的确认。
  • CLOSED: 没有任何连接状态。

在监控中:

  • SYN_RECV 表示正在等待处理的请求数,过多可能遭遇 SYN 攻击。
  • ESTABLISHED 表示正常数据传输状态的连接数。
  • TIME_WAIT 表示处理完毕,等待超时结束的请求数。大量 TIME_WAIT 可能消耗端口资源。

五、调整系统参数解决大量TIME_WAIT问题

如果系统存在大量 TIME_WAIT 状态的连接,可以通过调整 Linux 内核网络参数来优化。

编辑配置文件:

vim /etc/sysctl.conf

在文件末尾添加或修改以下参数:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1  # 注意:在 NAT 环境下慎用此参数
net.ipv4.tcp_fin_timeout = 30

使配置生效:

sysctl -p

参数说明:

  • net.ipv4.tcp_syncookies = 1: 开启 SYN Cookies,当 SYN 等待队列溢出时,启用 cookies 处理,可防范少量 SYN 攻击。
  • net.ipv4.tcp_tw_reuse = 1: 允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。
  • net.ipv4.tcp_tw_recycle = 1: 开启 TCP 连接中 TIME-WAIT sockets 的快速回收。(警告:在客户端位于 NAT 网络后时,启用此选项可能导致连接问题,新版本内核已弃用或需谨慎评估。)
  • net.ipv4.tcp_fin_timeout: 修改系统默认的 TIME_WAIT 超时时间。

六、如何合理设置Apache的最大连接数

当在线人数增多,访问变慢,但单个连接内的操作流畅时,可能是 Apache 的最大连接数(MaxClients)已满,新访客需要排队。

1. 找到并修改配置

首先,确认 Apache 的工作模式(如 prefork):

apachectl -l

在配置文件 httpd.conf 中,确保包含 MPM 配置:

Include conf/extra/httpd-mpm.conf

然后编辑对应的 MPM 配置块(例如 prefork)。

2. 计算合适的值

最大连接数受服务器内存限制。可以先估算单个 httpd 进程的平均内存占用:

ps aux | grep -v grep | awk '/httpd/{sum+=$6; n++}; END{print sum/n}'

假设结果为 200KB(约 200,000 字节),服务器可用内存为 1.5GB,则理论最大进程数约为:

1.5 * 1024 * 1024 * 1024 / 200000 ≈ 8053

考虑到系统其他开销,可以设置一个保守值,例如 5000。

3. 配置示例 (prefork模式)

StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500        # 必须放在 MaxClients 之前,且值不小于 MaxClients
MaxClients 5000         # 最大并发客户端数
MaxRequestsPerChild 100 # 建议不为0,防止内存泄漏

注意MaxClients 默认最大为 250,若要超过此值,必须显式设置 ServerLimit,且 ServerLimit 必须放在 MaxClients 之前。

4. 重启并观察

重启 Apache 服务后,可以通过以下命令实时观察连接数变化:

watch -n 1 -d "pgrep httpd | wc -l"

watch -n 1 -d "ps aux | grep httpd | wc -l"

观察连接数是否在设定值附近稳定,并根据实际访问压力和内存使用情况逐步调整至最优。

发表评论

您的邮箱不会公开。必填项已用 * 标注。