1. 程式人生 > >每日一道shell練習(03)

每日一道shell練習(03)

shell 進程 內存

1 . 習題

寫一個腳本計算linux系統所有進程占用內存大小的和

2. 習題分析

2.1.第一個問題,在哪裏收集進程的數據

用top或者ps都可以獲取每個進程的內存使用大小。獲得大小之後,就可以通過一個循環計算它們的和了。

2.2. ps 命令的問題

通過累加 “ps aux” 命令顯示的 RSS 列來統計全部進程總共占用的物理內存大小,這是不對的。因為,RSS(resident set size)表示常駐內存的大小,但是由於不同的進程之間會共享內存,所以把所有進程RSS進行累加的方法會重復計算共享內存,得到的結果是偏大的。

2.3. 應該如何獲取正確的使用內存

正確的方法是累加 /proc/[0-9]*/smaps 中的 Pss 。/proc/<pid>/smaps 包含了進程的每一個內存映射的統計值,詳見proc(5)的手冊頁。Pss(Proportional Set Size)把共享內存的Rss進行了平均分攤,比如某一塊100MB的內存被10個進程共享,那麽每個進程就攤到10MB。這樣,累加Pss就不會導致共享內存被重復計算了。

3. 習題答案

grep  Pss  /proc/[0-9]*/smaps | awk ‘{sum+=$2};END{print sum}‘
69275

【分析】

  1. grep 命令可以遍歷目錄裏的文件,然後將符合匹配字符的行抓取出來;
  2. awk 命令遍歷grep 輸出的結果,統計進程使用內存的和。
  3. 在 /proc 目錄下,有很多和進程有關的數據,讀者可以自己去研究一下。

需要註意的是,全部進程占用的內存並不等於 free 命令所顯示的 “used memory”,因為“used memory”不僅包含了進程所占用的內存,還包含cache/buffer以及kernel動態分配的內存等等。

每日一道shell練習(03)