cache大小與cache存取時間的關係(free-m中的cache是什麼為什麼會佔用那麼高)
2023-05-18 01:28:08
cache大小與cache存取時間的關係?"free -m" 命令的輸出結果中的 Cache 是什麼?,我來為大家科普一下關於cache大小與cache存取時間的關係?下面希望有你要的答案,我們一起來看看吧!
cache大小與cache存取時間的關係
環境紅帽企業 linux(所有版本)JBoss 企業應用程式平臺 (EAP) - 所有版本Issue什麼是Cache在free -m輸出以及為什麼內存利用率高cache?如何通過分析 Heap 創建新的 JBoss 伺服器實例所需的內存容量freeJBoss 中的命令輸出,如果已經有一個 JBoss 實例在運行?為什麼緩存使用了大量內存?緩存中經常充分利用物理內存解決"free -m" 命令的輸出結果中的 Cache 是什麼?
它表示當前被 Page chche 佔用的內存容量,即 RAM 容量。Page cache 是被放到 RAM 上的曾經讀或寫操作所用到的文件或實際數據的副本。
擁有緩存機制有什麼好處?當執行讀或者寫操作的時候,內核首先將所要的數據放到 RAM。
讀取操作: 去磁碟找到數據 --> 把數據從磁碟存到 RAM --> 執行讀操作
寫操作: - 去磁碟找到數據 --> 把數據從磁碟存到 RAM --> 執行寫操作 --> 把修改的數據複製到磁碟
不論是訪問外部存儲還是本地存儲,總是慢於直接訪問 RAM,因為磁碟讀取速度慢於 RAM 的讀取速度。如果某文件持續地被讀取或者修改,訪問磁碟是一種資源消耗。在 Cache 的幫助下,文件會在 RAM 保存一段時間,這樣就不用每次都去磁碟讀或者修改數據。經過一段時間後,Cache 上的數據會被同步到磁碟。把文件存到 RAM 裡大大提高了處理速度,因為與從本地磁碟訪問文件相比,它減少了大量的文件訪問時間。這也間接地提高了計算機的整體性能。下面的示例演示了緩存如何提高整體性能:
[root@sourcedb ~]# cat >aaa #寫入文件aaaadfaadfaadfa^C[root@sourcedb ~]# [root@sourcedb ~]# cat aaa #查看內容adfaadfaadfa[root@sourcedb ~]# sync[root@sourcedb ~]# echo 3 > /proc/sys/vm/drop_caches #清空cache如果您系統的 IO 操作頻繁,我們不建議您使用這條命令。請不要在生產環境中使用以下命令。[root@sourcedb ~]# time cat aaaadfaadfaadfareal 0m0.018s #實際為0.018suser 0m0.000ssys 0m0.006s[root@sourcedb ~]# time cat aaa adfaadfaadfareal 0m0.001s #實際為0.001s 從緩存中讀取速度明顯大於0.018user 0m0.000ssys 0m0.001s因此,只要有空閒內存,內核將始終嘗試利用它來將所需文件保存為緩存。
如果沒有可用 RAM 並且新進程需要可用 RAM,會發生什麼情況? 當一個新的進程需要 RAM 的空頁時,內核會檢查 cache 是否有空頁,並且把 cache 裡的文件同步到本地磁碟,從而收回空頁,釋放 RAM 給新的進程
有關「free -m」命令輸出的詳細說明:-
# free -m total used free shared buffers cachedMem: 3753 3455 298 0 144 664-/ buffers/cache: 2645 1107 <<-- Actual Free RAMSwap: 4095 75 4020
上述實例中,RAM 內存總量為 3753 MB。其中 3455 MB 被佔用,298 MB 為剩餘容量。在 "free -m" 輸出結果中,cache 和 buffers 也被算作實際佔用的 RAM 容量,但這並不符合事實。在被佔用的 3455 MB 內存中,一部分被用作 cache 或 buffer。如上所述,當沒有空餘的 RAM 容量分配給新進程時,就可以回收 cache 和 buffer 的內存。所以我們可以把 "Cache" 和 "buffer" 看作空餘 RAM。因此可以根據以下公式計算實際剩餘 RAM 的容量。Actual Free RAM = "free" "buffers" "cached" = 298 144 664 = 1106 在 "free -m" 命令輸出的第二行的 "free" 值約為 1107。為什麼 cache 要佔用那麼多的內存?
對於一個 Linux 虛擬內存管理器來說這是正常現象。為了理解為什麼在正常情況下cache內存那麼高,您必須先了解linux是如何處理 I/O的。當某用戶讀或者寫文件時,它實際上是修改主內存的副本。內核會在磁碟裡創建一個副本,必要時會對其修改。被這些副本所佔用的內存就叫做 cached memory。當用戶進程發起讀或者寫操作時,就會消耗 cache 內存。內核會查找用戶正在操作的文件副本,如果沒有的話,它會在 cache 裡分配出一個新的頁面,並且從磁碟裡讀出相應的數據填充它。如果用戶只是讀這個文件,這一頁會被標註成 "clean" cache 頁。然而,只要用戶寫該文件,這一頁會被標註成 "dirty"。出現在 ps 裡被稱做 pdflush 的內核線程會定期被喚醒,並將所有標記為 dirty 的頁面複製到磁碟,然後把它們標記為 clean。注意該頁面只能被重新標記為 clean,由於之後可能會對該文件做進一步的 IO 操作,該頁面被重新寫回時並不會被釋放。當內核需要內存時,cache 頁才會被釋放。我們沒有必要把 cache 頁轉換成空頁,因為從磁碟讀取 cache 頁可以加快 IO 速率,而且釋放一個 cache 頁和分配一個空頁一樣簡單,此外一個空頁對於系統執行也沒有任何作用。如果 cache 頁佔滿了內存,當下一次內核需要內存時,它會簡單地逐出最近最少使用的 clean 頁並重新利用它們。,