不知道剛使用Linux的小伙伴有沒有遇到過這樣的情況,有一天你看到自己的記憶體空間變少了,在一探究竟后,發現幕后“真兇”竟然是Linux!這到底怎么回事呢?
發生了什么事?
其實這是Linux正在借用未使用的記憶體進行磁盤快取,這意味著記憶體看起來變少了,但實際上并沒有,Linux之所有這么做,主要是為了讓系統運行的更快,更流暢,除了讓新手感到困惑外,它不會以任何方式占用應用程式的記憶體,
我如果想運行更多的應用程式怎么辦?
當然,Linux確實借用了你的記憶體,注意這里是借用,不是占用,當應用程式需要更多的記憶體運行時,它們可以拿回被Linux借去用來做磁盤快取的那塊記憶體,Linux只是暫時借用,所以它可以立即將借走的記憶體還給應用程式,你的記憶體并沒有實質上的減少,
我需要更多的swap空間嗎?
Linux磁盤快取只是借用了應用程式目前不需要的記憶體,它不會使用Swap空間,如果應用程式需要更多的記憶體,只需要從磁盤快取中取回就可以了,這個程序不會用到Swap空間,
我就想禁止磁盤快取,這樣做有害嗎?
可能你還是覺得Linux占用了你的應用程式記憶體,所以你就想阻止Linux進行磁盤快取,但你最好別這么做,因為Linux進行磁盤快取會使應用程式的加載速度更快,運行更流暢,除非你不希望它更快,更流暢,磁盤快取在實質上永遠都不會占用記憶體,所以你也沒理由禁用它,
當然,如果你發現自己需要通過清除一些記憶體來解決一個問題的時候,比如說你的虛擬機不聽你的話了,你就可以用下面的這個命令來無損的洗掉Linux的磁盤快取,
echo 3 | sudo tee /proc/sys/vm/drop_caches
為什么top和free說我所有的記憶體都用完了,而實際上并沒有?
這只是一個對術語理解上的差異,你和Linux系統都有一個共同的默認點,認為只要是被應用程式占用了那就是 "使用的",而沒有被占用的記憶體就是 "空閑的"或者說是"可用的",由于磁盤快取占用了記憶體,所以在你的眼里這部分記憶體都是"使用的",但在Linux眼里它們既是"使用的"也是"可用的",也就是top和free里的"緩沖區"和"快取",這就是我所說的對術語理解的差異,由于這個理解差異的存在,所以你才會認為記憶體不足,但實際上并非如此,

圖片來源VidarHolen.net
那到底還有多少記憶體呢?
要想知道你的應用程式在不交換的情況下可以使用多少記憶體,可以運行free -m并查看 "available"欄,這些資料的單位是MiB,
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 792
Swap: 2047 6 2041
(如果你的Linux是2016年以前的版本,請看"-/+緩沖區/快取 "行中的 "free "列,)
就像上面的查詢看到的一樣,如果你非常天真地只看"已用"和"空閑",你就會認為你的記憶體已經用掉了99%,基本滿了,可是實際上它只用了47%,也就是說你的認知記憶體和實際記憶體相差了52%!
什么時候應該擔心記憶體不足?
一個健康的,有足夠記憶體的Linux系統,在運行一段時間后,會出下以下無害的行為,
- free可用記憶體接近于0
- used記憶體接近于total
- acailable(或 "free+buffers/cache")有足夠的空間(比方說,占總數的20%以上),
- 使用的swap空間沒有變化
而當系統真正進入低記憶體的狀態,會出現以下的警告信號,
- available記憶體(或 "free+buffers/cache")接近于零
- 使用的swap空間增加或波動
- dmesg | grep oom-killer顯示 OutOfMemory-killer 在作業,
Linux并不會偷偷"吃"掉你的記憶體,它只是再用磁盤快取這種方式讓你的系統運行的更快,更流暢,提高你的使用體驗,僅此而已,
了解"可用"的詳細描述:kernel/git/torvalds/linux.git - Linux kernel source tree
驗證磁盤快取相關特性:Experiments and fun with the Linux disk cache
參考鏈接:Help! Linux ate my RAM!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/392118.html
標籤:其他
