Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux系統常見問題解答 >> linux下實現監控進程網絡帶寬

linux下實現監控進程網絡帶寬

日期:2017/1/20 17:42:10      編輯: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

Copyright © Windows教程網 All Rights Reserved