最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

memcached使用中避坑實例匯總

 更新時間:2023年06月25日 08:24:27   作者:及時  
這篇文章主要介紹了memcached使用中避坑實例匯總的相關資料,需要的朋友可以參考下

背景

線上啟用memcached(以下簡稱mc)作為熱點緩存組件已經(jīng)多年,其穩(wěn)定性和性能都經(jīng)歷住了考驗,這里記錄一下踩過的幾個坑。

大key存儲

某年某月某日,觀察mysql的讀庫CPU占比有些異常偏高,去check慢查詢log,發(fā)現(xiàn)部分應有緩存的慢sql居然存在幾秒執(zhí)行一次情況,不符合緩存數(shù)小時的代碼邏輯。
查看業(yè)務log在每次查詢sql之后也確實有將結果set至mc之中:

# python代碼
mc.set(cache_key, v, 3600)

而set返回的取值卻是False而非正常的True,很快想到mc著名的只可存儲不超過1MB大小的key限制,在以往的業(yè)務場景中沒有出現(xiàn)過這么大的key,所以一直沒達到過這個限制,直到這一次撞上。

要解決超過1MB大小的key存儲問題有以下幾個思路:

  • 想辦法將cache結果變小
  • 換個cache組件
  • mc >=1.4.2 版本其實已經(jīng)支持命令行參數(shù)-I指定最大key大小了,線上使用版本支持最小1KB最大128MB的設置
  • 將大key拆分為幾個子key,通過set_multi和get_multi實現(xiàn)統(tǒng)一的讀寫。

無論是通過2或3都可以支持更大的key存儲,但是更大的key存儲對于讀寫傳輸其實都更不友好,而思路4需要手動拆分、組裝子key略顯麻煩,所以優(yōu)先從思路1著手,意外發(fā)現(xiàn)python使用的memcached庫其實提供了key壓縮功能,在寫入時指定min_compress_len參數(shù)即可:

mc.set(key, v, time=expires, min_compress_len=1024)

如上表示寫入的v對象序列化大小若>=1024則啟用壓縮存儲,庫底層會將其壓縮后再寫入mc,讀取時庫底層也會自動解壓縮后再返回,業(yè)務層可以說完全無感,并且壓縮后還能極大降低存儲和傳輸成本。

最終通過min_compress_len參數(shù)啟用大key壓縮后,原1MB大小的key直瘦身了4/5。

slab鈣化

啟用大key壓縮后mc度過了好一段歲月靜好的日子,直到某一天...

大規(guī)模key分布變動導致的鈣化

查看zabbix上的相關監(jiān)控,發(fā)現(xiàn)mc的key查詢miss比例居然接近50%!這個緩存命中率著實讓人深思,進一步check后發(fā)現(xiàn)同時異常的指標還有evicted items數(shù),日常取值居然可以達到數(shù)百/S的級別。

mc官方文檔對evicted items的定義如下:

evicted                Number of times an item had to be evicted from the LRU before it expired.

即存儲的key在其實際過期前被從LRU強制清理了,這一般說明mc剩余可分配內(nèi)存不足了,所以新key寫入時只能先從LRU淘汰一部分key騰出空間后再給新key使用,但是查看mc的內(nèi)存使用率,明明還有超過>2GB的剩余內(nèi)存可用。

最終調查后真相大白:mc明明剩余大量內(nèi)存可用,寫入新key卻不斷導致舊key被提前清除的現(xiàn)象其實是mc特有的slab鈣化問題所致:

Memcached采用LRU(Least Recent Used)淘汰算法,在內(nèi)存容量滿時踢出過期失效和LRU數(shù)據(jù),為新數(shù)據(jù)騰出內(nèi)存空間。不過該淘汰算法在內(nèi)存空間不足以分配新的Slab情況下,這時只會在同一類Slab內(nèi)部踢出數(shù)據(jù)。即當某個Slab容量滿,且不能在內(nèi)存足夠分配新的Slab,只會在相同Slab內(nèi)部踢出數(shù)據(jù),而不會挪用或者踢出其他Slab的數(shù)據(jù)。這種局部剔除數(shù)據(jù)的淘汰算法帶來一個問題:Slab鈣化。

簡單來說memcached 使用的不同尺寸slab一旦分配完成就不可變了,所以如果某類slab已用盡,即便其他slab剩余大量空閑內(nèi)存也無法再對其加以利用。

業(yè)務這邊之前對使用mc的部分緩存key進行了整合優(yōu)化,在優(yōu)化之前單mc的全部5GB內(nèi)存均已根據(jù)key存儲情況分配給了特定的slab,而優(yōu)化之后大大降低了小key的數(shù)量,取而代之的是相對更緊湊的大key,key的數(shù)量和大小分布都發(fā)生了顯著的變化,于是原有的適用于大量小key的slab分配就無法滿足優(yōu)化后的key存儲了。

最終體現(xiàn)為,中等大小的slab內(nèi)存已被耗盡,每次寫入新key只能先通過LRU淘汰部分舊key騰出空間,體現(xiàn)為evicted數(shù)異常偏高,并且直接影響了緩存命中率,而小尺寸的slab卻長期大量空閑,體現(xiàn)為mc內(nèi)存使用剩余空間一直充足。

網(wǎng)上檢索解決鈣化問題有三個辦法:

1) 重啟Memcached實例,簡單粗暴,啟動后重新分配Slab class,但是如果是單點可能造成大量請求訪問數(shù)據(jù)庫,出現(xiàn)雪崩現(xiàn)象,沖跨數(shù)據(jù)庫。
2) 隨機過期:過期淘汰策略也支持淘汰其他slab class的數(shù)據(jù),twitter工程師采用隨機選擇一個Slab,釋放該Slab的所有緩存數(shù)據(jù),然后重新建立一個合適的Slab。
3) 通過slab_reassign、slab_authmove參數(shù)控制。

方法2看上去應是twitter的定制版mc Twemcache的特有功能,方法3則是線上mc已支持的方案,但首次接觸也不敢貿(mào)然直接在線上使用。

考慮到mc僅作為熱點緩存其數(shù)據(jù)可丟失,且部署有多臺分攤壓力,直接采用低峰時段分別重啟單個mc的策略解決,重啟后evicted item直接降為0,cache命中率升至90%上下。

少量大key變動導致的鈣化

首次鈣化之后又是一段歲月靜好,直到...

某段時間開始一個主要接口偶發(fā)耗時會突然飆升一下,對應機器的CPU使用也會瞬間飚高一小陣,查看zabbix監(jiān)控時,發(fā)現(xiàn)mc的 evicted items>0已持續(xù)好一段時間,但一直是個位數(shù)/S的級別,看著影響不大。

進一步執(zhí)行stats items命令,發(fā)現(xiàn)發(fā)生key evict的是最大的chunk_size=1048576 的slab 42,這也就是說存在大小在512KB~1MB之間的大key,同時當前mc分配的1MB slab個數(shù)已無法滿足其存儲,也無法再分配出新的1MB大小的slab,最終體現(xiàn)為對于大key的再次鈣化。

由于slab鈣化大key會被頻繁evict,對應緩存機制基本失效,所幸server端針對該類大key的讀取還做了一個短期的本地cache,避免了每次請求都穿透到db。

在某些特定時刻,當mc中對應大key失效且本地cache失效,對應請求又較多的時候,多個獨立的請求都會穿透到db獲取數(shù)據(jù),而后再寫入mc,無論是穿透到db獲取數(shù)據(jù)后本地進行相應的數(shù)據(jù)組裝處理邏輯,還是讀寫mc的壓縮、解壓縮數(shù)據(jù)操作,都比較耗CPU,最終會體現(xiàn)為api耗時增加,且CPU使用率也存在飚高的現(xiàn)象。

近期并沒有涉及大key讀寫的改動,那這次的大key slab鈣化又是怎么來的?進一步探查原因:觸發(fā)evict的大key近期確實無相關邏輯改動,但該部分舊key的大小和運營放出的資源多少直接相關,近一段時間放出的資源一直持續(xù)增加,舊key原本大小是<512KB,所以使用的是512KB的slab 41,近期持續(xù)增大為>512KB后,就只能使用1MB的slab 42存儲了,對于slab 42來說相當于在原有支持的大key數(shù)量基礎上又新的大key存儲需要支持,又由于slab鈣化無法再分配新的slab 42,最終觸發(fā)evict,cache命中率降低,api偶發(fā)耗時上升。

最終解決方案:還是在業(yè)務低峰期逐個重啟mc,觸發(fā)slab重分配即可。

總結

memcached作為一個開源的純內(nèi)存kv緩存組件,上手簡單、性能、穩(wěn)定性都有足夠保證,但是實際使用時也不可掉以輕心,對其相關監(jiān)控與關注不能少,對于其特有的最大key存儲限制、slab鈣化問題要有一定的認識并能及時處理。

參考

https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L637

https://github.com/memcached/memcached/wiki/ReleaseNotes142#configurable-maximum-item-size

https://www.jianshu.com/p/b91a45711460

https://blog.twitter.com/engineering/en_us/a/2012/caching-with-twemcache

https://www.cnblogs.com/AcAc-t/p/memcached_large_key_slab_calcification.html

https://bugwz.com/2020/05/24/memcached-slab-calcification/#2-2-2、Rebalance執(zhí)行邏輯

https://www.cnblogs.com/Leo_wl/p/3310294.html

到此這篇關于memcached使用中避坑實例匯總的文章就介紹到這了,更多相關memcached 踩的一些坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • php使用glob函數(shù)快速查詢指定目錄文件的方法

    php使用glob函數(shù)快速查詢指定目錄文件的方法

    這篇文章主要介紹了php使用glob函數(shù)快速查詢指定目錄文件的方法,可實現(xiàn)快速搜索指定格式文件的功能,非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • PHP+redis實現(xiàn)的悲觀鎖機制示例

    PHP+redis實現(xiàn)的悲觀鎖機制示例

    這篇文章主要介紹了PHP+redis實現(xiàn)的悲觀鎖機制,簡單介紹了redis鎖機制與樂觀鎖、悲觀鎖等概念,并結合實例形式分析了php+redis實現(xiàn)悲觀鎖相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • PHP二分查找算法的實現(xiàn)方法示例

    PHP二分查找算法的實現(xiàn)方法示例

    這篇文章主要介紹了PHP二分查找算法的實現(xiàn)方法,簡單分析了二分查找算法的原理,并結合具體實例形式給出了php基于循環(huán)與遞歸兩種方法實現(xiàn)二分查找的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • 允許phpmyadmin空密碼登錄的配置方法

    允許phpmyadmin空密碼登錄的配置方法

    在Mysql修改root密碼的命令及方法一文中,我提到了使用phpmyadmin修改Mysql的root密碼的方法,但是當你將phpmyadmin登錄密碼設置為空密碼時,盡管你通過Mysql命令行方式可以以空密碼進入Mysql,但是當你重新以空密碼登錄phpmyadmin時卻無法登陸
    2011-05-05
  • 讓PHP支持斷點續(xù)傳的源碼

    讓PHP支持斷點續(xù)傳的源碼

    其實說簡單點就是通過這個變量$_SERVER['HTTP_RANGE']取得用戶請求的文件的range,然后程序去控制文件的輸出。
    2010-05-05
  • dede3.1分頁文字采集過濾規(guī)則詳說(圖文教程)續(xù)四

    dede3.1分頁文字采集過濾規(guī)則詳說(圖文教程)續(xù)四

    dede3.1分頁文字采集過濾規(guī)則詳說(圖文教程)續(xù)四...
    2007-04-04
  • 有關 PHP 和 MySQL 時區(qū)的一點總結

    有關 PHP 和 MySQL 時區(qū)的一點總結

    由于暫時使用國外的空間,在我發(fā)布 Blog 的時候發(fā)現(xiàn)時間總是不對。依據(jù)我以前編寫程序的經(jīng)驗,這是時區(qū)的問題。這個問題解決起來并不難,寫下我的解決途徑以便日后參考。
    2008-03-03
  • php快速排序原理與實現(xiàn)方法分析

    php快速排序原理與實現(xiàn)方法分析

    這篇文章主要介紹了php快速排序原理與實現(xiàn)方法,結合實例形式分析了php快速排序的算法原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2016-05-05
  • php curl 模擬登錄并獲取數(shù)據(jù)實例詳解

    php curl 模擬登錄并獲取數(shù)據(jù)實例詳解

    cURL 是一個功能強大的PHP庫,使用PHP的cURL庫可以簡單和有效地抓取網(wǎng)頁并采集內(nèi)容,設置cookie完成模擬登錄網(wǎng)頁,curl提供了豐富的函數(shù),開發(fā)者可以從PHP手冊中獲取更多關于cURL信息。本文以模擬登錄開源中國(oschina)為例,需要的朋友可以參考下
    2016-12-12
  • PHP 觀察者模式的實現(xiàn)代碼

    PHP 觀察者模式的實現(xiàn)代碼

    以下案例是基于在PHP中觀察者模式的實現(xiàn)。需要的朋友參考下
    2013-05-05

最新評論

无极县| 佛学| 阿城市| 新丰县| 香港| 福贡县| 竹溪县| 廉江市| 桓台县| 原平市| 哈巴河县| 和林格尔县| 饶河县| 石棉县| 沙坪坝区| 德保县| 新和县| 中牟县| 呼玛县| 山东| 武汉市| 五莲县| 郴州市| 邢台市| 梁山县| 红桥区| 乌拉特后旗| 荥阳市| 普宁市| 兴仁县| 桂林市| 白河县| 凤山市| 汽车| 朔州市| 永泰县| 诸暨市| 长乐市| 肥东县| 龙口市| 剑河县|