<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux Used內(nèi)存到底哪里去了?

          共 4917字,需瀏覽 10分鐘

           ·

          2020-09-06 12:17

          來源:http://blog.yufeng.info/archives/2456

          前言

          前幾天有同學(xué)問了一個(gè)問題:

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

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

          解答

          通常我們是這樣看內(nèi)存的剩余情況的:

          $free?-m

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

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

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

          我們來演示下:

          $?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。

          到現(xiàn)在我們比較清楚幾個(gè)概念:

          • 1、總的內(nèi)存多少
          • 2、buffer/cache內(nèi)存可以釋放的。
          • 3、used的內(nèi)存的概率。

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

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

          使用的內(nèi)存的去向我們很自然的就想到操作系統(tǒng)系統(tǒng)上的各種進(jìn)程需要消耗各種內(nèi)存,我們透過top工具來看下:

          通常我們會看進(jìn)程的RES這一項(xiàng),這項(xiàng)到底是什么意思呢?這個(gè)數(shù)字從哪里出來的呢?通過stracetopnmon的追蹤和結(jié)合源碼,我們確定這個(gè)值是從/proc/PID/statm的第二個(gè)字段讀取出來的.

          那這個(gè)字段什么意思呢?

          man proc 或者 http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html 會詳細(xì)的解釋/proc/下的文件的具體意思,我們摘抄下:

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

          我們實(shí)際進(jìn)程使用的物理頁面應(yīng)該用?resident set size?來算的,遍歷所有的進(jìn)程,就可以知道所有的所有的進(jìn)程使用的內(nèi)存。

          我們來實(shí)驗(yàn)下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

          從數(shù)字來看,我們的進(jìn)程使用了大概7024M內(nèi)存,距離7637M還有幾百M(fèi)內(nèi)存哪里去了?哪里去了?貓吃掉了?

          我們再回頭來仔細(xì)看下?nmon?的內(nèi)存統(tǒng)計(jì)表。

          那個(gè)該死的slab是什么呢?那個(gè)PageTables又是什么呢?

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

          $?slabtop

          我們可以看到:

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

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

          904.256?MB

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

          那么PageTables呢?我們?nèi)f能的內(nèi)核組的同學(xué)現(xiàn)身了:

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

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

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

          58052?KB

          好吧,小結(jié)下!內(nèi)存的去向主要有3個(gè):

          • 1、進(jìn)程消耗。
          • 2、slab消耗
          • 3、pagetable消耗。

          我把三種消耗匯總下和free出的結(jié)果比對下,下面把命令匯合在一起:

          $?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 報(bào)告說?7629M, 我們的cm腳本報(bào)告說?7800.3M, 我們的CM多報(bào)了?171M

          damn,這又怎么回事呢?

          我們重新校對下我們的計(jì)算。我們和nmon來比對下,slab和pagetable的值是吻合的。那最大的問題可能在進(jìn)程的消耗計(jì)算上。

          resident resident set size 包括我們使用的各種庫和so等共享的模塊,在前面的計(jì)算中我們重復(fù)計(jì)算了。

          $?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正是共享庫重復(fù)計(jì)算的部分。

          但是由于每個(gè)進(jìn)程共享的東西都不一樣,我們也沒法知道每個(gè)進(jìn)程是如何共享的,沒法做到準(zhǔn)確的區(qū)分。

          所以只能留點(diǎn)小遺憾,歡迎大家來探討。

          - END -


          ?推薦閱讀?
          Python 自動創(chuàng)建 Grafana 儀表板
          強(qiáng)大的 iptables 在 K8s 中的應(yīng)用剖析

          Python調(diào)用Kubernetes API自動化管理資源

          大型網(wǎng)站技術(shù)架構(gòu)的演進(jìn)之路

          Zabbix 使用微信接收報(bào)警信息

          Shell文本處理三劍客:grep、sed、awk



          點(diǎn)亮,服務(wù)器三年不宕機(jī)

          瀏覽 46
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本最新三级理论无码电影 | 午夜成人在线小电影 麻豆 | 国产一级乱伦视频 | 亚洲色婷婷 | 影音先锋一区二区三区视频特色 |