每日一道shell練習(03)
阿新 • • 發佈:2018-04-11
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
【分析】
- grep 命令可以遍歷目錄裏的文件,然後將符合匹配字符的行抓取出來;
- awk 命令遍歷grep 輸出的結果,統計進程使用內存的和。
- 在 /proc 目錄下,有很多和進程有關的數據,讀者可以自己去研究一下。
需要註意的是,全部進程占用的內存並不等於 free 命令所顯示的 “used memory”,因為“used memory”不僅包含了進程所占用的內存,還包含cache/buffer以及kernel動態分配的內存等等。
每日一道shell練習(03)