全球微動(dòng)態(tài)丨memcached使用中踩的一些坑
時(shí)間:2023-06-25 10:08:03
線(xiàn)上啟用memcached(以下簡(jiǎn)稱(chēng)mc)作為熱點(diǎn)緩存組件已經(jīng)多年,其穩(wěn)定性和性能都經(jīng)歷住了考驗(yàn),這里記錄一下踩過(guò)的幾個(gè)坑。
(相關(guān)資料圖)
某年某月某日,觀(guān)察mysql的讀庫(kù)CPU占比有些異常偏高,去check慢查詢(xún)log,發(fā)現(xiàn)部分應(yīng)有緩存的慢sql居然存在幾秒執(zhí)行一次情況,不符合緩存數(shù)小時(shí)的代碼邏輯。查看業(yè)務(wù)log在每次查詢(xún)sql之后也確實(shí)有將結(jié)果set至mc之中:
# python代碼mc.set(cache_key, v, 3600)而set返回的取值卻是False而非正常的True,很快想到mc著名的只可存儲(chǔ)不超過(guò)1MB大小的key限制,在以往的業(yè)務(wù)場(chǎng)景中沒(méi)有出現(xiàn)過(guò)這么大的key,所以一直沒(méi)達(dá)到過(guò)這個(gè)限制,直到這一次撞上。要解決超過(guò)1MB大小的key存儲(chǔ)問(wèn)題有以下幾個(gè)思路:
想辦法將cache結(jié)果變小換個(gè)cache組件mc >=1.4.2 版本其實(shí)已經(jīng)支持命令行參數(shù)-I指定最大key大小了,線(xiàn)上使用版本支持最小1KB最大128MB的設(shè)置將大key拆分為幾個(gè)子key,通過(guò)set_multi和get_multi實(shí)現(xiàn)統(tǒng)一的讀寫(xiě)。無(wú)論是通過(guò)2或3都可以支持更大的key存儲(chǔ),但是更大的key存儲(chǔ)對(duì)于讀寫(xiě)傳輸其實(shí)都更不友好,而思路4需要手動(dòng)拆分、組裝子key略顯麻煩,所以?xún)?yōu)先從思路1著手,意外發(fā)現(xiàn)python使用的memcached庫(kù)其實(shí)提供了key壓縮功能,在寫(xiě)入時(shí)指定min_compress_len參數(shù)即可:
mc.set(key, v, time=expires, min_compress_len=1024)如上表示寫(xiě)入的v對(duì)象序列化大小若>=1024則啟用壓縮存儲(chǔ),庫(kù)底層會(huì)將其壓縮后再寫(xiě)入mc,讀取時(shí)庫(kù)底層也會(huì)自動(dòng)解壓縮后再返回,業(yè)務(wù)層可以說(shuō)完全無(wú)感,并且壓縮后還能極大降低存儲(chǔ)和傳輸成本。最終通過(guò)min_compress_len參數(shù)啟用大key壓縮后,原1MB大小的key直瘦身了4/5。
slab鈣化啟用大key壓縮后mc度過(guò)了好一段歲月靜好的日子,直到某一天...
大規(guī)模key分布變動(dòng)導(dǎo)致的鈣化查看zabbix上的相關(guān)監(jiān)控,發(fā)現(xiàn)mc的key查詢(xún)miss比例居然接近50%!這個(gè)緩存命中率著實(shí)讓人深思,進(jìn)一步check后發(fā)現(xiàn)同時(shí)異常的指標(biāo)還有evicted items數(shù),日常取值居然可以達(dá)到數(shù)百/S的級(jí)別。mc官方文檔對(duì)evicted items的定義如下:
evicted Number of times an item had to be evicted from the LRU before it expired.即存儲(chǔ)的key在其實(shí)際過(guò)期前被從LRU強(qiáng)制清理了,這一般說(shuō)明mc剩余可分配內(nèi)存不足了,所以新key寫(xiě)入時(shí)只能先從LRU淘汰一部分key騰出空間后再給新key使用,但是查看mc的內(nèi)存使用率,明明還有超過(guò)>2GB的剩余內(nèi)存可用。最終調(diào)查后真相大白:mc明明剩余大量?jī)?nèi)存可用,寫(xiě)入新key卻不斷導(dǎo)致舊key被提前清除的現(xiàn)象其實(shí)是mc特有的slab鈣化問(wèn)題所致:
Memcached采用LRU(Least Recent Used)淘汰算法,在內(nèi)存容量滿(mǎn)時(shí)踢出過(guò)期失效和LRU數(shù)據(jù),為新數(shù)據(jù)騰出內(nèi)存空間。不過(guò)該淘汰算法在內(nèi)存空間不足以分配新的Slab情況下,這時(shí)只會(huì)在同一類(lèi)Slab內(nèi)部踢出數(shù)據(jù)。即當(dāng)某個(gè)Slab容量滿(mǎn),且不能在內(nèi)存足夠分配新的Slab,只會(huì)在相同Slab內(nèi)部踢出數(shù)據(jù),而不會(huì)挪用或者踢出其他Slab的數(shù)據(jù)。這種局部剔除數(shù)據(jù)的淘汰算法帶來(lái)一個(gè)問(wèn)題:Slab鈣化。簡(jiǎn)單來(lái)說(shuō)memcached 使用的不同尺寸slab一旦分配完成就不可變了,所以如果某類(lèi)slab已用盡,即便其他slab剩余大量空閑內(nèi)存也無(wú)法再對(duì)其加以利用。業(yè)務(wù)這邊之前對(duì)使用mc的部分緩存key進(jìn)行了整合優(yōu)化,在優(yōu)化之前單mc的全部5GB內(nèi)存均已根據(jù)key存儲(chǔ)情況分配給了特定的slab,而優(yōu)化之后大大降低了小key的數(shù)量,取而代之的是相對(duì)更緊湊的大key,key的數(shù)量和大小分布都發(fā)生了顯著的變化,于是原有的適用于大量小key的slab分配就無(wú)法滿(mǎn)足優(yōu)化后的key存儲(chǔ)了。最終體現(xiàn)為,中等大小的slab內(nèi)存已被耗盡,每次寫(xiě)入新key只能先通過(guò)LRU淘汰部分舊key騰出空間,體現(xiàn)為evicted數(shù)異常偏高,并且直接影響了緩存命中率,而小尺寸的slab卻長(zhǎng)期大量空閑,體現(xiàn)為mc內(nèi)存使用剩余空間一直充足。網(wǎng)上檢索解決鈣化問(wèn)題有三個(gè)辦法:
1) 重啟Memcached實(shí)例,簡(jiǎn)單粗暴,啟動(dòng)后重新分配Slab class,但是如果是單點(diǎn)可能造成大量請(qǐng)求訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),出現(xiàn)雪崩現(xiàn)象,沖跨數(shù)據(jù)庫(kù)。2) 隨機(jī)過(guò)期:過(guò)期淘汰策略也支持淘汰其他slab class的數(shù)據(jù),twitter工程師采用隨機(jī)選擇一個(gè)Slab,釋放該Slab的所有緩存數(shù)據(jù),然后重新建立一個(gè)合適的Slab。3) 通過(guò)slab_reassign、slab_authmove參數(shù)控制。方法2看上去應(yīng)是twitter的定制版mc Twemcache的特有功能,方法3則是線(xiàn)上mc已支持的方案,但首次接觸也不敢貿(mào)然直接在線(xiàn)上使用??紤]到mc僅作為熱點(diǎn)緩存其數(shù)據(jù)可丟失,且部署有多臺(tái)分?jǐn)倝毫?,直接采用低峰時(shí)段分別重啟單個(gè)mc的策略解決,重啟后evicted item直接降為0,cache命中率升至90%上下。
少量大key變動(dòng)導(dǎo)致的鈣化首次鈣化之后又是一段歲月靜好,直到...某段時(shí)間開(kāi)始一個(gè)主要接口偶發(fā)耗時(shí)會(huì)突然飆升一下,對(duì)應(yīng)機(jī)器的CPU使用也會(huì)瞬間飚高一小陣,查看zabbix監(jiān)控時(shí),發(fā)現(xiàn)mc的 evicted items>0已持續(xù)好一段時(shí)間,但一直是個(gè)位數(shù)/S的級(jí)別,看著影響不大。進(jìn)一步執(zhí)行stats items命令,發(fā)現(xiàn)發(fā)生key evict的是最大的chunk_size=1048576 的slab 42,這也就是說(shuō)存在大小在512KB~1MB之間的大key,同時(shí)當(dāng)前mc分配的1MB slab個(gè)數(shù)已無(wú)法滿(mǎn)足其存儲(chǔ),也無(wú)法再分配出新的1MB大小的slab,最終體現(xiàn)為對(duì)于大key的再次鈣化。由于slab鈣化大key會(huì)被頻繁evict,對(duì)應(yīng)緩存機(jī)制基本失效,所幸server端針對(duì)該類(lèi)大key的讀取還做了一個(gè)短期的本地cache,避免了每次請(qǐng)求都穿透到db。在某些特定時(shí)刻,當(dāng)mc中對(duì)應(yīng)大key失效且本地cache失效,對(duì)應(yīng)請(qǐng)求又較多的時(shí)候,多個(gè)獨(dú)立的請(qǐng)求都會(huì)穿透到db獲取數(shù)據(jù),而后再寫(xiě)入mc,無(wú)論是穿透到db獲取數(shù)據(jù)后本地進(jìn)行相應(yīng)的數(shù)據(jù)組裝處理邏輯,還是讀寫(xiě)mc的壓縮、解壓縮數(shù)據(jù)操作,都比較耗CPU,最終會(huì)體現(xiàn)為api耗時(shí)增加,且CPU使用率也存在飚高的現(xiàn)象。近期并沒(méi)有涉及大key讀寫(xiě)的改動(dòng),那這次的大key slab鈣化又是怎么來(lái)的?進(jìn)一步探查原因:觸發(fā)evict的大key近期確實(shí)無(wú)相關(guān)邏輯改動(dòng),但該部分舊key的大小和運(yùn)營(yíng)放出的資源多少直接相關(guān),近一段時(shí)間放出的資源一直持續(xù)增加,舊key原本大小是<512KB,所以使用的是512KB的slab 41,近期持續(xù)增大為>512KB后,就只能使用1MB的slab 42存儲(chǔ)了,對(duì)于slab 42來(lái)說(shuō)相當(dāng)于在原有支持的大key數(shù)量基礎(chǔ)上又新的大key存儲(chǔ)需要支持,又由于slab鈣化無(wú)法再分配新的slab 42,最終觸發(fā)evict,cache命中率降低,api偶發(fā)耗時(shí)上升。最終解決方案:還是在業(yè)務(wù)低峰期逐個(gè)重啟mc,觸發(fā)slab重分配即可。
memcached作為一個(gè)開(kāi)源的純內(nèi)存kv緩存組件,上手簡(jiǎn)單、性能、穩(wěn)定性都有足夠保證,但是實(shí)際使用時(shí)也不可掉以輕心,對(duì)其相關(guān)監(jiān)控與關(guān)注不能少,對(duì)于其特有的最大key存儲(chǔ)限制、slab鈣化問(wèn)題要有一定的認(rèn)識(shí)并能及時(shí)處理。轉(zhuǎn)載請(qǐng)注明出處,原文地址:https://www.cnblogs.com/AcAc-t/p/memcached_large_key_slab_calcification.html
參考https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L637https://github.com/memcached/memcached/wiki/ReleaseNotes142#configurable-maximum-item-sizehttps://www.jianshu.com/p/b91a45711460https://blog.twitter.com/engineering/en_us/a/2012/caching-with-twemcachehttps://www.cnblogs.com/AcAc-t/p/memcached_large_key_slab_calcification.htmlhttps://bugwz.com/2020/05/24/memcached-slab-calcification/#2-2-2、Rebalance執(zhí)行邏輯https://www.cnblogs.com/Leo_wl/p/3310294.html
相關(guān)稿件
全球微動(dòng)態(tài)丨memcached使用中踩的一些坑
張本美和打瘋了!連扳3局逆轉(zhuǎn)世界冠軍,父親坐鎮(zhèn)場(chǎng)外指導(dǎo)女兒
深化科技金融特色 推動(dòng)“武漢模式”升級(jí)——訪(fǎng)漢口銀行董事長(zhǎng)陳新民
好客山東丨五年來(lái)“最火熱”端午山東數(shù)據(jù)亮眼 重點(diǎn)景區(qū)接待游客419.8萬(wàn)人次
視點(diǎn)!1.06億人次出游、收入373.10億元!端午旅游趕超疫情前 業(yè)者期待暑期游
焦點(diǎn)短訊!600993股票行情行情首頁(yè) 600990股票行情
豪宅逆市熱銷(xiāo),揭秘富人買(mǎi)房邏輯|世界今亮點(diǎn)
每日速讀!商務(wù)部:端午假期消費(fèi)市場(chǎng)持續(xù)升溫 消費(fèi)潛力有效釋放
最資訊丨蘭州新區(qū)舉辦客運(yùn)行業(yè)職工職業(yè)技能大賽
世界今日訊!鄭東新區(qū)白沙鎮(zhèn):輕松一拍,“智慧城市管理”不再是難題
【厚植高質(zhì)量發(fā)展沃土——大力開(kāi)展優(yōu)化營(yíng)商環(huán)境攻堅(jiān)突破年行動(dòng)】清水 環(huán)境有溫度 項(xiàng)目加速度
"正經(jīng)與色心并存!揭示四大生肖中外表正經(jīng)私底下色香味俱全的情色達(dá)人!"|環(huán)球熱點(diǎn)
祝幸福?拉波爾特與女友舉行婚禮,哈蘭德&羅德里等人參加_世界快報(bào)
若哈特執(zhí)行1290萬(wàn)球員選項(xiàng) 尼克斯可提供四年8100萬(wàn)續(xù)約報(bào)價(jià)
焦點(diǎn)熱訊:2023胡潤(rùn)中國(guó)新能源產(chǎn)業(yè)集聚度城市榜發(fā)布
環(huán)球百事通!生肖蛇7月17日起行大運(yùn)發(fā)大財(cái),事業(yè)順心,喜事連連!
海博思創(chuàng)啟動(dòng)科創(chuàng)板IPO!儲(chǔ)能系統(tǒng)業(yè)務(wù)年復(fù)合增長(zhǎng)率219.27%! 焦點(diǎn)快看
“月入過(guò)萬(wàn)”?同學(xué),這樣的“兼職”做不得!
認(rèn)真聊一下,恒大北極星的5個(gè)領(lǐng)取方案
新動(dòng)態(tài):提質(zhì)效,優(yōu)服務(wù)!馬巒街道推動(dòng)黨群服務(wù)更利民便民
今日最新!新疆和田地區(qū)皮山縣發(fā)生3.3級(jí)地震
女生考前3天連續(xù)失眠 一查684分落淚:激動(dòng)到不行 網(wǎng)友祝賀
西康指揮部組織西康高鐵4標(biāo)項(xiàng)目開(kāi)展防洪防汛應(yīng)急演練
教育頻道
筆記本為何要配大內(nèi)存?實(shí)測(cè)告訴你答案
【環(huán)球新視野】2023藏游啤酒文化音樂(lè)節(jié)舉行
全球聚焦:文萊啟動(dòng)5G網(wǎng)絡(luò)商用服務(wù) 中國(guó)企業(yè)作出貢獻(xiàn)
俄媒:反制日本,普京簽令將9月3日更名為對(duì)日本軍國(guó)主義戰(zhàn)爭(zhēng)勝利紀(jì)念日
發(fā)動(dòng)救援隊(duì),出動(dòng)無(wú)人機(jī)!廈門(mén)一走失超24小時(shí)老人被找回 焦點(diǎn)快看
今明兩天蘭州市以陣雨轉(zhuǎn)晴天氣為主 出門(mén)莫忘帶上雨傘
119.9!2023浙江開(kāi)放指數(shù)正式發(fā)布-每日熱訊
記者直擊丨莫斯科紅場(chǎng)附近街區(qū)夜間行人較往常明顯減少|(zhì)環(huán)球播資訊


