Linux?內(nèi)存中的?Cache?真的能被回收么?

在 Linux 系統(tǒng)中条篷,我們經(jīng)常用 free 命令來查看系統(tǒng)內(nèi)存的使用狀態(tài)。在一個 RHEL6 的系統(tǒng)上蛤织,free 命令的顯示內(nèi)容大概是這樣一個狀態(tài):

[root@tencent64 ~]# free

total used free shared buffers cached

Mem: 132256952 72571772 59685180 0 1762632 53034704

-/+ buffers/cache: 17774436 114482516

Swap: 2101192 508 2100684

這里的默認(rèn)顯示單位是 kb赴叹,我的服務(wù)器是 128G 內(nèi)存,所以數(shù)字顯得比較大指蚜。這個命令幾乎是每一個使用過 Linux 的人必會的命令乞巧,但越是這樣的命令,似乎真正明白的人越少(我是說比例越少)摊鸡。一般情況下绽媒,對此命令輸出的理解可以分這幾個層次:

不了解。這樣的人的第一反應(yīng)是:天啊免猾,內(nèi)存用了好多是辕,70個多 G,可是我?guī)缀鯖]有運(yùn)行什么大程序傲蕴帷获三?為什么會這樣? Linux 好占內(nèi)存锨苏!

自以為很了解疙教。這樣的人一般評估過會說:嗯,根據(jù)我專業(yè)的眼光看的出來伞租,內(nèi)存才用了 17G 左右贞谓,還有很多剩余內(nèi)存可用。buffers/cache 占用的較多葵诈,說明系統(tǒng)中有進(jìn)程曾經(jīng)讀寫過文件裸弦,但是不要緊祟同,這部分內(nèi)存是當(dāng)空閑來用的。

真的很了解烁兰。這種人的反應(yīng)反而讓人感覺最不懂 Linux耐亏,他們的反應(yīng)是:free 顯示的是這樣,好吧我知道了沪斟。神馬广辰?你問我這些內(nèi)存夠不夠,我當(dāng)然不知道啦主之!我特么怎么知道你程序怎么寫的择吊?

根據(jù)目前網(wǎng)絡(luò)上技術(shù)文檔的內(nèi)容,我相信絕大多數(shù)了解一點 Linux 的人應(yīng)該處在第二種層次槽奕。大家普遍認(rèn)為几睛,buffers 和 cached 所占用的內(nèi)存空間是可以在內(nèi)存壓力較大的時候被釋放當(dāng)做空閑空間用的。但真的是這樣么粤攒?在論證這個題目之前所森,我們先簡要介紹一下 buffers 和 cached 是什么意思:

什么是 buffer/cache?

buffer 和 cache 是兩個在計算機(jī)技術(shù)中被用濫的名詞夯接,放在不同語境下會有不同的意義焕济。在 Linux 的內(nèi)存管理中,這里的buffer 指 Linux 內(nèi)存的:Buffer cache盔几。這里的 cache 指 Linux 內(nèi)存中的:Page cache晴弃。翻譯成中文可以叫做緩沖區(qū)緩存和頁面緩存。在歷史上逊拍,它們一個(buffer)被用來當(dāng)成對 io 設(shè)備寫的緩存上鞠,而另一個(cache)被用來當(dāng)作對 io 設(shè)備的讀緩存,這里的 io 設(shè)備芯丧,主要指的是塊設(shè)備文件和文件系統(tǒng)上的普通文件芍阎。但是現(xiàn)在,它們的意義已經(jīng)不一樣了缨恒。在當(dāng)前的內(nèi)核中能曾,page cache 顧名思義就是針對內(nèi)存頁的緩存,說白了就是肿轨,如果有內(nèi)存是以 page 進(jìn)行分配管理的寿冕,都可以使用 page cache 作為其緩存來管理使用。當(dāng)然椒袍,不是所有的內(nèi)存都是以頁page進(jìn)行管理的驼唱,也有很多是針對塊block進(jìn)行管理的,這部分內(nèi)存使用如果要用到 cache 功能驹暑,則都集中到 buffer cache 中來使用玫恳。(從這個角度出發(fā)辨赐,是不是 buffer cache 改名叫做 block cache 更好?)然而京办,也不是所有塊block都有固定長度掀序,系統(tǒng)上塊的長度主要是根據(jù)所使用的塊設(shè)備決定的,而頁長度在 X86 上無論是32位還是64位都是 4k惭婿。

明白了這兩套緩存系統(tǒng)的區(qū)別不恭,就可以理解它們究竟都可以用來做什么了。

什么是 page cache

Page cache 主要用來作為文件系統(tǒng)上的文件數(shù)據(jù)的緩存來用财饥,尤其是針對當(dāng)進(jìn)程對文件有 read/write 操作的時候换吧。如果你仔細(xì)想想的話,作為可以映射文件到內(nèi)存的系統(tǒng)調(diào)用:mmap 是不是很自然的也應(yīng)該用到 page cache钥星?在當(dāng)前的系統(tǒng)實現(xiàn)里沾瓦, page cache 也被作為其它文件類型的緩存設(shè)備來用,所以事實上 page cache 也負(fù)責(zé)了大部分的塊設(shè)備文件的緩存工作谦炒。

什么是 buffer cache

Buffer cache 則主要是設(shè)計用來在系統(tǒng)對塊設(shè)備進(jìn)行讀寫的時候贯莺,對塊進(jìn)行數(shù)據(jù)緩存的系統(tǒng)來使用。這意味著某些對塊的操作會使用 buffer cache 進(jìn)行緩存宁改,比如我們在格式化文件系統(tǒng)的時候乖篷。一般情況下兩個緩存系統(tǒng)是一起配合使用的,比如當(dāng)我們對一個文件進(jìn)行寫操作的時候透且,page cache 的內(nèi)容會被改變,而 buffer cache 則可以用來將 page 標(biāo)記為不同的緩沖區(qū)豁鲤,并記錄是哪一個緩沖區(qū)被修改了秽誊。這樣,內(nèi)核在后續(xù)執(zhí)行臟數(shù)據(jù)的回寫writeback時琳骡,就不用將整個 page 寫回锅论,而只需要寫回修改的部分即可。

如何回收 cache楣号?

Linux 內(nèi)核會在內(nèi)存將要耗盡的時候最易,觸發(fā)內(nèi)存回收的工作,以便釋放出內(nèi)存給急需內(nèi)存的進(jìn)程使用炫狱。一般情況下藻懒,這個操作中主要的內(nèi)存釋放都來自于對 buffer/cache 的釋放。尤其是被使用更多的 cache 空間视译。既然它主要用來做緩存嬉荆,只是在內(nèi)存夠用的時候加快進(jìn)程對文件的讀寫速度,那么在內(nèi)存壓力較大的情況下酷含,當(dāng)然有必要清空釋放 cache鄙早,作為 free 空間分給相關(guān)進(jìn)程使用汪茧。所以一般情況下,我們認(rèn)為 buffer/cache 空間可以被釋放限番,這個理解是正確的舱污。

但是這種清緩存的工作也并不是沒有成本。理解 cache 是干什么的就可以明白清緩存必須保證 cache 中的數(shù)據(jù)跟對應(yīng)文件中的數(shù)據(jù)一致弥虐,才能對 cache 進(jìn)行釋放扩灯。所以伴隨著 cache 清除的行為的,一般都是系統(tǒng) IO 飆高躯舔。因為內(nèi)核要對比 cache 中的數(shù)據(jù)和對應(yīng)硬盤文件上的數(shù)據(jù)是否一致驴剔,如果不一致需要寫回,之后才能回收粥庄。

在系統(tǒng)中除了內(nèi)存將被耗盡的時候可以清緩存以外丧失,我們還可以使用下面這個文件來人工觸發(fā)緩存清除的操作:

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

1

方法是:

echo 1 > /proc/sys/vm/drop_caches

當(dāng)然,這個文件可以設(shè)置的值分別為1惜互、2布讹、3。它們所表示的含義為:

echo 1 > /proc/sys/vm/drop_caches:表示清除 page cache训堆。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收 slab 分配器中的對象(包括目錄項緩存和 inode 緩存)描验。slab 分配器是內(nèi)核中管理內(nèi)存的一種機(jī)制,其中很多緩存數(shù)據(jù)實現(xiàn)都是用的 page cache坑鱼。

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

cache都能被回收么?

我們分析了 cache 能被回收的情況鲁沥,那么有沒有不能被回收的 cache 呢呼股?當(dāng)然有。我們先來看第一種情況:

tmpfs

大家知道 Linux 提供一種“臨時”文件系統(tǒng)叫做 tmpfs画恰,它可以將內(nèi)存的一部分空間拿來當(dāng)做文件系統(tǒng)使用彭谁,使內(nèi)存空間可以當(dāng)做目錄文件來用。現(xiàn)在絕大多數(shù) Linux 系統(tǒng)都有一個叫做 /dev/shm 的 tmpfs 目錄允扇,就是這樣一種存在缠局。當(dāng)然,我們也可以手工創(chuàng)建一個自己的 tmpfs考润,方法如下:

[root@tencent64 ~]# mkdir /tmp/tmpfs

[root@tencent64 ~]# mount -t tmpfs -o size=20G none /tmp/tmpfs/

[root@tencent64 ~]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda1 10325000 3529604 6270916 37% /

/dev/sda3 20646064 9595940 10001360 49% /usr/local

/dev/mapper/vg-data 103212320 26244284 71725156 27% /data

tmpfs 66128476 14709004 51419472 23% /dev/shm

none 20971520 0 20971520 0% /tmp/tmpfs

于是我們就創(chuàng)建了一個新的 tmpfs狭园,空間是 20G,我們可以在 /tmp/tmpfs 中創(chuàng)建一個 20G 以內(nèi)的文件糊治。如果我們創(chuàng)建的文件實際占用的空間是內(nèi)存的話妙啃,那么這些數(shù)據(jù)應(yīng)該占用內(nèi)存空間的什么部分呢?根據(jù) page cache 的實現(xiàn)功能可以理解,既然是某種文件系統(tǒng)揖赴,那么自然該使用 page cache 的空間來管理馆匿。我們試試是不是這樣?

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 36 89 0 1 19

-/+ buffers/cache: 15 111

Swap: 2 0 2

[root@tencent64 ~]# dd if=/dev/zero of=/tmp/tmpfs/testfile bs=1G count=13

13+0 records in

13+0 records out

13958643712 bytes (14 GB) copied, 9.49858 s, 1.5 GB/s

[root@tencent64 ~]#

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 49 76 0 1 32

-/+ buffers/cache: 15 110

Swap: 2 0 2

我們在 tmpfs 目錄下創(chuàng)建了一個 13G 的文件燥滑,并通過前后 free 命令的對比發(fā)現(xiàn)渐北,cached 增長了 13G,說明這個文件確實放在了內(nèi)存里并且內(nèi)核使用的是 cache 作為存儲铭拧。再看看我們關(guān)心的指標(biāo): -/+ buffers/cache 那一行赃蛛。我們發(fā)現(xiàn),在這種情況下 free 命令仍然提示我們有 110G 內(nèi)存可用搀菩,但是真的有這么多么呕臂?我們可以人工觸發(fā)內(nèi)存回收看看現(xiàn)在到底能回收多少內(nèi)存:

[root@tencent64 ~]# echo 3 > /proc/sys/vm/drop_caches

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 43 82 0 0 29

-/+ buffers/cache: 14 111

Swap: 2 0 2

可以看到,cached 占用的空間并沒有像我們想象的那樣完全被釋放肪跋,其中 13G 的空間仍然被 /tmp/tmpfs 中的文件占用的歧蒋。當(dāng)然,我的系統(tǒng)中還有其他不可釋放的 cache 占用著其余16G內(nèi)存空間州既。那么 tmpfs 占用的 cache 空間什么時候會被釋放呢谜洽?是在其文件被刪除的時候。如果不刪除文件吴叶,無論內(nèi)存耗盡到什么程度阐虚,內(nèi)核都不會自動幫你把 tmpfs 中的文件刪除來釋放cache空間。

[root@tencent64 ~]# rm /tmp/tmpfs/testfile

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 30 95 0 0 16

-/+ buffers/cache: 14 111

Swap: 2 0 2

這是我們分析的第一種 cache 不能被回收的情況蚌卤。還有其他情況实束,比如:

共享內(nèi)存

共享內(nèi)存是系統(tǒng)提供給我們的一種常用的進(jìn)程間通信(IPC)方式,但是這種通信方式不能在 shell 中申請和使用逊彭,所以我們需要一個簡單的測試程序咸灿,代碼如下:

[root@tencent64 ~]# cat shm.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <string.h>

#define MEMSIZE 2048*1024*1023

int

main()

{

int shmid;

char *ptr;

pid_t pid;

struct shmid_ds buf;

int ret;

shmid = shmget(IPC_PRIVATE, MEMSIZE, 0600);

if (shmid<0) {

perror("shmget()");

exit(1);

}

ret = shmctl(shmid, IPC_STAT, &buf);

if (ret < 0) {

perror("shmctl()");

exit(1);

}

printf("shmid: %d\n", shmid);

printf("shmsize: %d\n", buf.shm_segsz);

buf.shm_segsz *= 2;

ret = shmctl(shmid, IPC_SET, &buf);

if (ret < 0) {

perror("shmctl()");

exit(1);

}

ret = shmctl(shmid, IPC_SET, &buf);

if (ret < 0) {

perror("shmctl()");

exit(1);

}

printf("shmid: %d\n", shmid);

printf("shmsize: %d\n", buf.shm_segsz);

pid = fork();

if (pid<0) {

perror("fork()");

exit(1);

}

if (pid==0) {

ptr = shmat(shmid, NULL, 0);

if (ptr==(void*)-1) {

perror("shmat()");

exit(1);

}

bzero(ptr, MEMSIZE);

strcpy(ptr, "Hello!");

exit(0);

} else {

wait(NULL);

ptr = shmat(shmid, NULL, 0);

if (ptr==(void*)-1) {

perror("shmat()");

exit(1);

}

puts(ptr);

exit(0);

}

}

程序功能很簡單,就是申請一段不到 2G 共享內(nèi)存诫龙,然后打開一個子進(jìn)程對這段共享內(nèi)存做一個初始化操作,父進(jìn)程等子進(jìn)程初始化完之后輸出一下共享內(nèi)存的內(nèi)容鲫咽,然后退出签赃。但是退出之前并沒有刪除這段共享內(nèi)存。我們來看看這個程序執(zhí)行前后的內(nèi)存使用:

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 30 95 0 0 16

-/+ buffers/cache: 14 111

Swap: 2 0 2

[root@tencent64 ~]# ./shm

shmid: 294918

shmsize: 2145386496

shmid: 294918

shmsize: -4194304

Hello!

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 32 93 0 0 18

-/+ buffers/cache: 14 111

Swap: 2 0 2

cached 空間由 16G 漲到了 18G分尸。那么這段 cache 能被回收么锦聊?繼續(xù)測試:

[root@tencent64 ~]# echo 3 > /proc/sys/vm/drop_caches

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 32 93 0 0 18

-/+ buffers/cache: 14 111

Swap: 2 0 2

結(jié)果是仍然不可回收。大家可以觀察到箩绍,這段共享內(nèi)存即使沒人使用孔庭,仍然會長期存放在 cache 中,直到其被刪除。刪除方法有兩種圆到,一種是程序中使用 shmctl() 去 IPC_RMID怎抛,另一種是使用 ipcrm 命令。我們來刪除試試:

[root@tencent64 ~]# ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00005feb 0 root 666 12000 4

0x00005fe7 32769 root 666 524288 2

0x00005fe8 65538 root 666 2097152 2

0x00038c0e 131075 root 777 2072 1

0x00038c14 163844 root 777 5603392 0

0x00038c09 196613 root 777 221248 0

0x00000000 294918 root 600 2145386496 0

[root@tencent64 ~]# ipcrm -m 294918

[root@tencent64 ~]# ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00005feb 0 root 666 12000 4

0x00005fe7 32769 root 666 524288 2

0x00005fe8 65538 root 666 2097152 2

0x00038c0e 131075 root 777 2072 1

0x00038c14 163844 root 777 5603392 0

0x00038c09 196613 root 777 221248 0

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 30 95 0 0 16

-/+ buffers/cache: 14 111

Swap: 2 0 2

刪除共享內(nèi)存后芽淡,cache 被正常釋放了马绝。這個行為與 tmpfs 的邏輯類似。內(nèi)核底層在實現(xiàn)共享內(nèi)存(shm)挣菲、消息隊列(msg)和信號量數(shù)組(sem)這些 POSIX:XSI 的 IPC 機(jī)制的內(nèi)存存儲時富稻,使用的都是 tmpfs。這也是為什么共享內(nèi)存的操作邏輯與 tmpfs 類似的原因白胀。當(dāng)然椭赋,一般情況下是 shm 占用的內(nèi)存更多,所以我們在此重點強(qiáng)調(diào)共享內(nèi)存的使用或杠。說到共享內(nèi)存哪怔,Linux 還給我們提供了另外一種共享內(nèi)存的方法,就是:

mmap

mmap() 是一個非常重要的系統(tǒng)調(diào)用廷痘,這僅從 mmap 本身的功能描述上是看不出來的蔓涧。從字面上看,mmap 就是將一個文件映射進(jìn)進(jìn)程的虛擬內(nèi)存地址笋额,之后就可以通過操作內(nèi)存的方式對文件的內(nèi)容進(jìn)行操作元暴。但是實際上這個調(diào)用的用途是很廣泛的庞萍。當(dāng) malloc 申請內(nèi)存時燎悍,小段內(nèi)存內(nèi)核使用 sbrk 處理妇蛀,而大段內(nèi)存就會使用 mmap蝙寨。當(dāng)系統(tǒng)調(diào)用 exec 族函數(shù)執(zhí)行時裙盾,因為其本質(zhì)上是將一個可執(zhí)行文件加載到內(nèi)存執(zhí)行伙窃,所以內(nèi)核很自然的就可以使用 mmap 方式進(jìn)行處理择膝。我們在此僅僅考慮一種情況奢米,就是使用 mmap 進(jìn)行共享內(nèi)存的申請時淹真,會不會跟 shmget() 一樣也使用 cache讶迁?

同樣,我們也需要一個簡單的測試程序:

[root@tencent64 ~]# cat mmap.c

#include <stdlib.h>

#include <stdio.h>

#include <strings.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

#include <unistd.h>

#define MEMSIZE 1024*1024*1023*2

#define MPFILE "./mmapfile"

int main()

{

void *ptr;

int fd;

fd = open(MPFILE, O_RDWR);

if (fd < 0) {

perror("open()");

exit(1);

}

ptr = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, fd, 0);

if (ptr == NULL) {

perror("malloc()");

exit(1);

}

printf("%p\n", ptr);

bzero(ptr, MEMSIZE);

sleep(100);

munmap(ptr, MEMSIZE);

close(fd);

exit(1);

}

這次我們干脆不用什么父子進(jìn)程的方式了核蘸,就一個進(jìn)程巍糯,申請一段 2G 的 mmap 共享內(nèi)存,然后初始化這段空間之后等待 100 秒客扎,再解除影射所以我們需要在它 sleep 這 100 秒內(nèi)檢查我們的系統(tǒng)內(nèi)存使用祟峦,看看它用的是什么空間?當(dāng)然在這之前要先創(chuàng)建一個 2G 的文件 ./mmapfile徙鱼。結(jié)果如下:

[root@tencent64 ~]# dd if=/dev/zero of=mmapfile bs=1G count=2

[root@tencent64 ~]# echo 3 > /proc/sys/vm/drop_caches

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 30 95 0 0 16

-/+ buffers/cache: 14 111

Swap: 2 0 2

然后執(zhí)行測試程序:

[root@tencent64 ~]# ./mmap &

[1] 19157

0x7f1ae3635000

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 32 93 0 0 18

-/+ buffers/cache: 14 111

Swap: 2 0 2

[root@tencent64 ~]# echo 3 > /proc/sys/vm/drop_caches

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 32 93 0 0 18

-/+ buffers/cache: 14 111

Swap: 2 0 2

我們可以看到宅楞,在程序執(zhí)行期間针姿,cached 一直為 18G,比之前漲了 2G厌衙,并且此時這段 cache 仍然無法被回收距淫。然后我們等待100秒之后程序結(jié)束。

[root@tencent64 ~]#

[1]+ Exit 1 ./mmap

[root@tencent64 ~]#

[root@tencent64 ~]# free -g

total used free shared buffers cached

Mem: 126 30 95 0 0 16

-/+ buffers/cache: 14 111

Swap: 2 0 2

程序退出之后迅箩,cached 占用的空間被釋放溉愁。這樣我們可以看到,使用 mmap 申請標(biāo)志狀態(tài)為 MAP_SHARED 的內(nèi)存饲趋,內(nèi)核也是使用的 cache 進(jìn)行存儲的拐揭。在進(jìn)程對相關(guān)內(nèi)存沒有釋放之前,這段 cache 也是不能被正常釋放的奕塑。實際上堂污,mmap 的 MAP_SHARED 方式申請的內(nèi)存,在內(nèi)核中也是由 tmpfs 實現(xiàn)的龄砰。由此我們也可以推測盟猖,由于共享庫的只讀部分在內(nèi)存中都是以 mmap 的 MAP_SHARED 方式進(jìn)行管理,實際上它們也都是要占用 cache 且無法被釋放的换棚。

最后

我們通過三個測試?yán)邮礁洌l(fā)現(xiàn) Linux 系統(tǒng)內(nèi)存中的 cache 并不是在所有情況下都能被釋放當(dāng)做空閑空間用的。并且也也明確了固蚤,即使可以釋放 cache娘汞,也并不是對系統(tǒng)來說沒有成本的∠ν妫總結(jié)一下要點你弦,我們應(yīng)該記得這樣幾點:

當(dāng) cache 作為文件緩存被釋放的時候會引發(fā) IO 變高,這是 cache 加快文件訪問速度所要付出的成本燎孟。

tmpfs 中存儲的文件會占用 cache 空間禽作,除非文件刪除否則這個 cache 不會被自動釋放。

使用 shmget 方式申請的共享內(nèi)存會占用 cache 空間揩页,除非共享內(nèi)存被 ipcrm 或者使用 shmctl 去 IPC_RMID旷偿,否則相關(guān)的 cache 空間都不會被自動釋放。

使用 mmap 方法申請的 MAP_SHARED 標(biāo)志的內(nèi)存會占用 cache 空間爆侣,除非進(jìn)程將這段內(nèi)存 munmap萍程,否則相關(guān)的 cache 空間都不會被自動釋放。

實際上 shmget累提、mmap 的共享內(nèi)存尘喝,在內(nèi)核層都是通過 tmpfs 實現(xiàn)的磁浇,tmpfs 實現(xiàn)的存儲用的都是 cache斋陪。

當(dāng)理解了這些的時候,希望大家對 free 命令的理解可以達(dá)到我們說的第三個層次。我們應(yīng)該明白无虚,內(nèi)存的使用并不是簡單的概念缔赠,cache 也并不是真的可以當(dāng)成空閑空間用的。如果我們要真正深刻理解你的系統(tǒng)上的內(nèi)存到底使用的是否合理友题,是需要理解清楚很多更細(xì)節(jié)知識嗤堰,并且對相關(guān)業(yè)務(wù)的實現(xiàn)做更細(xì)節(jié)判斷的。我們當(dāng)前實驗場景是 Centos 6 的環(huán)境度宦,不同版本的 Linux 的 free 現(xiàn)實的狀態(tài)可能不一樣踢匣,大家可以自己去找出不同的原因。

當(dāng)然戈抄,本文所述的也不是所有的 cache 不能被釋放的情形离唬。那么,在你的應(yīng)用場景下划鸽,還有那些 cache 不能被釋放的場景呢输莺?

本文來自云棲社區(qū)合作伙伴“Linux中國”

原文發(fā)布時間為:2013-04-02.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裸诽,隨后出現(xiàn)的幾起案子嫂用,更是在濱河造成了極大的恐慌,老刑警劉巖丈冬,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘱函,死亡現(xiàn)場離奇詭異,居然都是意外死亡殷蛇,警方通過查閱死者的電腦和手機(jī)实夹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒梦,“玉大人亮航,你說我怎么就攤上這事≡让牵” “怎么了缴淋?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泄朴。 經(jīng)常有香客問我重抖,道長,這世上最難降的妖魔是什么祖灰? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任钟沛,我火速辦了婚禮,結(jié)果婚禮上局扶,老公的妹妹穿的比我還像新娘恨统。我一直安慰自己叁扫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布畜埋。 她就那樣靜靜地躺著莫绣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悠鞍。 梳的紋絲不亂的頭發(fā)上对室,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音咖祭,去河邊找鬼掩宜。 笑死,一個胖子當(dāng)著我的面吹牛么翰,可吹牛的內(nèi)容都是我干的锭亏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼硬鞍,長吁一口氣:“原來是場噩夢啊……” “哼慧瘤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固该,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锅减,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伐坏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怔匣,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年桦沉,在試婚紗的時候發(fā)現(xiàn)自己被綠了每瞒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡纯露,死狀恐怖剿骨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埠褪,我是刑警寧澤浓利,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站钞速,受9級特大地震影響贷掖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渴语,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一苹威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驾凶,春花似錦牙甫、人聲如沸潮改。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翰萨,卻和暖如春脏答,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亩鬼。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工殖告, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雳锋。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓黄绩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玷过。 傳聞我的和親對象是個殘疾皇子爽丹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容