網(wǎng)絡(luò)上面有很多坑爹的文章,誤導(dǎo)不少人,很多人對(duì)Linux的很多誤解可能來(lái)自于這些廣泛流傳的技術(shù)文章。下面我們推出一個(gè)系列來(lái)總結(jié)。先從內(nèi)存管理開(kāi)始。
1. compact_memory
網(wǎng)上常見(jiàn)文字:
“compact_memory
只有在啟用了CONFIG_COMPACTION選項(xiàng)才有效。當(dāng)向該文件(/proc/sys/vm/compact_memory)寫(xiě)入1時(shí),所有的內(nèi)存域都會(huì)被壓縮,使空閑的內(nèi)存盡可能形成連續(xù)的內(nèi)存塊。
”“當(dāng)內(nèi)核編譯參數(shù)設(shè)置了CONFIG_COMPACTION,就會(huì)在/proc/sys/vm/compact_memory有入口文件。將1寫(xiě)入到這個(gè)文件,則所有的zones就會(huì)進(jìn)行壓縮,以便能夠盡可能地提供連續(xù)內(nèi)存塊。對(duì)于需要分配大頁(yè)的時(shí)候這個(gè)功能非常重要,不過(guò),進(jìn)程會(huì)在需要時(shí)直接進(jìn)行內(nèi)存壓縮(compact memory)。
”修正
這里的compact與"壓縮(compress)"沒(méi)有半毛錢(qián)關(guān)系,compact是使得空閑內(nèi)存更加緊湊的內(nèi)存遷移技術(shù)。實(shí)現(xiàn)的效果如下:
假設(shè)紅色和白色分別是空閑和被占用的頁(yè)面,經(jīng)過(guò)內(nèi)存compaction之前的狀態(tài)為:
那么內(nèi)存的compact行為可以達(dá)到如下目的,空閑內(nèi)存被扎堆了,這樣如果要申請(qǐng)更大的連續(xù)內(nèi)存,則可以滿(mǎn)足:
如果要直譯,compact memory可以翻譯為“內(nèi)存緊湊”。但是絕對(duì)不是壓縮,因?yàn)閦RAM之類(lèi)的才是采用了壓縮技術(shù)。
2. cached和buffers的區(qū)別
網(wǎng)上常見(jiàn)文字:
“Buffers與cached啥區(qū)別
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
對(duì)于應(yīng)用程序來(lái)說(shuō),buffers/cached 是等于可用的,因?yàn)閎uffer/cached是為了提高文件讀取的性能,當(dāng)應(yīng)用程序需在用到內(nèi)存的時(shí)候,buffer/cached會(huì)很快地被回收。
所以從應(yīng)用程序的角度來(lái)說(shuō),可用內(nèi)存=系統(tǒng)free memory+buffers+cached.
”修正
此處極容易讓人產(chǎn)生誤解,以為free命令里面的buffers是為了寫(xiě)而產(chǎn)生,而cached是為了讀而產(chǎn)生。
真實(shí)情況下,cached和buffers與讀寫(xiě)沒(méi)有半毛錢(qián)關(guān)系,它們都是緩存,唯一的區(qū)別是,如果你cat /dev/sda1 > /dev/null,這樣/dev/sda1內(nèi)容進(jìn)入buffers,如果你cat /mnt/aaa/bbb.c > /dev/null,則/mnt/aaa/bbb.c的內(nèi)容進(jìn)入cached。所以,這兩種cache,一個(gè)以裸設(shè)備或分區(qū)為背景,一個(gè)以文件系統(tǒng)里面的文件為背景,無(wú)論讀寫(xiě)皆然。
buffers主要有2個(gè)用戶(hù):
-
應(yīng)用直接訪問(wèn)裸分區(qū)
-
文件系統(tǒng)本身的實(shí)現(xiàn),會(huì)認(rèn)為/dev/sda1是個(gè)裸設(shè)備,因此文件系統(tǒng)的metadata會(huì)緩存到buffers
3. PSS
許多人引用了關(guān)于pss的這個(gè)解釋?zhuān)?/p>
https://yq.aliyun.com/articles/24048
“PSS - Proportional Set Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)USS - Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫(kù)占用的內(nèi)存)
修正
這個(gè)文檔有3個(gè)問(wèn)題:
-
兩個(gè)進(jìn)程共享的部分,遠(yuǎn)遠(yuǎn)不是只有共享庫(kù),比如我們?cè)贚inux里面開(kāi)2個(gè)bash進(jìn)程,那么這2個(gè)bash,實(shí)際是共享1個(gè)代碼段;其他的mmap()的時(shí)候shared的映射當(dāng)然也是。
-
共享庫(kù)里面的內(nèi)存,也不是都共享,只是代碼段等不會(huì)做CoW(寫(xiě)時(shí)拷貝)的內(nèi)存才會(huì)跨進(jìn)程共享。
-
USS去掉的是所有跨進(jìn)程共享的內(nèi)存,不是只去掉了共享庫(kù)。
上圖中的4這片內(nèi)存,是libc的代碼段在內(nèi)存駐留的部分,被3個(gè)進(jìn)程共享;5這段內(nèi)存,是bash的代碼段,被2個(gè)進(jìn)程(1044和1045)指向。在計(jì)算PSS的時(shí)候,這些都需要被比例化。
-
Linux
+關(guān)注
關(guān)注
87文章
11227瀏覽量
208922 -
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
168瀏覽量
14125
原文標(biāo)題:宋寶華:網(wǎng)上坑爹的Linux資料匯總之內(nèi)存管理
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論