Linux cache參數(shù)調(diào)優(yōu)

緩存機(jī)制(cache)是保證Linux環(huán)境下對(duì)硬盤/flash操作效率的有效方式。cache建立在內(nèi)存中,它緩存了硬盤/flash的數(shù)據(jù),當(dāng)臟數(shù)據(jù)到達(dá)一定水限時(shí),再異步地將數(shù)據(jù)刷入硬盤。這可以加速進(jìn)程的文件系統(tǒng)訪問(wèn)操作。但是也有風(fēng)險(xiǎn),當(dāng)數(shù)據(jù)未寫入硬盤前設(shè)備重啟,存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

如果緩存相關(guān)參數(shù)設(shè)置得不好,對(duì)系統(tǒng)的運(yùn)行反而會(huì)有不良的影響。如果cache過(guò)大,當(dāng)需要把cache中的巨量數(shù)據(jù)刷入硬盤時(shí),會(huì)讓系統(tǒng)顯得卡頓,甚至無(wú)法調(diào)度線程。

Linux提供的接口,以支持修改cache容量。

參數(shù)說(shuō)明

cache中臟數(shù)據(jù)相關(guān)參數(shù)

sysctl -a | grep dirty可以看到一組相關(guān)的內(nèi)核參數(shù)

$ sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 600
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 100
  • vm.dirty_background_bytes:臟數(shù)據(jù)量達(dá)到此門限后,系統(tǒng)會(huì)開(kāi)始把臟數(shù)據(jù)寫入外存。此時(shí)臟數(shù)據(jù)可能仍然繼續(xù)寫入內(nèi)存。
  • vm.dirty_ratio:臟數(shù)據(jù)量達(dá)到此門限后,系統(tǒng)會(huì)阻塞式地將臟數(shù)據(jù)寫入外存,新的數(shù)據(jù)將被阻塞,無(wú)法寫入cache。
  • vm.dirty_background_bytesvm.dirty_bytes:與vm.dirty_background_bytes/vm.dirty_ratio類似,差異僅僅是門限的計(jì)數(shù)單位,不是內(nèi)存總量的百分比,而是bytes。注意_ratio與_bytes,有且僅有一個(gè)組能生效,如果一組被設(shè)置了非0值,另一組就應(yīng)該被置0。
  • vm.dirty_writeback_centisecs:表示間隔多長(zhǎng)時(shí)間,系統(tǒng)去檢查一次cache中的數(shù)據(jù)量是否超過(guò)門限值,以百分之一秒為單位。
  • vm.dirty_expire_centisecs:表示數(shù)據(jù)在cache中允許被緩存多長(zhǎng)時(shí)間。以百分之一秒為單位。

drop cache相關(guān)參數(shù)與操作

使用top命令,可以查看當(dāng)前系統(tǒng)中cache的大小。

# top
top - 16:50:19 up 4 days,  7:00, 22 users,  load average: 25.06, 24.12, 23.14
Tasks: 493 total,   7 running, 486 sleeping,   0 stopped,   0 zombie
%Cpu(s): 37.1 us, 18.9 sy,  0.0 ni, 42.3 id,  0.0 wa,  0.0 hi,  1.7 si,  0.0 st
KiB Mem : 65622752 total, 30293032 free, 29879144 used,  5450576 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 31415264 avail Mem 

使用echo 3 > /proc/sys/vm/drop_caches可以手動(dòng)清理cache。但這并不是一個(gè)好主意。cache有它存在的必要。假設(shè)一臺(tái)網(wǎng)頁(yè)服務(wù)器,在drop_cache之后,所有用戶訪問(wèn)的數(shù)據(jù)都將從硬盤中讀出,這會(huì)顯著地影響用戶訪問(wèn)網(wǎng)站的體驗(yàn)。

如果發(fā)現(xiàn)cache確實(shí)過(guò)大,我們應(yīng)該盡量使用系統(tǒng)提供的參數(shù)來(lái)調(diào)優(yōu),不采用主動(dòng)drop_cache的方式。

  • vm.vfs_cache_pressure:表示系統(tǒng)清理cache的“努力程度”。默認(rèn)值為100。越大則表示內(nèi)核會(huì)越頻繁地回收cache。

參數(shù)建議

在一臺(tái)內(nèi)存為64G,硬盤讀寫量長(zhǎng)期保持在500KB/s的服務(wù)器上,在未調(diào)優(yōu)前,經(jīng)常發(fā)生因系統(tǒng)回收cache導(dǎo)致的系統(tǒng)掛起。因此,我們考慮修改參數(shù),提高flush dirty和cache回收的頻率,避免臟數(shù)據(jù)與cache累積過(guò)多,一次性回收導(dǎo)致的系統(tǒng)掛起無(wú)響應(yīng)。

以下參數(shù)作參考:

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 600
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 100
vm.vfs_cache_pressure = 500
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容