Contents

在 Linux 上按网络使用情况对进程进行排序

1. 概述

在 Linux 中,进程需要许多资源,如 CPU、RAM 和磁盘空间,但有些进程还占用大量网络带宽资源。例如,视频和音频流、游戏、实时通信、物联网和网络爬虫服务器进程是网络密集型的。

在本教程中,我们将讨论一些工具和方法来监控每个进程的网络使用情况。

2. NetHogs

NetHogs 是一个小型的“net top”工具,它允许监控在 Linux 系统中运行的进程的网络使用情况。**大多数常见的网络监控工具按协议或子网分解流量,相比之下,nethogs按进程对带宽使用进行分组。**因此,这个工具可以很容易地识别和终止那些疯狂运行并突然占用我们带宽的程序。

NetHogs 严重依赖*/proc*,因此大多数功能仅在 Linux 上可用。系统上运行的每个进程在 /proc 目录下都有一个子目录,以进程 ID 或 PID 命名。

2.1.安装

在基于 Debian 的机器中,我们可以:

$ sudo apt install nethogs

它也可以在其他发行版中与其他包管理器一起使用。我们也可以直接在本地机器上从源代码构建和安装,但要执行此操作,我们应该安装开发依赖项、基于文本的界面的ncurses和用于用户级数据包捕获的libpcap 。

2.2. 用法

安装后,我们必须为 root 用户输入sudo nethogs或普通nethogs(没有 root 权限将无法工作):

$ sudo nethogs

此命令显示 PID、用户名、进程、网络接口以及下载和上传速度。最后,我们可以看到发送和接收的总流量是实时排序的。

让我们看一个例子来更清楚地说明:

/uploads/sort_processes_network_usage/1.png

在上面的示例中,当我们执行wget命令时,我们可以看到 PID 为“1066”的wget进程位于列表的顶部。

我们还可以使用*-i*选项来检测网络中每个接口的流量:

$ sudo nethogs wlan0

在上面的示例中,我们可以跟踪wlan0上的流量。我们还可以查看wlan0wlan1的网络带宽:

$ sudo nethogs wlan0 wlan1

此外,我们可以使用*-p*选项在混杂模式下嗅探流量,但不建议这样做:

$ sudo nethogs -p wlan0

同样,使用*-t*选项,我们可以在跟踪模式下看到输出:

$ sudo nethogs -t wlan0

另一个常用的选项是*-d*选项,通过它我们可以提供该工具在屏幕上刷新其统计信息的速率。默认情况下每秒刷新一次输出,在下面的示例中,我们设置了 3 秒的延迟:

$nethogs -d 3

此外,该工具还具有交互式控件:

  • -m:更改显示的带宽单位,如 KB/sec -> KB -> B-> MB
  • -r:按相应流量的大小排序
  • -s:按发送流量的大小排序
  • -q:退出到shell提示符

3. 使用iftopnetstat

我们可以使用iftop 来定位接收最多流量的机器上的 TCP/UDP 端口,然后使用另一个网络实用程序netstat 来定位拥有该端口的进程。

iftop工具是一个开源命令行实用工具,可显示特定接口的当前带宽使用情况。**不幸的是,它不显示正在使用带宽的进程。但是,我们可以使用 netstat,一个显示 TCP 和 UDP 协议统计信息的工具。**通过端口号,我们可以找出导致问题的进程。

3.1.安装

首先,我们应该首先使用我们的包管理器安装libpcaplibncurses库。然后可以使用aptyumdnf或任何其他包管理器轻松安装iftopnet-tools (用于 netstat)

$ sudo apt install iftop

同样,安装net-tools

$ sudo apt install net-tools

3.2. 用法

安装完成后,运行不带任何参数的 iftop 命令来查看默认接口的带宽使用情况,它可能需要sudoroot权限才能在设备上捕获。

让我们使用基本命令及其输出检查网络使用情况:

$ sudo iftop

/uploads/sort_processes_network_usage/2.png

这里它显示了多个时间间隔内发送和接收的字节。在底部,它显示累积发送和接收字节。

我们可以使用*-i*选项指定接口:

$ sudo iftop -i eth0

此命令侦听命名接口上的网络流量,并按主机对显示当前带宽使用情况表。默认情况下,它会根据使用情况对连接进行排序。

我们也可以使用-p*选项查看端口号:*

$ sudo iftop -p

这将显示与其端口的连接列表。例如,如果端口 5432 上的连接正在使用大量带宽,我们可以使用netstat命令轻松找到进程 ID:

$ netstat -ltnup | grep ':5432'
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2357

在这里,我们可以看到,端口 5432 的进程的 PID 为 2357。还有许多其他技术可以从端口中找到 PID,请在此处 了解更多信息。