2009-11-02 85 views
8

我想知道是否有一種有效的解決方案來監控Linux中的進程資源消耗(CPU,內存,網絡帶寬)。我想在C++中編寫一個守護進程,爲一些給定的PID執行此監視。據我所知,經典的解決方案是定期讀取/ proc中的信息,但這似乎並不是最有效的方式(它涉及很多系統調用)。例如,要監視50個進程每秒的內存使用情況,我必須每秒從/ proc打開,讀取和關閉50個文件(即150個系統調用)。更不用說在閱讀這些文件時涉及的解析。Linux中每個進程的編程資源監控

另一個問題是網絡帶寬消耗:對於我想要監視的每個進程,這不能輕鬆計算出來。 NetHogs採用的解決方案涉及到相當高的開銷,我認爲它使用libpcap捕獲和分析每個數據包,然後爲每個數據包確定本地端口並在/ proc中搜索以查找相應的進程。

你知道是否有更有效率的替代方法提出這些方法或任何庫處理這個問題?

回答

5

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstats是按任務和 每個進程的統計數據發送從內核到用戶空間的基於網絡鏈路的接口。

Taskstats是專爲以下好處:

  • 任務的一生中,並在其退出
  • 統一的接口,用於多個會計子系統
  • 可擴展性以供未來會計補丁
  • 高效地提供統計數據

此界面,可以監控CPU,內存和I/O使用您選擇的過程。您只需在單個套接字上設置和接收消息。

這不區分(例如)磁盤I/O與網絡I/O。如果這對你很重要,你可以使用跟蹤套接字操作的攔截庫。假設你可以控制你希望觀察的節目的啓動,當然,他們不會在背後做詭計。

我想不出任何重量輕的解決方案,如果這些仍然失敗,但linux-audit可在全球跟蹤系統調用,這似乎是一個公平的位比重新捕捉更直接和分析你自己的網絡流量。

+0

taskstats只包含磁盤I/O,不包括網絡和磁盤 – tuxx 2009-11-03 20:27:05

+0

糾正:taskstats只監視讀/寫系統調用,而不是recv/send和朋友(但是這個可以在內核中輕鬆修改)。不管怎麼說,還是要謝謝你。這似乎是迄今爲止最好的解決方案。 – tuxx 2009-11-04 17:40:22

2

看看linux跟蹤工具包(LTTng)。它將跟蹤點插入到內核中,並進行一些後處理,以獲取您所詢問的某種統計信息。如果捕獲所有內容,跟蹤文件會變得很大,但如果限制您所設置的事件類型,則可以保持可管理性。

http://lttng.org的詳細信息...

2

關於網絡帶寬:This Superuser answer描述處理的/ proc /淨/ TCP收集網絡帶寬的使用。

我知道iptables可以用來做網絡記帳。,LWN's,Linux.com'sShorewall's文章),但我沒有看到任何實際的方法來做每個進程的會計。

0

讀取/ proc最終是監視單個進程的CPU和內存使用情況的唯一方法,無需將代碼注入內核。如果你看看top(1),你會發現在/ proc中讀取大量文件正是它每秒所做的。所有檢索這類信息的用戶模式工具和庫都必須從/ proc中獲取。

與網絡帶寬使用情況一樣,有幾種方法,這些方法或多或少都歸結爲捕獲所有網絡內外的流量。你也可以考慮編寫一個特殊的netfilter(iptables)模塊,它可以完成你需要的計數類型,而不需要流量捕獲的開銷。

0

我剛剛遇到這個,因爲我正在尋找同樣的事情的答案。只是一個註釋 - 當使用/ proc文件系統時,您不必在每次讀取後關閉文件。你可以保持文件的打開狀態,每次你閱讀時你都會得到新的統計數據...所以,你不應該在每次你想獲得統計數據時都要打開和關閉的開銷......我有這個工作javascript on node.js如果你想要一個例子...