背景
我的問題基本上就是這個問題的後續問題和回答,特別是這個評論。
每當我必須複製或 rsync 大量檔案時,系統上的記憶體往往會被填滿,因此我運行以下腳本(以 root 身份運行):
while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;
問題
- 這會以任何方式損害系統,或造成任何負面影響嗎? (特別是,引用的評論中提到的「風險」是什麼?)
- 如果答案是「否」(這就是我的懷疑),那麼為什麼 Linux 預設不自動執行這個命令呢? (我沒有看到任何明顯的變化,我只注意到我沒有耗盡內存......)
答案1
因為刪除快取從來沒有任何好處。忘記事情並不是收穫所在。好處在於重複使用內存,無論如何這都會發生。因為某些點資料將從記憶體中清除。
然而,執行這些大型作業可能會對效能造成損害:如果資料被快取但從未重新使用,那麼它會導致其他資料被逐出,而沒有任何好處。
因此,您需要在沒有快取的情況下運行作業(不幸的是我不記得執行此操作的命令)。
答案2
為什麼Linux不自動清除快取?
它會。
ron> free -g
total used free shared buffers cached
Mem: 504 415 88 1 0 352
-/+ buffers/cache: 62 441
Swap: 0 0 0
快取記憶體仍應被視為空閒記憶體。
當 free 減少到 0 時,就會從快取中拉取。
這會以任何方式損害系統,或造成任何負面影響嗎?
危害=不。研究echo 3 > /proc/sys/vm/drop_caches
你會發現它是一個非破壞性的手術。
負面影響是由於必須從磁碟上讀取快取中的內容而導致效能損失。例如編寫一個讀取 10GB 資料檔的 C 程式。第一次運行它會很慢,因為它從磁碟讀取,但之後的任何時候都會快得多,因為該資料檔案緩存在記憶體中。刪除緩存,程式讀取資料檔案的下一次後續運行將像第一次運行一樣緩慢。這是很容易觀察和重複的。
如果答案是否定的,那麼為什麼 Linux 預設不自動執行這個指令呢?
您必須詳細說明您如何以及在何處看到這種情況發生。我在目前的 linux(例如 RHEL/CentOS 7.7)上不知道它。但較舊的 Linux(例如 3.x 之前的核心)可能是該發行版在快取不如現在強大時做出的決定(在我看來)。幾年前使用 SLES 11.4,我很確定 SuSE 的人沒有編寫程式碼來自動刪除緩存,但對於一些工作伺服器,我讓我們購買它們並當時為我們配置 SLES 的人做了一個 crontab進行週期性的丟棄緩存,對於為什麼這樣做是一個灰色地帶。我懷疑這是一種持家態度=良好的心態,因為它從來都不是一個破壞性的命令,不會真正造成傷害。我在 sles 11.4 上手動執行的幾次操作echo 3 > drop_caches
是為了進行故障排除,因為它從未真正解決任何最終需要重新啟動的問題。
查看 RHEL 效能調整指南和調整虛擬記憶體。我不知道其中有多少是 RHEL 特定的,而不是足夠低階的,所有 Linux 核心都相關,而不是特定於 Linux 發行版。另外,從核心 2.6 到 3.x,再到 4.x,我確信在這方面發生的變化很重要,因此請考慮閱讀 Linux 核心發行說明。