排查性能缓慢问题:有效使用 'netstat' 和 'ss'

掌握 essential 的 Linux 网络工具 `netstat` 和 `ss`,以实现高效的性能故障排除。本指南将比较传统的 `netstat` 与现代、更快的 `ss` 实用程序,并提供实用的命令示例。了解如何根据连接状态过滤结果、识别正在侦听的服务,并使用 Netlink 套接字统计信息快速诊断网络瓶颈。

38 浏览量

慢性能故障排除:有效使用 'netstat' 和 'ss'

在诊断 Linux 系统上应用程序性能缓慢或意外连接行为时,网络堆栈通常是首要排查对象。理解已建立、监听和瞬时连接对于识别瓶颈、恶意进程或安全异常至关重要。过去,管理员 heavily 依赖 netstat 工具。然而,现代 Linux 发行版更倾向于更快、功能更丰富的 ss(套接字统计)工具。

本指南将对 netstatss 进行全面比较,详细说明如何有效使用这两种工具来监控 TCP 和 UDP 套接字、分析连接状态并查明系统上的性能问题。


为何要监控网络套接字?

网络延迟和迟滞通常与连接问题有关,而非 CPU 或内存耗尽。监控套接字有助于管理员回答关键问题,例如:

  • 哪些端口正在主动监听连接?
  • 是否有太多连接停留在 SYN_RECVTIME_WAIT 状态?
  • 哪个进程 (PID) 正在使用特定端口?
  • 是否正在发生意外的出站连接?

通过检查套接字统计信息,您可以快速排除网络配置问题或识别与连接处理相关的资源争用。

传统工具:netstat

netstat 几十年来一直是显示网络连接、路由表、接口统计信息和伪装连接的标准工具。尽管在许多现代系统上已被 ss 弃用,但它仍然广泛可用,并且为资深管理员所熟悉。

常见的 netstat 示例

netstat 一起使用的最常用标志提供了全面概览:

标志 描述
-a 显示所有套接字(监听和非监听)
-n 显示数字地址,而不是尝试解析主机名和服务名(加快输出速度)
-t 显示 TCP 连接
-u 显示 UDP 连接
-l 仅显示监听套接字
-p 显示与套接字关联的 PID/程序名(需要 root 权限)

示例:以数字形式查看所有活动的 TCP 连接

sudo netstat -ant

示例:查找在端口 80 (HTTP) 上监听的内容

sudo netstat -antlp | grep ':80'

理解连接状态 (netstat)

netstat 的输出通常包含一个 State 列。需要关注的关键状态包括:

  • LISTEN: 等待传入连接。
  • ESTABLISHED: 一个活动、开放的连接。
  • TIME_WAIT: 套接字在关闭后等待一小段时间,以确保处理延迟的数据包。
  • SYN_RECV: 等待三次握手的最终确认(如果过多,可能表明存在 SYN 洪水攻击)。

关于 netstat 的警告netstat 通常依赖于解析 /proc/net/* 文件,这可能很慢,尤其是在具有大量活动连接(数千个)的系统上。这是 ss 开发的主要原因。

现代替代品:ss(套接字统计)

ss 工具比 netstat 快得多,因为它使用 Netlink 套接字直接从内核空间检索套接字信息,绕过了较慢的文件系统查找。

常见的 ss 示例

ss 的标志结构与 netstat 非常相似,便于轻松过渡:

| 标志 | 描述 |
| :--- | :--- |\
| -a | 显示所有套接字 |\
| -n | 显示数字地址 |\
| -t | 显示 TCP 套接字 |\
| -u | 显示 UDP 套接字 |\
| -l | 显示监听套接字 |\
| -p | 显示进程信息 (PID/程序) |

示例:以数字形式查看所有活动的 TCP 连接(等同于 netstat -ant

ss -ant

示例:查找在端口 443 (HTTPS) 上监听的内容

sudo ss -antlp | grep ':443'

ss 的高级过滤

ss 的最大优势之一是它能够直接对连接状态进行过滤,这比将 netstat 输出通过管道传递给 grep 效率高得多。

按连接状态过滤

您可以直接在 ss 命令中使用 state 选项。这对于诊断连接堆积非常有用。

查找所有当前处于 TIME-WAIT 状态的套接字:

ss -s state time-wait

查找所有处于 SYN-SENT 状态的套接字(客户端等待服务器响应):

ss -s state syn-sent

按端口或地址过滤

按目标或源地址/端口过滤非常简单:

显示目标端口为 22 (SSH) 的已建立连接:

ss -tn state established '( dport = :22 or sport = :22 )'

显示与特定本地 IP 地址相关的连接:

ss -ant '( daddr = 192.168.1.100 or saddr = 192.168.1.100 )'

性能分析:netstatss 比较

故障排除时,工具的选择通常归结为速度和细节。

| 特性 | netstat | ss |
| :--- | :--- | :--- |\
| 速度 | 较慢(读取文件) | 快得多(使用 Netlink 套接字) |\
| 语法 | 成熟,文档丰富 | 类似标志,更新的特定选项 |\
| 过滤 | 需要通过管道传递给 grep | 原生支持状态和地址过滤 |\
| 信息深度 | 适用于基础信息 | 更多套接字缓冲区大小详情(TCP 信息) |\
| 可用性 | 几乎通用 | 现代 Linux 发行版标配 |

诊断连接建立缓慢问题

如果客户端报告连接缓慢,请检查是否有套接字停留在等待握手状态。使用 ss 是确定此问题的最快方法:

  1. 检查高 SYN-RECV 计数: 这表明服务器正在接收连接请求但未完成握手,通常是由于资源耗尽或高流量负载。
    bash ss -s | grep syn-rec
  2. 检查高 SYN-SENT 计数: 如果服务器本身正在发起大量连接(例如,作为数据库或其他 API 的客户端),这表明它正在等待响应。
    bash ss -s | grep syn-sent

如果您在任一类别中看到异常高的数字,则发起这些连接的应用程序可能面临网络延迟或防火墙问题。

网络故障排除最佳实践

  1. 始终使用 -n:在进行性能故障排除或编写脚本时,请使用数字标志 (-n) 以避免 DNS 解析延迟,这可能使诊断变得迟钝。
  2. 优先使用 ss:将 ss 作为您的默认工具。仅在 ss 不可用的传统系统上保留 netstat
  3. 以 Root 身份运行以获取 PID:要查看哪个程序正在使用端口,通常在使用这两个工具的 -p 标志时需要 sudo 或 root 权限。
  4. 检查接口统计信息:不要忘记接口计数器。使用 ip -s link show <interface_name> 检查丢包或错误,这可能表明是物理层问题而不是套接字问题。

通过掌握 ss 的现代功能并理解 netstat 提供的基础背景,系统管理员可以深入了解任何 Linux 主机的网络状态,从而显著加快性能诊断速度。