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