簡體   English   中英

Linux中每個進程的程序化資源監視

[英]Programmatic resource monitoring per process in Linux

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

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

您是否知道這些方法是否有更有效的替代方案或任何處理此問題的庫?

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

Taskstats是一個基於netlink的接口,用於從內核向用戶空間發送每個任務和每個進程的統計信息。

Taskstats旨在實現以下好處:

  • 在任務的生命周期和退出時有效地提供統計信息
  • 多個會計子系統的統一接口
  • 未來會計補丁使用的可擴展性

此界面允許您根據您選擇的進程監控CPU,內存和I / O使用情況。 您只需在單個套接字上設置和接收消息。

這不區分(例如)磁盤I / O與網絡I / O. 如果這對您很重要,您可能會使用跟蹤套接字操作的LD_PRELOAD攔截庫。 當然,假設你可以控制你想要觀察的程序的啟動,並且它們不會在背后詭計。

如果那些仍然失敗,我想不出任何輕量級的解決方案,但是linux-audit可以全局跟蹤系統調用,這似乎比重新捕獲和分析自己的網絡流量更直接。

看一下linux trace toolkit(LTTng)。 它將跟蹤點插入到內核中,並進行一些后期處理以獲取您要詢問的某些統計信息。 如果捕獲所有內容,跟蹤文件會變大,但如果限制所設置的事件類型,則可以使事情易於管理。

http://lttng.org了解更多信息......

關於網絡帶寬: 此超級用戶答案描述了處理/ proc / net / tcp以收集網絡帶寬使用情況。

我知道iptables可用於進行網絡計算(例如,參見LWNLinux.comShorewall的文章),但我沒有看到任何實際的方法來進行基於每個進程的計費。

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

與網絡帶寬使用情況一樣,有幾種方法可以或多或少地歸結為捕獲開箱即用的所有網絡流量。 您還可以考慮編寫一個特殊的netfilter(iptables)模塊,它可以完全滿足您所需的計數類型,而無需捕獲流量。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM