在Linux內核 2.6.16中引入了一個系統內存接口特性,這個接口位於/proc/$pid/目錄下的smaps文件中 ,一看內容發現是進程內存映像信息,比同一目錄下的maps文件更詳細些。
cat /proc/1/smaps
這里解釋下samps里面的內容:
bfdca000-bfddf000 是該虛擬內存段的開始和結束位置
rw-p 內存段的權限,rw是指可讀寫,p是指私有,如果是s則為共享
bffea000 該虛擬內存段在對應的映射文件中的偏移量
00:00 文件的主設備和次設備號
0 被映射到虛擬內存的文件的索引節點號
[stack] 被映射到虛擬內存的文件名稱
Size 是進程使用內存空間,並不一定實際分配了內存(VSS)
Rss是實際分配的內存(不需要缺頁中斷就可以使用的)
Shared_Clean 和其他進程共享的未改寫頁面
Shared_Dirty 和其他進程共享的已改寫頁面
Private_Clean 未改寫的私有頁面頁面
Private_Dirty 已改寫的私有頁面頁面
Swap 存在於交換分區的數據大小(如果物理內存有限,可能存在一部分在主存一部分在交換分區)
Pss是平攤計算后的使用內存(有些內存會和其他進程共享,例如mmap進來的)
這里能顯示出swap
那么查看你想要看的進程所使用的swap只需要:
awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps
awk '/^Swap:/ {SWAP+=$2}END{if(SWAP != 0) print SWAP" KB"}' /proc/99579/smaps
function getswap { SUM=0 OVERALL=0 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do PID=`echo $DIR | cut -d / -f 3` PROGNAME=`ps -p $PID -o comm --no-headers` for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` do let SUM=$SUM+$SWAP done echo "PID=$PID - Swap used: $SUM - ($PROGNAME )" let OVERALL=$OVERALL+$SUM SUM=0 done echo "Overall swap used: $OVERALL" } getswap
參考:
https://blog.csdn.net/xiangliangyu/article/details/8213127