服務器buffer/cache 的產生原因和釋放buffer/cache


一、什么是buffer/cache?

buffer/cache 其實是作為服務器系統的文件數據緩存使用的,尤其是針對進程對文件存在 read/write 操作的時候,所以當你的服務進程在對文件進行讀寫的時候,Linux內核為了提高服務的讀寫速度,則將會把文件放在此處的 buffer/cache 中進行緩存使用,由於 Linux服務的特點便是任何事物都會以文件的形式進行存在,所以你會發現不管你是否對文件做了大規模的讀寫,機器的 buffer/cache 是一直都存在的,並且持續的增高不下,這是因為服務器所產生的網絡連接也好,用戶協議的(UDP)套接字也好,這部分的數據系統都會為應用程序創建對應的文件描述符,而這些文件描述符的使用,則又都會重新進入 buffer/cache 中做讀寫使用,所以這也是你的機器始終都會存在較高 buffer/cache 的原因!(因為所有的文件讀寫都會用到 buffer/cache,在內存合理的情況下)

二、什么是page cache?

Page cache主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有read/write操作的時候。如果你仔細想想的話,作為可以映射文件到內存的系統調用:mmap是不是很自然的也應該用到page cache?在當前的系統實現里,page cache也被作為其它文件類型的緩存設備來用,所以事實上page cache也負責了大部分的塊設備文件的緩存工作。

三、buffer/cache 需要注意的一些特點

在服務內存夠用的情況下,Linux內核為了加快對文件的讀寫效率會將文件放入之 buffer/cache 中 以保證讀寫效率,但其實,盡管當你的應用程序對文件的讀寫運行結束后,buffer/cache 也不會自動釋放該部分內存,而是作為緩沖進行保留,等到你的服務進程在下一次進行相同文件的讀寫時就可以直接使用,省去了各種重新進行內存初始化的操作;所以這將會導致,當你的應用進程頻繁對不同的文件進行讀寫時,你會發現服務所可以直接使用的free內存將會越來越少的一個重要原因;難道 buffer/cache 在這樣無休止的緩存當中就不會自動釋放?當然不是,當服務器在內存壓力較大的情況下時,則將會自動進行內存的回收,作為free空間分給其它進程使用,這其中主要回收的一個內存則是 buffer/cache 的緩沖區內存塊;

四、如何進行手動 buffer/cache 回收?

除了在系統進程內存使用較大壓力的情況下進行內存的回收外,我們也可以進行手動的buffer/cache回收,但由於buffer/cache主要是用於文件的讀寫使用,所以進行文件回收時,一般常伴隨系統的IO彪高,因為系統內核也對比cache中的數據與硬盤中的數據是否一致,如果不一致需要寫入,然后才能進行內存的回收;

$ sync
# 將內存中數據強制先刷新到磁盤中

清理Buffer緩存區域
$ echo 1 > /proc/sys/vm/drop_caches  # 表示清除pagecache。
$ echo 2 > /proc/sys/vm/drop_caches  # 表示清除回收slab分配器中的對象(包括目錄項緩存和inode緩存)。slab分配器是內核中管理內存的一種機制,其中很多緩存數據實現都是用的pagecache。
$ echo 3 > /proc/sys/vm/drop_caches  # 表示清除pagecache和slab分配器中的緩存對象

五、buffer/cache 過高如何排查是由那幾個進程引起的

5.1 hcache安裝

$ wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache -O /usr/local/bin/hcache ;\
chmod +x /usr/local/bin/hcache

5.2 hcache常用命令

$ hcache --top 10           # 全局顯示10個最大的被緩存文件
$ lsof /usr/lib/vmware-tools/lib64/libxerces-c-3.1.so/libxerces-c-3.1.so
# 根據文件找到對應的進程、pid
$ hcache -pid 1070   # 獲取當前進程號所打開的所有文件信息
$ lsof -p 1070     # 獲取當前進程號所打開的所有文件信息(二選一)

lsof命令使用參考網址:https://man.linuxde.net/lsof


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM