內存free命令的含義 buffers和cache

Free命令的含義

內核或者發行版本不同,輸出內容不一樣,注意一下,這裏是centos7,如果你是centos6,輸出可能不是下面的樣子

[root@master1] ~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        686M         91M        9.0M        1.0G        870M
Swap:            0B          0B          0B

一共六列,含義:

1,total:物理內存實際總量,我機器是2G內存,這裏顯示1.8G,這是因爲進制不同造成的

2,used:已使用的內存,包含了共享內存,不包括緩衝區/緩存

3,free:空閒的內存,還沒有分配,誰都沒有在使用的內存。

這不是說你現在只能有這麼點內存可以使用了,實際上可以使用的內存應該看available的值。有人可能發現free的值很小。這主要是因爲,在Linux系統中有這麼一種思想,內存不用白不用,因此它儘可能的cache和buffer一些數據,以方便下次使用。但實際上這些緩存是可以立刻拿來使用的。

4,shared:共享內存,在linux裏面有很多共享內存,比如一個libc庫,很多程序調用,但在內存中實際只存一份,這個值一般不是很大。共享內存是通過 tmpfs 實現的,所以它的大小也就是 tmpfs 使用的內存大小。tmpfs 其實也是一種特殊的緩存。

5,buff/cache: 緩衝區/緩存,意味着這塊內存是可以回收的,如果現在一個進程需要的內存值大於free的值,也就是說空閒內存快要耗盡的時候,就會觸發緩存回收,以便釋放出內存給急需內存的進程使用。

buffers和cached的區別

通過man free

  • Buffers 是內核緩衝區用到的內存,對應的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是內核頁緩存和 Slab 用到的內存,對應的是 /proc/meminfo 中的 Cached 與 SReclaimable 之和。

man proc定位到meninfo

  • Buffers 是對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大(20MB左右)。這樣,內核就可以把分散的寫集中起來,統-優化磁盤的寫入,比如可以把多次小的寫合併成單次大的寫等等。
  • Cached是從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數據。這樣,下次訪問這些文件數據時,就可以直接從內存中快速獲取,而不需要再次訪問緩慢的磁盤。
  • SReclaimable 是Slab的一部分。Slab 包括兩部分,其中的可回收部分,用SReclaimable記錄;而不可回收部分,用SUnreclaim記錄。

緩存包括兩部分,一部分是磁盤讀取文件的頁緩存,用來緩存從磁盤讀取的數據,可以加快以後再次訪問的速度。另一部分,則是 Slab 分配器中的可回收內存。

緩衝區是對原始磁盤塊的臨時存儲,用來緩存將要寫入磁盤的數據。這樣,內核就可以把分散的寫集中起來,統一優化磁盤寫入。

--------------
cached和buffers都可以讀寫,它們唯一的區別就是一個以裸設備或分區爲背景,一個以文件系統裏的文件爲背景。比如你cat /dev/sda1 > /dev/null,那/dev/sda1的內容進入buffers,如果你cat /opt/test.py > /dev/null,則/opt/test.py的內容進入cached。

通俗理解

cache 是爲了彌補高速設備和低速設備的鴻溝而引入的中間層,最終起到加快訪問速度的作用。而 buffer 的主要目的進行流量整形,把突發的大數量較小規模的 I/O 整理成平穩的小數量較大規模的 I/O,以減少響應次數(比如從網上下電影,你不能下一點點數據就寫一下硬盤,而是積攢一定量的數據以後一整塊一起寫,不然硬盤都要被你玩壞了)。

1、Buffer(緩衝區)是系統兩端處理速度平衡(從長時間尺度上看)時使用的。它的引入是爲了減小短期內突發I/O的影響,起到流量整形的作用。比如生產者——消費者問題,他們產生和消耗資源的速度大體接近,加一個buffer可以抵消掉資源剛產生/消耗時的突然變化。

2、Cache(緩存)則是系統兩端處理速度不匹配時的一種折衷策略。因爲CPU和memory之間的速度差異越來越大,所以人們充分利用數據的局部性(locality)特徵,通過使用存儲系統分級(memory hierarchy)的策略來減小這種差異帶來的影響。

3、假定以後存儲器訪問變得跟CPU做計算一樣快,cache就可以消失,但是buffer依然存在。比如從網絡上下載東西,瞬時速率可能會有較大變化,但從長期來看卻是穩定的,這樣就能通過引入一個buffer使得OS接收數據的速率更穩定,進一步減少對磁盤的傷害。

4、TLB(Translation Lookaside Buffer,翻譯後備緩衝器)名字起錯了,其實它是一個cache.

5 從磁盤讀入的數據有可能被保持在內存的buffer中以便下次快速訪問。

準備從內存中寫入磁盤的數據將首先被放到 內存中的cache中,然後由磁盤中斷程序寫入磁盤

6、available:新進程可用內存的大小。如果你想查看可用內存,直接看available即可,不要看free。

注意一下,available 不僅包含未使用內存,還包括了可回收的緩存,所以一般會比未使用內存更大。不過,並不是所有緩存都可以回收,因爲有些緩存可能正在使用中。公式如下:

available = free + (buff/cache通過一個算法後產生的值)

7,swap:交換分區,在生產環境中swap一般是禁用的。

  • 虛擬內存,包括了進程代碼段、數據段、共享內存、已經申請的堆內存和已經換出的內存等。這裏要注意,已經申請的內存,即使還沒有分配物理內存,也算作虛擬內存。

  • 常駐內存是進程實際使用的物理內存,不過,它不包括 Swap 和共享內存。

  • 共享內存,既包括與其他進程共同使用的真實的共享內存,還包括了加載的動態鏈接庫以及程序的代碼段等。

  • Swap 內存,是指通過 Swap 換出到磁盤的內存。

當然,這些指標中,常駐內存一般會換算成佔系統總內存的百分比,也就是進程的內存使用率。

除了這些很容易想到的指標外,我還想再強調一下,缺頁異常。

在內存分配的原理中,我曾經講到過,系統調用內存分配請求後,並不會立刻爲其分配物理內存,而是在請求首次訪問時,通過缺頁異常來分配。缺頁異常又分爲下面兩種場景。

  • 可以直接從物理內存中分配時,被稱爲次缺頁異常。

  • 需要磁盤 I/O 介入(比如 Swap)時,被稱爲主缺頁異常。

顯然,主缺頁異常升高,就意味着需要磁盤 I/O,那麼內存訪問也會慢很多。

除了系統內存和進程內存,第三類重要指標就是 Swap 的使用情況,比如 Swap 的已用空間、剩餘空間、換入速度和換出速度等。

  • 已用空間和剩餘空間很好理解,就是字面上的意思,已經使用和沒有使用的內存空間。

  • 換入和換出速度,則表示每秒鐘換入和換出內存的大小。

如何優化內存使用

雖然內存的性能指標和性能工具都挺多,但理解了內存管理的基本原理後,你會發現它們其實都有一定的關聯。梳理出它們的關係,掌握內存分析的套路並不難。

找到內存問題的來源後,下一步就是相應的優化工作了。在我看來,內存調優最重要的就是,保證應用程序的熱點數據放到內存中,並儘量減少換頁和交換。

常見的優化思路有這麼幾種。

  1. 最好禁止 Swap。如果必須開啓 Swap,降低 swappiness 的值,減少內存回收時 Swap 的使用傾向。

  2. 減少內存的動態分配。比如,可以使用內存池、大頁(HugePage)等。

  3. 儘量使用緩存和緩衝區來訪問數據。比如,可以使用堆棧明確聲明內存空間,來存儲需要緩存的數據;或者用 Redis 這類的外部緩存組件,優化數據的訪問。

  4. 使用 cgroups 等方式限制進程的內存使用情況。這樣,可以確保系統內存不會被異常進程耗盡。

  5. 通過 /proc/pid/oom_adj ,調整核心應用的 oom_score。這樣,可以保證即使內存緊張,核心應用也不會被 OOM 殺死。

查看佔用內存最高的進程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

或者top (然後按下M,注意這裏是大寫)

記一次Linux系統內存佔用較高得排查

原文:https://yq.aliyun.com/articles/161186?spm=a2c4e.11153959.0.0.385027eea1TvRe

背景:

收到報警,系統的內存使用率觸發閾值(部分圖是後補的)
mem1
1,登陸系統,使用top命令查看內存分配

mem2

free -m

mem3

atop看下內存分配(cat /proc/meminfo 也可以看到一些細化的內存使用信息)
mem4
2,發現cache才1.7g,slab非常高,4.4g ,slab內存簡單理解爲是系統佔用的.

使用slabtop繼續分析
mem5
3,看到proc_inode_cache使用的最多,這個代表是proc文件系統的inode的佔用的。

4,查進程,但是進程不多,再查線程,可以通過ps -eLf命令進行檢查。

得到如下的結果:(沒有原圖了,這裏補得圖,用雲盾做介紹)
mem6
計算socket

mem8

計算一下有多少fd
mem7
5,每個socket的inode也不一樣
mem9
當時看到的現場有幾萬個fd,基本全是socket,每個inode都是佔用空間的,且proc文件系統是全內存的。 所以我們纔會看到slab中proc_inode_cache內存佔用高

後續:
優化相關的server端~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章