【Linux學習】Linux free 命令學習

一、學習這個命令的背景

因為最近Gitlab服務器占用內存很多,也在下面的這篇博客里面寫了怎么減少Gitlab占用的內存問題。
+【Git學習】解決GitLab內存消耗大的問題

但是一開始并沒有很清楚的明白free命令的每一個數據到底代表的什么意思,導致一直以為優化沒有效果。后面認真學習了下free命令,先看看

操作系統版本是 Ubuntu 14.04
linux的內核版本號是 3.13.0-24-generic

在這里插入圖片描述
root@ubuntu116:~# uname -r 
3.13.0-24-generic
您在 /var/mail/root 中有新郵件
root@ubuntu116:~# uname -a
Linux ubuntu116 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
您在 /var/mail/root 中有新郵件
root@ubuntu116:~# cat /proc/version 
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
root@ubuntu116:~#  lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04 LTS
Release:    14.04
Codename:   trusty
root@ubuntu116:~# 

二、free命令使用

首先是要 free --help命令,來查看下free命令的用法。


在這里插入圖片描述
root@ubuntu116:~# free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -o, --old           use old format (without -/+buffers/cache line)
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

下面我們來測試下幾個常用的options

2.1 free -b

在這里插入圖片描述
root@ubuntu116:~# free -b
             total       used       free     shared    buffers     cached
Mem:    67529682944 64533520384 2996162560  213880832  351289344 58317025280
-/+ buffers/cache: 5865205760 61664477184
Swap:   68690112512    7532544 68682579968
您在 /var/mail/root 中有新郵件
root@ubuntu116:~# 

2.2 free -k

在這里插入圖片描述
root@ubuntu116:~# free -k
             total       used       free     shared    buffers     cached
Mem:      65946956   63518300    2428656     208900     343148   56952900
-/+ buffers/cache:    6222252   59724704
Swap:     67080188       7356   67072832
您在 /var/mail/root 中有新郵件
root@ubuntu116:~# 

2.3 free -m

在這里插入圖片描述
root@ubuntu116:~# free -m
             total       used       free     shared    buffers     cached
Mem:         64401      62458       1942        204        335      55618
-/+ buffers/cache:       6505      57895
Swap:        65507          7      65500
root@ubuntu116:~# 

2.4 free -g

在這里插入圖片描述
root@ubuntu116:~# free -g
             total       used       free     shared    buffers     cached
Mem:            62         60          1          0          0         54
-/+ buffers/cache:          6         56
Swap:           63          0         63
root@ubuntu116:~# 

2.5 free -h

在這里插入圖片描述
root@ubuntu116:~# free -h
             total       used       free     shared    buffers     cached
Mem:           62G        60G       2.2G       204M       336M        54G
-/+ buffers/cache:       6.1G        56G
Swap:          63G       7.2M        63G
root@ubuntu116:~# 

2.6 free -l

顯示詳細的低內存和高內存統計信息


在這里插入圖片描述
root@ubuntu116:~# free -l 
             total       used       free     shared    buffers     cached
Mem:      65946956   63396736    2550220     209228     344632   56953528
Low:      65946956   63396736    2550220
High:            0          0          0
-/+ buffers/cache:    6098576   59848380
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.7 free -o

使用舊格式(沒有 -/+buffers/cache 這一行)

在這里插入圖片描述
root@ubuntu116:~# free -o
             total       used       free     shared    buffers     cached
Mem:      65946956   64045184    1901772     209256     344760   56969912
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.8 free -t

展示RAM和swap的合計


在這里插入圖片描述
root@ubuntu116:~# free -t
             total       used       free     shared    buffers     cached
Mem:      65946956   64118724    1828232     209616     345348   56973588
-/+ buffers/cache:    6799788   59147168
Swap:     67080188       7356   67072832
Total:   133027144   64126080   68901064
root@ubuntu116:~# 

2.9 free -s N

每相隔N秒重復打印一次內存信息,直到你按下 Ctrl + c

在這里插入圖片描述
root@ubuntu116:~# free -s 3
             total       used       free     shared    buffers     cached
Mem:      65946956   64138880    1808076     209708     345616   56957708
-/+ buffers/cache:    6835556   59111400
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64073124    1873832     209716     345616   56957720
-/+ buffers/cache:    6769788   59177168
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64167628    1779328     209720     345616   56957732
-/+ buffers/cache:    6864280   59082676
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64159796    1787160     209720     345620   56957728
-/+ buffers/cache:    6856448   59090508
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64166776    1780180     209724     345628   56957740
-/+ buffers/cache:    6863408   59083548
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   63093948    2853008     209724     345632   56957756
-/+ buffers/cache:    5790560   60156396
Swap:     67080188       7356   67072832

2.10 free -c N

重復打印N次內存信息,然后退出

在這里插入圖片描述
root@ubuntu116:~# free -c 3
             total       used       free     shared    buffers     cached
Mem:      65946956   64199120    1747836     209780     345744   56974404
-/+ buffers/cache:    6878972   59067984
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   63949560    1997396     209780     345744   56974404
-/+ buffers/cache:    6629412   59317544
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64093104    1853852     209780     345744   56974408
-/+ buffers/cache:    6772952   59174004
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.11 free -V

顯示版本號信息

在這里插入圖片描述
root@ubuntu116:~# free -V
free from procps-ng 3.3.9
root@ubuntu116:~# 

三、free命令輸出內容名詞解釋

在這里插入圖片描述
root@ubuntu116:~# free
             total       used       free     shared    buffers     cached
Mem:      65946956   64255040    1691916     213840     356892   56805760
-/+ buffers/cache:    7092388   58854568
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

3.1 Mem,-/+ buffers/cache,Swap 解釋

我們看到free命令有三行內容:Mem,-/+ buffers/cache,Swap,代表的內容如下:

名稱 代表的內容
Mem 內存的使用情況
-/+ buffers/cache 表示物理內存已用多少,可用多少
Swap 交換空間的使用情況

3.2 total,used,free,shared,buffers,cached 解釋

列的內容是total,used,free,shared,buffers,cached,代表的內容如下:

名稱 代表的內容
total 總量
used 已使用的
free 空閑的
shared 共享的,在linux里面有很多共享內存,比如一個libc庫,很多程序調用,但實際只存一份
buffers 緩存,可回收
cached 緩存,可回收
  • 關于buffers和cached的區別
    這里有個地方要注意,關于buffers和cached的區別。
    關于free命令里面的cached、buffers的區別,下面一幅圖可以表達:
    (圖片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋寶華老師的博客)
    在這里插入圖片描述

cached和buffers都可以讀寫,它們唯一的區別就是:buffers以裸設備或分區為背景,cached以文件系統里的文件為背景。

比如 cat /dev/sda1 > /dev/null,那/dev/sda1的內容進入buffers
如果cat /opt/test.py > /dev/null,則/opt/test.py的內容進入cached

在有些時候buffer和cache這兩個詞經常混用。不過在一些比較低層的軟件里是要區分這兩個詞的,看老外的洋文:

  • A buffer is something that has yet to be "written" to disk.
  • A cache is something that has been "read" from the disk and stored for later use.
    也就是說buffer是用于存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系統(例如windows),為了提高IO read的性能,總是要多cache一些數據,這也就是為什么Mem這一行cached 比較大,而Mem這一行free 比較小的原因。

四、free命令輸出內容計算公司

下面我們來計算一下free命令各個參數是怎么計算出來的,參考下面的圖片
(圖片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋寶華老師的博客)

在這里插入圖片描述

4.1 關于Mem這一行的total的計算公式

計算公式為 : total = used + free

在這里插入圖片描述

total (65946956) = used (64255040) + free (1691916)

比如本例中,Mem的used是64255040,free是1691916,加起來剛好是total的65946956.

4.2 關于 -/+ buffers/cache這一行的used的計算公式

free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。

-/+ buffers/cache這一行的used,即 -buffers/cache ,表示一個應用程序認為系統被用掉多少內存,實實在在吃掉的內存

計算公式為: -/+ buffers/cache的used = Mem這一行的used - Mem這一行的buffers - Mem這一行的cached

在這里插入圖片描述

`-/+ buffers/cache的used (7092388) = Mem這一行的used (64255040) - Mem這一行的buffers (356892)- 去Mem這一行的cached (56805760)

比如本例中,-/+ buffers/cache的used是7092388,這個值是由Mem這一行的used 64255040,減去Mem這一行的buffers 356892,再減去Mem這一行的cached 56805760。

4.3 關于 -/+ buffers/cache這一行的free的計算公式

-/+ buffers/cache這一行的free,即 +buffers/cache ,表示一個應用程序認為系統還有多少內存,可以挪用的內存總數

計算公式為: -/+ buffers/cache的free = Mem這一行的free + Mem這一行的buffers + Mem這一行的cached

在這里插入圖片描述

-/+ buffers/cache的free (58854568) = Mem這一行的free (1691916) + Mem這一行的buffers (356892) + Mem這一行的cached (56805760)

比如本例中,-/+ buffers/cache的free 是58854568,這個值是由Mem這一行的free 1691916,加上Mem這一行的buffers 356892,再加上Mem這一行的cached 56805760

因為被系統cache和buffer占用的內存可以被快速回收,所以通常-/+ buffers/cache這一行的free會比Mem這一行的free大很多。

4.4 關于Swap這一行的total的計算公式

計算公式為 : total = used + free

在這里插入圖片描述

total (67080188) = used (7356) + free (67072832)

比如本例中,Swap的used是7356,free是67072832,加起來剛好是total的67080188.

4.5 關于估算空閑的物理內存

估算空閑的物理內存時可參考-/+ buffers/cache的free的值,但實際的可用內存要小于這個值,因為不能所有的buffers和cached都釋放。

我想大家看了上面,還是很暈.第一部分(Mem)與第二部分(-/+ buffers/cache)的結果中有關usedfree為什么這么奇怪?

其實我們可以從二個方面來解釋.

操作系統來講是Mem這一行的buffers/cached 都是屬于被使用,所以它認為free只有1691916

應用程序來講是-/+ buffers/cach。 buffers/cached 是等同可用的,因為buffer/cached是為了提高程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。

五 關于 buffer和cache

5.1 什么是buffer/cache?

buffer 和 cache 是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。

在 Linux 的內存管理中,這里的 buffer 指 Linux 內存的: Buffer cache 。這里的 cache 指 Linux 內存中的: Page cache 。翻譯成中文可以叫做緩沖區緩存頁面緩存
在歷史上,它們一個( buffer )被用來當成對 io 設備寫的緩存,而另一個( cache )被用來當作對 io 設備的讀緩存,這里的 io 設備,主要指的是塊設備文件和文件系統上的普通文件。
但是現在,它們的意義已經不一樣了。
在當前的內核中, page cache 顧名思義就是針對內存頁的緩存,說白了就是,如果有內存是以 page 進行分配管理的,都可以使用 page cache 作為其緩存來管理使用。
當然,不是所有的內存都是以頁( page )進行管理的,也有很多是針對塊( block )進行管理的,這部分內存使用如果要用到 cache 功能,則都集中到 buffer cache 中來使用。(從這個角度出發,是不是 buffer cache 改名叫做 block cache 更好?)然而,也不是所有塊( block )都有固定長度,系統上塊的長度主要是根據所使用的塊設備決定的,而頁長度在 X86 上無論是 32 位還是 64 位都是 4k 。

明白了這兩套緩存系統的區別,就可以理解它們究竟都可以用來做什么了。

5.2 什么是 page cache

Page cache 主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有 read / write 操作的時候。如果你仔細想想的話,作為可以映射文件到內存的系統調用: mmap 是不是很自然的也應該用到 page cache ?在當前的系統實現里, page cache 也被作為其它文件類型的緩存設備來用,所以事實上 page cache 也負責了大部分的塊設備文件的緩存工作。

5.3 什么是 buffer cache

Buffer cache 則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。這意味著某些對塊的操作會使用 buffer cache 進行緩存,比如我們在格式化文件系統的時候。一般情況下兩個緩存系統是一起配合使用的,比如當我們對一個文件進行寫操作的時候, page cache 的內容會被改變,而 buffer cache 則可以用來將 page 標記為不同的緩沖區,并記錄是哪一個緩沖區被修改了。這樣,內核在后續執行臟數據的回寫( writeback )時,就不用將整個 page 寫回,而只需要寫回修改的部分即可。

5.4 如何回收 cache ?

Linux 內核會在內存將要耗盡的時候,觸發內存回收的工作,以便釋放出內存給急需內存的進程使用。一般情況下,這個操作中主要的內存釋放都來自于對 buffer / cache 的釋放。尤其是被使用更多的 cache 空間。既然它主要用來做緩存,只是在內存夠用的時候加快進程對文件的讀寫速度,那么在內存壓力較大的情況下,當然有必要清空釋放 cache ,作為 free 空間分給相關進程使用。所以一般情況下,我們認為 buffer/cache 空間可以被釋放,這個理解是正確的。

但是這種清緩存的工作也并不是沒有成本。理解 cache 是干什么的就可以明白清緩存必須保證 cache 中的數據跟對應文件中的數據一致,才能對 cache 進行釋放。所以伴隨著 cache 清除的行為的,一般都是系統 IO 飆高。因為內核要對比 cache 中的數據和對應硬盤文件上的數據是否一致,如果不一致需要寫回,之后才能回收。

  • 人工觸發緩存清除

在系統中除了內存將被耗盡的時候可以清緩存以外,我們還可以使用下面這個文件來人工觸發緩存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches

方法是:

echo 1 > /proc/sys/vm/drop_caches

當然,這個文件可以設置的值分別為 1 、 2 、 3 。它們所表示的含義為:

echo 1 > /proc/sys/vm/drop_caches

表示清除 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除回收 slab 分配器中的對象(包括目錄項緩存和 inode 緩存)。 slab 分配器是內核中管理內存的一種機制,其中很多緩存數據實現都是用的 pagecache 。

echo 3 > /proc/sys/vm/drop_caches
表示清除 pagecache 和 slab 分配器中的緩存對象。

六、參考鏈接


image

作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:https://blog.csdn.net/qq446282412/article/details/84292776
如果本文對您有所幫助,歡迎您掃碼下圖所示的支付寶和微信支付二維碼對本文進行打賞。

image
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容