日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Used内存到底哪里去了?

發布時間:2025/3/15 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Used内存到底哪里去了? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創文章,轉載請注明:?轉載自系統技術非業余研究

本文鏈接地址:?Linux Used內存到底哪里去了?

前幾天 純上 同學問了一個問題:

我ps aux看到的RSS內存只有不到30M,但是free看到內存卻已經使用了7,8G了,已經開始swap了,請問ps aux的實際物理內存統計是不是漏了哪些內存沒算?我有什么辦法確定free中used的內存都去哪兒了呢?

這個問題不止一個同學遇到過了,之前子嘉同學也遇到這個問題,內存的計算總是一個迷糊賬。 我們今天來把它算個清楚下!

通常我們是這樣看內存的剩余情況的:

$free?-m
?????????????total?????? used???????free?????shared??? buffers???? cached
Mem:???????? 48262?????? 7913????? 40349????????? 0???????? 14??????? 267
-/+ buffers/cache:?????? 7631????? 40631
Swap:???????? 2047??????? 336?????? 1711

那么這個信息是如何解讀的呢,以下這個圖解釋的挺清楚的!

補充(不少人反映圖不清晰,請參考:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf P46-47)

上面的情況下我們總的內存有48262M,用掉了7913M。 其中buffer+cache總共14+267=281M, 由于這種類型的內存是可以回收的,雖然我們用掉了7913M,但是實際上我們如果實在需要的話,這部分buffer/cache內存是可以放出來的。

我們來演示下:

$?sudo?sysctl vm.drop_caches=3
vm.drop_caches = 3
$?free?-m
?????????????total?????? used???????free?????shared??? buffers???? cached
Mem:???????? 48262?????? 7676????? 40586????????? 0????????? 3???????? 41
-/+ buffers/cache:?????? 7631????? 40631
Swap:???????? 2047??????? 336?????? 1711

我們把buffer/cache大部分都清除干凈了,只用了44M,所以我們這次used的空間是7676M。
到現在我們比較清楚幾個概念:
1. 總的內存多少
2. buffer/cache內存可以釋放的。
3. used的內存的概率。

即使是這樣我們還是要繼續追查下used的空間(7637M)到底用到哪里去了?

這里首先我們來介紹下nmon這個工具,它對內存的使用顯示比較直觀。

使用的內存的去向我們很自然的就想到操作系統系統上的各種進程需要消耗各種內存,我們透過top工具來看下:

通常我們會看進程的RES這一項,這項到底是什么意思呢?這個數字從哪里出來的呢? 通過strace對top和nmon的追蹤和結合源碼,我們確定這個值是從/proc/PID/statm的第二個字段讀取出來的.
那這個字段什么意思呢?
man proc或者http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html 會詳細的解釋/proc/下的文件的具體意思,我們摘抄下:

/proc/[pid]/statm
Provides information about memory usage, measured in pages. The
columns are:

size total program size
(same as VmSize in /proc/[pid]/status)
resident resident set size
(same as VmRSS in /proc/[pid]/status)
share shared pages (from shared mappings)
text text (code)
lib library (unused in Linux 2.6)
data data + stack
dt dirty pages (unused in Linux 2.6)

resident set size 也就是每個進程用了具體的多少頁的內存。由于linux系統采用的是虛擬內存,進程的代碼,庫,堆和棧使用的內存都會消耗內存,但是申請出來的內存,只要沒真正touch過,是不算的,因為沒有真正為之分配物理頁面。

我們實際進程使用的物理頁面應該用resident set size來算的,遍歷所有的進程,就可以知道所有的所有的進程使用的內存。
我們來實驗下RSS的使用情況:

$?cat?RSS.sh
#/bin/bash??????????????????????????????????????????????????????????????????????????????????????????????????????????????
for?PROC?in?`ls??/proc/|grep?"^[0-9]"`
do
??if?[ -f /proc/$PROC/statm ];?then
??????TEP=`cat?/proc/$PROC/statm |?awk?'{print ($2)}'`
??????RSS=`expr?$RSS + $TEP`
??fi
done
RSS=`expr?$RSS \* 4`
echo?$RSS"KB"
$ ./RSS.sh?
7024692KB

從數字來看,我們的進程使用了大概7024M內存,距離7637M還有幾百M內存哪里去了? 哪里去了? 貓吃掉了?
我們再回頭來仔細看下nmon的內存統計表。

那個該死的slab是什么呢? 那個PageTables又是什么呢?

簡單的說內核為了高性能每個需要重復使用的對象都會有個池,這個slab池會cache大量常用的對象,所以會消耗大量的內存。運行命令:

$ slabtop

我們可以看到:

從圖我們可以看出各種對象的大小和數目,遺憾的是沒有告訴我們slab消耗了多少內存。
我們自己來算下好了:

$?echo?`cat?/proc/slabinfo |awk?'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'` MB
904.256 MB

好吧,把每個對象的數目*大小,再累加,我們就得到了總的內存消耗量:904M

那么PageTables呢? 我們萬能的內核組的同學現身了:

伯瑜:
你還沒有計算page tables的大小,還有struct page也有一定的大小(每個頁一個,64bytes),如果是2.6.32的話,每個頁還有一個page_cgroup(32bytes),也就是說內存大小的2.3%(96/4096)會被內核固定使用的
含黛:
struct page是系統boot的時候就會根據內存大小算出來分配出去的,18內核是1.56%左右,32內核由于cgroup的原因會在2.3%

好吧,知道是干嘛的啦,管理這些物理頁面的硬開銷,那么具體是多少呢?

$?echo?`grep?PageTables /proc/meminfo |?awk?'{print $2}'` KB
58052 KB

好吧,小結下!內存的去向主要有3個:1. 進程消耗。 2. slab消耗 3.pagetable消耗。
我把三種消耗匯總下和free出的結果比對下,這個腳本的各種計算項仲同學幫忙搞定的:

$?cat?cm.sh
#/bin/bash
for?PROC?in?`ls?/proc/|grep?"^[0-9]"`
do
??if?[ -f /proc/$PROC/statm ];?then
??????TEP=`cat?/proc/$PROC/statm |?awk?'{print ($2)}'`
??????RSS=`expr?$RSS + $TEP`
??fi
done
RSS=`expr?$RSS \* 4`
PageTable=`grep?PageTables /proc/meminfo |?awk?'{print $2}'`
SlabInfo=`cat?/proc/slabinfo |awk?'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'`
?
echo?$RSS"KB", $PageTable"KB", $SlabInfo"MB"
printf?"rss+pagetable+slabinfo=%sMB\n"?`echo?$RSS/1024 + $PageTable/1024 + $SlabInfo|bc`
free?-m
?
$ ./cm.sh
7003756KB, 59272KB, 904.334MB
rss+pagetable+slabinfo=7800.334MB
?????????????total?????? used???????free?????shared??? buffers???? cached
Mem:???????? 48262?????? 8050????? 40211????????? 0???????? 17??????? 404
-/+ buffers/cache:?????? 7629????? 40633
Swap:???????? 2047??????? 336?????? 1711

free報告說7629M, 我們的cm腳本報告說7800.3M, 我們的CM多報了171M。
damn,這又怎么回事呢?

我們重新校對下我們的計算。 我們和nmon來比對下,slab和pagetable的值是吻合的。 那最大的問題可能在進程的消耗計算上。
resident resident set size 包括我們使用的各種庫和so等共享的模塊,在前面的計算中我們重復計算了。

$ pmap `pgrep?bash`
...
22923:?? -bash
0000000000400000??? 848K r-x--? /bin/bash
00000000006d3000???? 40K rw---? /bin/bash
00000000006dd000???? 20K rw---??? [ anon ]
00000000008dc000???? 36K rw---? /bin/bash
00000000013c8000??? 592K rw---??? [ anon ]
000000335c400000??? 116K r-x--? /lib64/libtinfo.so.5.7
...
0000003ec5220000????? 4K rw---? /lib64/ld-2.12.so
0000003ec5221000????? 4K rw---??? [ anon ]
0000003ec5800000?? 1628K r-x--? /lib64/libc-2.12.so
...
0000003ec5b9c000???? 20K rw---??? [ anon ]
00007f331b910000? 96836K r----? /usr/lib/locale/locale-archive
00007f33217a1000???? 48K r-x--? /lib64/libnss_files-2.12.so
...
00007f33219af000???? 12K rw---??? [ anon ]
00007f33219bf000????? 8K rw---??? [ anon ]
00007f33219c1000???? 28K r--s-? /usr/lib64/gconv/gconv-modules.cache
00007f33219c8000????? 4K rw---??? [ anon ]
00007fff5e553000???? 84K rw---??? [ stack ]
00007fff5e5e4000????? 4K r-x--??? [ anon ]
ffffffffff600000????? 4K r-x--??? [ anon ]
?total?????????? 108720K

多出的171M正是共享庫重復計算的部分。
但是由于每個進程共享的東西都不一樣,我們也沒法知道每個進程是如何共享的,沒法做到準確的區分。

所以只能留點小遺憾,歡迎大家來探討。

總結:內存方面的概念很多,需要深入挖掘!

祝玩的開心!

Post Footer automatically generated by?wp-posturl plugin?for wordpress.

Related posts:

  • vmtouch-系統pagecache查看和操縱器
  • Linux下誰在消耗我們的cache
  • BufferedIO和DirectIO混用導致的臟頁回寫問題
  • slabtop簡單的用途
  • Linux系統內存相關信息獲取
  • 總結

    以上是生活随笔為你收集整理的Linux Used内存到底哪里去了?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 91超碰在线观看 | 亚洲制服丝袜在线播放 | 国产精品永久在线观看 | 久久久精品人妻av一区二区三区 | 亚洲4区| 97国产资源| 天堂av手机版 | 白嫩少妇激情无码 | 四虎啪啪| 国产成人啪一区二区 | 久久丫精品久久丫 | 日本乱偷中文字幕 | 性爽爽 | 女仆乖h调教跪趴1v1 | 午夜视频观看 | 黄色理伦 | jzjzjzjzj亚洲成熟少妇 | 天天摸天天做天天爽 | 理论片午午伦夜理片影院99 | 涩涩99 | 影音先锋欧美资源 | 亚洲精品中字 | 久热中文 | 99re在线国产| 99精品一级欧美片免费播放 | 国产麻豆一区 | 天堂最新| 国产一区二区成人 | 西川结衣在线观看 | 国产精品一二三 | 成人污网站 | 欧美a√在线 | 日韩美女中文字幕 | 精品国产欧美一区二区 | 一级做a爰片久久毛片潮喷 天天透天天干 | 日韩一区2区 | 国产欧美一级片 | 亚洲欧美国产精品久久久久久久 | 黄色一级小说 | 成人福利院| 黑人100部av解禁片 | 九一精品视频 | 成人欧美一区二区三区黑人冫 | 丁香色欲久久久久久综合网 | 欧美日韩va | 精品国产一区一区二区三亚瑟 | 亚洲精品9| 91在线在线 | 裸体黄色片 | 日本免费小视频 | 中文写幕一区二区三区免费观成熟 | 国产精品乱码久久久久久 | 调教女m荡骚贱淫故事 | 97成人在线观看 | 91精品视频一区 | 8x8x成人| 毛片内射久久久一区 | 日韩人妻精品一区二区三区 | 国产操| 日韩一级在线观看 | 夜夜春av| 一起草最新网址 | 国内自拍偷拍视频 | 在线免费激情视频 | www一起操| 可以免费看的黄色 | 日韩人妻无码精品综合区 | 免费在线观看的黄色网址 | 亚洲影视一区二区 | 超碰97在线免费 | 日韩欧美成人精品 | 亚洲精品乱码久久久久久蜜桃麻豆 | 国产尤物视频在线观看 | 国产精品久久久久毛片大屁完整版 | 国产69精品久久久 | 一区二区三区黄色录像 | 国产一区二区三区日韩 | 久久人人爽人人爽人人片 | 免费91网站 | 超碰加勒比 | 怡红院成人在线 | 久久99伊人| 日韩av一区二区三区在线 | 日本特级黄色片 | 国产精品熟妇人妻g奶一区 a少妇 | 香蕉av一区二区三区 | 抖音视频在线观看 | 一区二区三区在线免费观看视频 | 日本免费毛片 | av在线官网 | 男生把女生困困的视频 | 国产精品区一区二区三 | 伊人影视大全 | 国产xx视频| 一区二区三区www | 日本久操| 久久久国产打桩机 | 国产女教师一区二区三区 | 欧美夜夜操 |