Jason Koo

      Stay hungry, Stay foolish!

导航

NetHogs安装总结

Posted on 2013-09-21 16:40  Jason Koo  阅读(3218)  评论(0编辑  收藏  举报

最近,在实验中需要一个工具来记录当前系统中每一个进程网络I/O的情况。通过网上搜索,只找到了NetHogs这个工具。

在Ubuntu系统下用下面的命令就可以安装NetHogs:

sudo apt-get install nethogs

运行nethogs需要根用户权限,可以使用下面的命令来运行nethogs:

sudo nethogs

我们希望使用这个工具来记录某一程序运行期间该程序的网络I/O量。具体来说,我们希望在程序运行期间,每隔一秒中记录一次当前时刻下该程序发送和接收的数据累积量,将记录存放在文件中,留待以后分析。但是NetHogs是一个交互式工具,它使用了ncurses工具包在屏幕上刷新输出结果。它并没有提供一个像iotop工具中的-b一样参数用于关闭交互式输出。由于没有其他可以替代的工具,我们下载了NetHogs的源代码,并对其进行了修改,手动安装在了每台机器上。

我们首先从NetHogs的项目网站http://sourceforge.net/projects/nethogs/?source=directory下载了其源代码文件包nethogs-0.8.0.tar.gz,然后解压修改源代码。

下面列举了修改的主要部分。

1. 修改默认viewMode

我们希望记录网络输入输出数据量,而不是数据速率,所以我们将cui.cpp文件中第32行由int viewMode = VIEWMODE_KBPS改为int viewMode = VIEWMODE_TOTAL_KB。

2. 修改cui.cpp文件中的类Line中的show函数

主要是将该函数中的所有mvprintw输出改为了std:cout输出,同时添加了输出时的时间列。

3. 修改cui.cpp文件中的函数do_refresh

首先注释掉了函数开头部分对屏幕row和col的计算和判断,只保留了proglen参数。

还注释掉了caption、header和最后汇总信息的输出。

4. 修改nethogs.cpp中的main函数

主要是注释掉了对函数init_ui()和ui_tick()的调用。

5. 修改了inode2prog.cpp文件中的getprogname函数

该函数的作用是将进程ID转换为进程的名字(启动该进程时输入的命令名称),实现的原理是通过传入的进程ID构造文件路径/proc/ID/cmdline,文件cmdline中就保存了进程ID对应的进程名称及启动时的参数。NetHogs的最初实现只是输出了进程名称,对于启动该进程时传给该进程的参数并未输出,我们希望输出后面的参数以更加清晰地区分同一命令下不同进程。值得注意的是,cmdline文件中的内容的格式是:cmd-name\0arg1\0arg2\0...,命令名和参数以及参数与参数之间是通过字符'\0'来分隔的。当将该文件的内容读出并存放在一个字符串中时,由于字符串默认是以'\0'作为结束的,所以输出的内容只有cmd-name,后面由于遇到了'\0',因而默认字符串结束了。

NetHogs实现中没有考虑上述情况,我在getprogname函数中作了修改,将分隔符由'\0'改为了空格,这样就能输出cmdline的全部内容了。

 

修改后需要手动编译安装修改后的NetHogs版本。具体步骤如下:

使用如下命令安装NetHogs依赖包:

sudo apt-get install libpcap-dev libncurses5-dev

在NetHogs的根目录下编译并安装修改后的NetHogs,命令如下:

make

make install

如果修改源代码没有错误,编译应该成功,并且能成功安装。

安装好后就可以使用下面的命令来运行并保存NetHogs的输出到文件中:

sudo nethogs >> nethogs.log