首页 > 代码库 > linux下实现监控进程网络带宽
linux下实现监控进程网络带宽
嗯,最近都在网易游戏实习,所以貌似有段时间没有上来写点东西了。。。来网易游戏实习最主要的目的其实就是想知道在游戏公司里面工作都是些什么内容,毕竟自己以前也没有接触过游戏公司。。还比较的好奇。。。
以前可能觉得游戏公司各种高大上吧,做的工作各种有意思。。现在看来应该也不是这样子的,毕竟大多数时间应该还是在写游戏的逻辑代码了。。。
挺奇怪的。。。感觉虽然在游戏公司实习,但是做的事情还是自己的老本行。。。因为要用python开发一个服务器的监控系统,而且有提出要监控某个指定进程所占用的网络带宽的情况。。。嗯。。找来找去python没有现成的东西来做这件事情。。而且本身可以用的东西都比较少。。。
不过倒是找到了类似的东西。。。nethogs。。。一个专门用于linux下监控各个进程的网络带宽的程序。。。
所以就直接看了下他的代码实现。。。代码不是很多吧。。。c++写的。。。而且很简单。。。这里就不具体的说这部分的代码了。。。直接来说一下功能实现的原理吧。。。。
嗯,比较重要的一个目录:/proc
嗯,其实它是一个伪目录吧,因为它并不存在于实实在在的文件系统当中,而是一个运行时创建的目录,而且保存的信息也都是一些运行时的信息,例如进程信息,网络连接信息什么的。。。
好,现在假设我们有一个进程,它的PID 是 7140,那么我们可以进入如下目录:
/proc/7140/fd
其实这里看名字就大概能够猜到这个目录下保存的都是什么数据吧:当前进程所打开的文件描述符。。。如下图:
嗯,这个应该很熟悉吧。。。稍微了解一点linux下面编程的就应该知道,在程序中,我们的socket,或者打开文件都是对应着一个文件描述符,那么上述的目录中就保存了我们程序运行中文件描述符的情况。。然后这些其实又都是链接,最终连接到一个inode上面。。。在这里可以看到我们两个socket都对应着23045以及23046这两个inode。。。。
那么我们如何在找到上述这两个socket的具体的信息呢。。。?
嗯,在终端输入如下命令:cat /proc/net/tcp
我们可以得到的输出如下图:
这里就是当前本机所建立的所有的tcp的信息。。。ip地址,端口啥的。。。最后我们还可以看到一个项目:inode。。。也就是这个链接它所关联的inode。。。
到这里就应该能够将前面所看到的进程的文件描述符与它具体的链接信息对应起来了吧。。。
好啦。。。通过上面的过程呢。。我们可以获取一个进程它所建立的所有的连接的信息了。。。
那么接下来一步就是如何来计算它的网络流量情况了。。。
嗯,这里nethogs 采用的方法是利用libcap来抓包,然后对网络包进行分析,从而来计算每一个连接它的网络流量情况。。。(嗯,好多代码都是直接采用的nethogs的源代码)
嗯,这里就不具体的来列出实现的代码了。。
用c++以及libcap为python写了一个linux下面的扩展库。。。代码传到了github上面。。。地址如下:
https://github.com/2225377fjs/processNet
点击打开链接