Linux的快取機制及不同型別快取的操作方法

2021-08-10 11:36:43 字數 2648 閱讀 5927

1. linux中快取的用途

在linux系統中,為了提高檔案系統效能,核心利用一部分物理記憶體分配出緩衝區,用於快取系統操作和資料檔案,當核心收到讀寫的請求時,核心先去快取區找是否有請求的資料,有就直接返回,如果沒有則通過驅動程式直接操作磁碟。

快取機制優點

:減少系統呼叫次數,降低cpu上下文切換和磁碟訪問頻率。

cpu上下文切換

:cpu給每個程序一定的服務時間,當時間片用完後,核心從正在執行的程序中收回處理器,同時把程序當前執行狀態儲存下來,然後載入下乙個任務,這個過程叫做上下文切換。實質上就是被終止執行程序與待執行程序的程序切換。

2. 系統記憶體狀況及快取型別

通常我們在命令列中通過命令free -m即可檢視到系統記憶體的使用情況:

master:~$ free -m

total       used          free      shared    buffers     cached

mem:                 15972     14854     1118       6479       430       7110

-/+ buffers/cache:             7312       

8659

swap:                  16305       6431      9874

可以看出,系統記憶體為16g, swap記憶體16g. mem free雖然顯示為1118,因快取的存在,不能認為系統目前內剩下這麼多記憶體。而應該把buffers, cached的也算上,即free+cached+buffers=1118+7110+430=8658, 總記憶體再減去8658=7314,與buffers/cache行中對應free列的7312和8659基本一致。

buffers/cached/swap三類快取分別指什麼型別的快取,有什麼用途?

核心在保證系統能正常使用物理記憶體和資料量讀寫情況下來分配緩衝區大小。

buffers

用來快取metadata及pages,可以理解為系統快取,例如,vi開啟乙個檔案。

cached

用來給檔案做快取,可以理解為資料塊快取,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1g 測試寫入乙個檔案,就會被快取到緩衝區中,當下一次再執行這個測試命令時,寫入速度會明顯很快。

swap是交換分割槽,即通常我們說的虛擬記憶體,是從硬碟中劃分出的乙個分割槽。當物理記憶體不夠用的時候,核心就會釋放快取區(buffers/cache)裡一些長時間不用的程式,然後將這些程式臨時放到swap中,也就是說如果物理記憶體和快取區記憶體不夠用的時候,才會用到swap。

3. 不同快取的操作方法

3.1  buffer型別

核心提供了介面/proc/sys/vm/drop_caches及寫入不同的值來對不同型別的快取作清理,如1,2,3分別對應pagecache, dentries/inodes, and pagecache/dentries/inodes。

如 echo 1 > /proc/sys/vm/drop_caches or sysctl -w vm.drop_caches=1   // 清理頁面快取

上面三種方式都是臨時釋放快取的方法,要想永久釋放快取,需要在/etc/sysctl.conf檔案中配置:vm.drop_caches=1/2/3,然後sysctl -p生效即可!

echo方法時需要root許可權,sudo時也會報許可權不夠,只能通過sysctl來設定。

3.2 cache型別

主要針對檔案快取,資料塊等,sync命令可以用來作清除。也可清除殭屍程序物件和它們所佔的記憶體。

3.3 swap型別

針對交換分割槽的記憶體,可以通過開關來操作: swapoff -a && swapon -a  

這裡還有一篇詳細的swap引數調優: 

注意事項:

上面操作在大多數情況下都不會對系統造成傷害,只會有助於釋放不用的記憶體。

但是如果在執行這些操作時正在寫資料,那麼實際上在資料到達磁碟之前就將它從檔案快取中清除掉了,這可能會造成很不好的影響。那麼如果避免這種事情發生呢?

因此,這裡不得不提一下/proc/sys/vm/vfs_cache_pressure這個檔案,告訴核心,當清理inoe/dentry快取時應該用什麼樣的優先順序。

預設情況下,vfs_cache_pressure=100, 備註中的英文翻譯過來即:這個是預設值,核心會嘗試重新宣告dentries和inodes,並採用一種相對於頁面快取和交換快取比較」合理」的比例。

減少vfs_cache_pressure的值,會導致核心傾向於保留dentry和inode快取。

增加vfs_cache_pressure的值,(即超過100時),則會導致核心傾向於重新宣告dentries和inodes

這樣翻譯還不直觀,簡單地說,理解成保留block cache和inode cache的百分比 比較直接,設的越低,開啟檔案越慢,因為檔案快取少,可能開啟的沒在快取中。

附:1. suse lab工程師 2023年8月寫的一篇文章:     where is the memory going? memory wasteunder linux 

2. 」strom集群中頻繁建立檔案/stat檔案引起

cache占用過多記憶體導致linux系統記憶體不足的問題排查」 

不同型別的檔案

cpp檔案 cpp是用c 語言編寫的源 檔案的字尾 具體實現 h檔案 h是c語言和c 語言的標頭檔案 函式宣告,巨集定義,函式原型 pde檔案 一共有4種可能,分別為 1 powerdesk encrypted file 2 pathology data exchange file 3 afp pa...

C 不同型別的畫筆!

畫筆是可以與graphics物件一起用來建立實心形狀和呈現文字的物件。1.solidbrush 畫筆最簡單形式,用純色進行繪製。2.hatchbrush 類似與 1 但它可以選擇大量預設圖案,而不是純色。要命名空間 using system.drawing.drawing2d 3.texturebr...

不同型別Trigger的選擇

1.trigger 一般用於實現每隔一定時間執行任務,以及重複多少次,如每 60 秒執行一次,重複執行 6 次。問題 1 在使用過程中發現設定執行6次其實是執行7次,有一次是在開始執行的第 0 秒執行了一次,然後根據執行間隔再執行給定的執行次數。2 當有 misfired 的任務並且恢復執行時,該執...