一尊浓、學(xué)習(xí)這個(gè)命令的背景
因?yàn)樽罱麲itlab服務(wù)器占用內(nèi)存很多逞频,也在下面的這篇博客里面寫了怎么減少Gitlab占用的內(nèi)存問(wèn)題。
+【Git學(xué)習(xí)】解決GitLab內(nèi)存消耗大的問(wèn)題
但是一開始并沒(méi)有很清楚的明白free命令的每一個(gè)數(shù)據(jù)到底代表的什么意思栋齿,導(dǎo)致一直以為優(yōu)化沒(méi)有效果苗胀。后面認(rèn)真學(xué)習(xí)了下free命令,先看看
操作系統(tǒng)版本是 Ubuntu 14.04
linux的內(nèi)核版本號(hào)是 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命令基协,來(lái)查看下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).
下面我們來(lái)測(cè)試下幾個(gè)常用的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
顯示詳細(xì)的低內(nèi)存和高內(nèi)存統(tǒng)計(jì)信息
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
使用舊格式(沒(méi)有 -/+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的合計(jì)
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秒重復(fù)打印一次內(nèi)存信息菇用,直到你按下 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
重復(fù)打印N次內(nèi)存信息澜驮,然后退出
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
顯示版本號(hào)信息
root@ubuntu116:~# free -V
free from procps-ng 3.3.9
root@ubuntu116:~#
三、free命令輸出內(nèi)容名詞解釋
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命令有三行內(nèi)容:Mem,-/+ buffers/cache卦绣,Swap亭畜,代表的內(nèi)容如下:
名稱 | 代表的內(nèi)容 |
---|---|
Mem | 內(nèi)存的使用情況 |
-/+ buffers/cache | 表示物理內(nèi)存已用多少,可用多少 |
Swap | 交換空間的使用情況 |
3.2 total迎卤,used拴鸵,free,shared蜗搔,buffers劲藐,cached 解釋
列的內(nèi)容是total,used樟凄,free聘芜,shared,buffers缝龄,cached汰现,代表的內(nèi)容如下:
名稱 | 代表的內(nèi)容 |
---|---|
total | 總量 |
used | 已使用的 |
free | 空閑的 |
shared | 共享的挂谍,在linux里面有很多共享內(nèi)存,比如一個(gè)libc庫(kù)瞎饲,很多程序調(diào)用口叙,但實(shí)際只存一份 |
buffers | 緩存,可回收 |
cached | 緩存嗅战,可回收 |
- 關(guān)于buffers和cached的區(qū)別
這里有個(gè)地方要注意妄田,關(guān)于buffers和cached的區(qū)別。
關(guān)于free命令里面的cached驮捍、buffers的區(qū)別疟呐,下面一幅圖可以表達(dá):
(圖片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋寶華老師的博客)
在這里插入圖片描述
cached和buffers都可以讀寫,它們唯一的區(qū)別就是:buffers以裸設(shè)備或分區(qū)為背景东且,cached以文件系統(tǒng)里的文件為背景启具。
比如
cat /dev/sda1 > /dev/null
,那/dev/sda1的內(nèi)容進(jìn)入buffers珊泳,
如果cat /opt/test.py > /dev/null
鲁冯,則/opt/test.py的內(nèi)容進(jìn)入cached。
在有些時(shí)候buffer和cache這兩個(gè)詞經(jīng)持冀罚混用。不過(guò)在一些比較低層的軟件里是要區(qū)分這兩個(gè)詞的堵漱,看老外的洋文:
- 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.
也就是說(shuō)buffer是用于存放要輸出到disk(塊設(shè)備)的數(shù)據(jù)的综慎,而cache是存放從disk上讀出的數(shù)據(jù)。這二者是為了提高IO性能的勤庐,并由OS管理示惊。
Linux和其他成熟的操作系統(tǒng)(例如windows),為了提高IO read的性能愉镰,總是要多cache一些數(shù)據(jù)米罚,這也就是為什么Mem這一行cached 比較大,而Mem這一行free 比較小的原因丈探。
四录择、free命令輸出內(nèi)容計(jì)算公司
下面我們來(lái)計(jì)算一下free命令各個(gè)參數(shù)是怎么計(jì)算出來(lái)的,參考下面的圖片
(圖片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋寶華老師的博客)
4.1 關(guān)于Mem這一行的total的計(jì)算公式
計(jì)算公式為 :
total = used + free
total (65946956) = used (64255040) + free (1691916)
比如本例中碗降,Mem的used是64255040隘竭,free是1691916,加起來(lái)剛好是total的65946956.
4.2 關(guān)于 -/+ buffers/cache這一行的used的計(jì)算公式
free輸出的第二行是從一個(gè)應(yīng)用程序的角度看系統(tǒng)內(nèi)存的使用情況讼渊。
-/+ buffers/cache這一行的used动看,即 -buffers/cache ,表示一個(gè)應(yīng)用程序認(rèn)為系統(tǒng)被用掉多少內(nèi)存爪幻,實(shí)實(shí)在在吃掉的內(nèi)存
計(jì)算公式為:
-/+ 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须误,這個(gè)值是由Mem這一行的used 64255040,減去Mem這一行的buffers 356892仇轻,再減去Mem這一行的cached 56805760京痢。
4.3 關(guān)于 -/+ buffers/cache這一行的free的計(jì)算公式
-/+ buffers/cache這一行的free,即 +buffers/cache 拯田,表示一個(gè)應(yīng)用程序認(rèn)為系統(tǒng)還有多少內(nèi)存历造,可以挪用的內(nèi)存總數(shù)
計(jì)算公式為:
-/+ 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船庇,這個(gè)值是由Mem這一行的free 1691916吭产,加上Mem這一行的buffers 356892,再加上Mem這一行的cached 56805760
因?yàn)楸幌到y(tǒng)cache和buffer占用的內(nèi)存可以被快速回收鸭轮,所以通常-/+ buffers/cache這一行的free會(huì)比Mem這一行的free大很多臣淤。
4.4 關(guān)于Swap這一行的total的計(jì)算公式
計(jì)算公式為 :
total = used + free
total (67080188) = used (7356) + free (67072832)
比如本例中,Swap的used是7356窃爷,free是67072832邑蒋,加起來(lái)剛好是total的67080188.
4.5 關(guān)于估算空閑的物理內(nèi)存
估算空閑的物理內(nèi)存時(shí)可參考-/+ buffers/cache的free的值,但實(shí)際的可用內(nèi)存要小于這個(gè)值按厘,因?yàn)椴荒芩械腷uffers和cached都釋放医吊。
我想大家看了上面,還是很暈.第一部分(Mem)與第二部分(-/+ buffers/cache)的結(jié)果中有關(guān)used和free為什么這么奇怪?
其實(shí)我們可以從二個(gè)方面來(lái)解釋.
對(duì)操作系統(tǒng)來(lái)講是Mem這一行的buffers/cached 都是屬于被使用,所以它認(rèn)為free只有1691916
對(duì)應(yīng)用程序來(lái)講是-/+ buffers/cach逮京。 buffers/cached 是等同可用的,因?yàn)?strong>buffer/cached是為了提高程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時(shí),buffer/cached會(huì)很快地被使用卿堂。
五 關(guān)于 buffer和cache
5.1 什么是buffer/cache?
buffer 和 cache 是兩個(gè)在計(jì)算機(jī)技術(shù)中被用濫的名詞懒棉,放在不通語(yǔ)境下會(huì)有不同的意義草描。
在 Linux 的內(nèi)存管理中,這里的 buffer 指 Linux 內(nèi)存的: Buffer cache 策严。這里的 cache 指 Linux 內(nèi)存中的: Page cache 穗慕。翻譯成中文可以叫做緩沖區(qū)緩存 和 頁(yè)面緩存。
在歷史上妻导,它們一個(gè)( buffer )被用來(lái)當(dāng)成對(duì) io 設(shè)備寫的緩存逛绵,而另一個(gè)( cache )被用來(lái)當(dāng)作對(duì) io 設(shè)備的讀緩存,這里的 io 設(shè)備倔韭,主要指的是塊設(shè)備文件和文件系統(tǒng)上的普通文件暑脆。
但是現(xiàn)在,它們的意義已經(jīng)不一樣了狐肢。
在當(dāng)前的內(nèi)核中添吗, page cache 顧名思義就是針對(duì)內(nèi)存頁(yè)的緩存,說(shuō)白了就是份名,如果有內(nèi)存是以 page 進(jìn)行分配管理的碟联,都可以使用 page cache 作為其緩存來(lái)管理使用妓美。
當(dāng)然,不是所有的內(nèi)存都是以頁(yè)( page )進(jìn)行管理的鲤孵,也有很多是針對(duì)塊( block )進(jìn)行管理的壶栋,這部分內(nèi)存使用如果要用到 cache 功能,則都集中到 buffer cache 中來(lái)使用普监。(從這個(gè)角度出發(fā)贵试,是不是 buffer cache 改名叫做 block cache 更好?)然而凯正,也不是所有塊( block )都有固定長(zhǎng)度毙玻,系統(tǒng)上塊的長(zhǎng)度主要是根據(jù)所使用的塊設(shè)備決定的,而頁(yè)長(zhǎng)度在 X86 上無(wú)論是 32 位還是 64 位都是 4k 廊散。
明白了這兩套緩存系統(tǒng)的區(qū)別桑滩,就可以理解它們究竟都可以用來(lái)做什么了。
5.2 什么是 page cache
Page cache 主要用來(lái)作為文件系統(tǒng)上的文件數(shù)據(jù)的緩存來(lái)用允睹,尤其是針對(duì)當(dāng)進(jìn)程對(duì)文件有 read / write 操作的時(shí)候运准。如果你仔細(xì)想想的話,作為可以映射文件到內(nèi)存的系統(tǒng)調(diào)用: mmap 是不是很自然的也應(yīng)該用到 page cache 缭受?在當(dāng)前的系統(tǒng)實(shí)現(xiàn)里胁澳, page cache 也被作為其它文件類型的緩存設(shè)備來(lái)用,所以事實(shí)上 page cache 也負(fù)責(zé)了大部分的塊設(shè)備文件的緩存工作米者。
5.3 什么是 buffer cache
Buffer cache 則主要是設(shè)計(jì)用來(lái)在系統(tǒng)對(duì)塊設(shè)備進(jìn)行讀寫的時(shí)候韭畸,對(duì)塊進(jìn)行數(shù)據(jù)緩存的系統(tǒng)來(lái)使用。這意味著某些對(duì)塊的操作會(huì)使用 buffer cache 進(jìn)行緩存塘雳,比如我們?cè)诟袷交募到y(tǒng)的時(shí)候陆盘。一般情況下兩個(gè)緩存系統(tǒng)是一起配合使用的普筹,比如當(dāng)我們對(duì)一個(gè)文件進(jìn)行寫操作的時(shí)候败明, page cache 的內(nèi)容會(huì)被改變,而 buffer cache 則可以用來(lái)將 page 標(biāo)記為不同的緩沖區(qū)太防,并記錄是哪一個(gè)緩沖區(qū)被修改了妻顶。這樣,內(nèi)核在后續(xù)執(zhí)行臟數(shù)據(jù)的回寫( writeback )時(shí)蜒车,就不用將整個(gè) page 寫回讳嘱,而只需要寫回修改的部分即可。
5.4 如何回收 cache 酿愧?
Linux 內(nèi)核會(huì)在內(nèi)存將要耗盡的時(shí)候沥潭,觸發(fā)內(nèi)存回收的工作,以便釋放出內(nèi)存給急需內(nèi)存的進(jìn)程使用嬉挡。一般情況下钝鸽,這個(gè)操作中主要的內(nèi)存釋放都來(lái)自于對(duì) buffer / cache 的釋放汇恤。尤其是被使用更多的 cache 空間。既然它主要用來(lái)做緩存拔恰,只是在內(nèi)存夠用的時(shí)候加快進(jìn)程對(duì)文件的讀寫速度因谎,那么在內(nèi)存壓力較大的情況下,當(dāng)然有必要清空釋放 cache 颜懊,作為 free 空間分給相關(guān)進(jìn)程使用财岔。所以一般情況下,我們認(rèn)為 buffer/cache 空間可以被釋放河爹,這個(gè)理解是正確的匠璧。
但是這種清緩存的工作也并不是沒(méi)有成本。理解 cache 是干什么的就可以明白清緩存必須保證 cache 中的數(shù)據(jù)跟對(duì)應(yīng)文件中的數(shù)據(jù)一致昌抠,才能對(duì) cache 進(jìn)行釋放患朱。所以伴隨著 cache 清除的行為的,一般都是系統(tǒng) IO 飆高炊苫。因?yàn)閮?nèi)核要對(duì)比 cache 中的數(shù)據(jù)和對(duì)應(yīng)硬盤文件上的數(shù)據(jù)是否一致裁厅,如果不一致需要寫回,之后才能回收侨艾。
- 人工觸發(fā)緩存清除
在系統(tǒng)中除了內(nèi)存將被耗盡的時(shí)候可以清緩存以外执虹,我們還可以使用下面這個(gè)文件來(lái)人工觸發(fā)緩存清除的操作:
[root@tencent64 ~]# cat /proc/sys/vm/drop_caches
方法是:
echo 1 > /proc/sys/vm/drop_caches
當(dāng)然,這個(gè)文件可以設(shè)置的值分別為 1 唠梨、 2 袋励、 3 。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches
表示清除 pagecache 当叭。
echo 2 > /proc/sys/vm/drop_caches
表示清除回收 slab 分配器中的對(duì)象(包括目錄項(xiàng)緩存和 inode 緩存)茬故。 slab 分配器是內(nèi)核中管理內(nèi)存的一種機(jī)制,其中很多緩存數(shù)據(jù)實(shí)現(xiàn)都是用的 pagecache 蚁鳖。
echo 3 > /proc/sys/vm/drop_caches
表示清除 pagecache 和 slab 分配器中的緩存對(duì)象磺芭。
六、參考鏈接
作者:歐陽(yáng)鵬 歡迎轉(zhuǎn)載醉箕,與人分享是進(jìn)步的源泉钾腺!
轉(zhuǎn)載請(qǐng)保留原文地址:https://blog.csdn.net/qq446282412/article/details/84292776
如果本文對(duì)您有所幫助,歡迎您掃碼下圖所示的支付寶和微信支付二維碼對(duì)本文進(jìn)行打賞讥裤。