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