主頁 > 資料庫 > memcached使用中踩的一些坑

memcached使用中踩的一些坑

2023-06-25 08:13:41 資料庫

背景

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

大key存盤

某年某月某日,觀察mysql的讀庫CPU占比有些例外偏高,去check慢查詢log,發現部分應有快取的慢sql居然存在幾秒執行一次情況,不符合快取數小時的代碼邏輯,
查看業務log在每次查詢sql之后也確實有將結果set至mc之中:

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

而set回傳的取值卻是False而非正常的True,很快想到mc著名的只可存盤不超過1MB大小的key限制,在以往的業務場景中沒有出現過這么大的key,所以一直沒達到過這個限制,直到這一次撞上,
要解決超過1MB大小的key存盤問題有以下幾個思路:

  1. 想辦法將cache結果變小
  2. 換個cache組件
  3. mc >=1.4.2 版本其實已經支持命令列引數-I指定最大key大小了,線上使用版本支持最小1KB最大128MB的設定
  4. 將大key拆分為幾個子key,通過set_multi和get_multi實作統一的讀寫,

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

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

如上表示寫入的v物件序列化大小若>=1024則啟用壓縮存盤,庫底層會將其壓縮后再寫入mc,讀取時庫底層也會自動解壓縮后再回傳,業務層可以說完全無感,并且壓縮后還能極大降低存盤和傳輸成本,
最終通過min_compress_len引數啟用大key壓縮后,原1MB大小的key直瘦身了4/5,

slab鈣化

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

大規模key分布變動導致的鈣化

查看zabbix上的相關監控,發現mc的key查詢miss比例居然接近50%!這個快取命中率著實讓人深思,進一步check后發現同時例外的指標還有evicted items數,日常取值居然可以達到數百/S的級別,
mc官方檔案對evicted items的定義如下:

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

即存盤的key在其實際過期前被從LRU強制清理了,這一般說明mc剩余可分配記憶體不足了,所以新key寫入時只能先從LRU淘汰一部分key騰出空間后再給新key使用,但是查看mc的記憶體使用率,明明還有超過>2GB的剩余記憶體可用,
最終調查后真相大白:mc明明剩余大量記憶體可用,寫入新key卻不斷導致舊key被提前清除的現象其實是mc特有的slab鈣化問題所致:

Memcached采用LRU(Least Recent Used)淘汰演算法,在記憶體容量滿時踢出過期失效和LRU資料,為新資料騰出記憶體空間,不過該淘汰演算法在記憶體空間不足以分配新的Slab情況下,這時只會在同一類Slab內部踢出資料,即當某個Slab容量滿,且不能在記憶體足夠分配新的Slab,只會在相同Slab內部踢出資料,而不會挪用或者踢出其他Slab的資料,這種區域剔除資料的淘汰演算法帶來一個問題:Slab鈣化,

簡單來說memcached 使用的不同尺寸slab一旦分配完成就不可變了,所以如果某類slab已用盡,即便其他slab剩余大量空閑記憶體也無法再對其加以利用,
業務這邊之前對使用mc的部分快取key進行了整合優化,在優化之前單mc的全部5GB記憶體均已根據key存盤情況分配給了特定的slab,而優化之后大大降低了小key的數量,取而代之的是相對更緊湊的大key,key的數量和大小分布都發生了顯著的變化,于是原有的適用于大量小key的slab分配就無法滿足優化后的key存盤了,
最終體現為,中等大小的slab記憶體已被耗盡,每次寫入新key只能先通過LRU淘汰部分舊key騰出空間,體現為evicted數例外偏高,并且直接影響了快取命中率,而小尺寸的slab卻長期大量空閑,體現為mc記憶體使用剩余空間一直充足,
網上檢索解決鈣化問題有三個辦法:

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

方法2看上去應是twitter的定制版mc Twemcache的特有功能,方法3則是線上mc已支持的方案,但首次接觸也不敢貿然直接在線上使用,
考慮到mc僅作為熱點快取其資料可丟失,且部署有多臺分攤壓力,直接采用低峰時段分別重啟單個mc的策略解決,重啟后evicted item直接降為0,cache命中率升至90%上下,

少量大key變動導致的鈣化

首次鈣化之后又是一段歲月靜好,直到...
某段時間開始一個主要介面偶發耗時會突然飆升一下,對應機器的CPU使用也會瞬間飚高一小陣,查看zabbix監控時,發現mc的 evicted items>0已持續好一段時間,但一直是個位數/S的級別,看著影響不大,
進一步執行stats items命令,發現發生key evict的是最大的chunk_size=1048576 的slab 42,這也就是說存在大小在512KB~1MB之間的大key,同時當前mc分配的1MB slab個數已無法滿足其存盤,也無法再分配出新的1MB大小的slab,最終體現為對于大key的再次鈣化,
由于slab鈣化大key會被頻繁evict,對應快取機制基本失效,所幸server端針對該類大key的讀取還做了一個短期的本地cache,避免了每次請求都穿透到db,
在某些特定時刻,當mc中對應大key失效且本地cache失效,對應請求又較多的時候,多個獨立的請求都會穿透到db獲取資料,而后再寫入mc,無論是穿透到db獲取資料后本地進行相應的資料組裝處理邏輯,還是讀寫mc的壓縮、解壓縮資料操作,都比較耗CPU,最侄訓體現為api耗時增加,且CPU使用率也存在飚高的現象,
近期并沒有涉及大key讀寫的改動,那這次的大key slab鈣化又是怎么來的?進一步探查原因:觸發evict的大key近期確實無相關邏輯改動,但該部分舊key的大小和運營放出的資源多少直接相關,近一段時間放出的資源一直持續增加,舊key原本大小是<512KB,所以使用的是512KB的slab 41,近期持續增大為>512KB后,就只能使用1MB的slab 42存盤了,對于slab 42來說相當于在原有支持的大key數量基礎上又新的大key存盤需要支持,又由于slab鈣化無法再分配新的slab 42,最終觸發evict,cache命中率降低,api偶發耗時上升,
最終解決方案:還是在業務低峰期逐個重啟mc,觸發slab重分配即可,

總結

memcached作為一個開源的純記憶體kv快取組件,上手簡單、性能、穩定性都有足夠保證,但是實際使用時也不可掉以輕心,對其相關監控與關注不能少,對于其特有的最大key存盤限制、slab鈣化問題要有一定的認識并能及時處理,
轉載請注明出處,原文地址:https://www.cnblogs.com/AcAc-t/p/memcached_large_key_slab_calcification.html

參考

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執行邏輯
https://www.cnblogs.com/Leo_wl/p/3310294.html

簽名:擁抱開源,擁抱自由

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/555890.html

標籤:NoSQL

上一篇:鎖(理論篇)

下一篇:返回列表

標籤雲
其他(161551) Python(38244) JavaScript(25513) Java(18251) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7266) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • memcached使用中踩的一些坑

    ## 背景 線上啟用memcached(以下簡稱mc)作為熱點快取組件已經多年,其穩定性和性能都經歷住了考驗,這里記錄一下踩過的幾個坑。 ## 大key存盤 某年某月某日,觀察mysql的讀庫CPU占比有些例外偏高,去check慢查詢log,發現部分應有快取的慢sql居然存在幾秒執行一次情況,不符合 ......

    uj5u.com 2023-06-25 08:13:41 more
  • 鎖(理論篇)

    # MVCC機制遺留的問題 **為什么在可重復讀級別下,幻讀沒有產生?** 回想一下在事務隔離級別那篇文章中,可串行化是通過什么保證的? 對操作的每一行記錄加讀鎖、寫鎖和范圍鎖;任何其他事務都必須等待持有鎖的事務釋放鎖之后才能進行操作; 而可重復讀級別相比之下唯一少的就是范圍鎖,所以無論你是否了解過 ......

    uj5u.com 2023-06-25 08:13:27 more
  • 分庫分表 21 招

    (一)好好的系統,為什么要分庫分表? 咱們先介紹下在分庫分表架構實施程序中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫分表工具,盡管它們的實作方法可能存在差異,但整體思路基本一致。因此,在開始實際操作之前,我們有必要先掌握這些通用概念,以便更好地理解和應用分庫分表技術。 我們結 ......

    uj5u.com 2023-06-24 08:25:17 more
  • Elasticsearch核心應用場景-日志優化實踐

    1. 背景 日志領域是Elasticsearch(ES)最重要也是規模最大的應用場景之一。這得益于 ES 有高性能倒排索引、靈活的 schema、易用的分布式架構,支持高吞吐寫入、高性能查詢,同時有強大的資料治理生態、端到端的完整解決方案。但原生 ES 在高吞吐寫入、低成本存盤、高性能查詢等方面還有 ......

    uj5u.com 2023-06-24 08:13:06 more
  • 分庫分表 21 招

    (一)好好的系統,為什么要分庫分表? 咱們先介紹下在分庫分表架構實施程序中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫分表工具,盡管它們的實作方法可能存在差異,但整體思路基本一致。因此,在開始實際操作之前,我們有必要先掌握這些通用概念,以便更好地理解和應用分庫分表技術。 我們結 ......

    uj5u.com 2023-06-24 08:12:12 more
  • Elasticsearch核心應用場景-日志優化實踐

    1. 背景 日志領域是Elasticsearch(ES)最重要也是規模最大的應用場景之一。這得益于 ES 有高性能倒排索引、靈活的 schema、易用的分布式架構,支持高吞吐寫入、高性能查詢,同時有強大的資料治理生態、端到端的完整解決方案。但原生 ES 在高吞吐寫入、低成本存盤、高性能查詢等方面還有 ......

    uj5u.com 2023-06-24 08:05:19 more
  • 2-Redis概述

    ?![image](https://img2023.cnblogs.com/blog/2942345/202306/2942345-20230622081504394-95093556.png)? ? # 1. 應用場景 ? ## 1.1 配合關系型資料庫做高速快取 ? - 高頻次,熱門訪問的資料, ......

    uj5u.com 2023-06-22 08:37:52 more
  • 2-Redis概述

    ?![image](https://img2023.cnblogs.com/blog/2942345/202306/2942345-20230622081504394-95093556.png)? ? # 1. 應用場景 ? ## 1.1 配合關系型資料庫做高速快取 ? - 高頻次,熱門訪問的資料, ......

    uj5u.com 2023-06-22 08:31:44 more
  • MySQL 8的MGR集群中設定autocommit=0引起ERROR 1064 (42000)錯誤

    在一套MySQL MGR集群測驗環境中,同事測驗時,在my.cnf引數檔案中修改了autocommit引數(修改為autocommit=0),結果上周五,由于系統管理員要升級RHEL 8.8的系統補丁,所以將這這三臺MySQL的資料庫服務關閉了,升級完RHEL 8.8的系統補丁后,啟動MySQL的集 ......

    uj5u.com 2023-06-22 08:10:21 more
  • 穩,從資料庫連接池 testOnBorrow 看架構設計

    本文從 Commons DBCP testOnBorrow 的作用機制著手,管中窺豹,從一點去分析資料庫連接池獲取的程序以及架構分層設計。以下內容會按照每層的作用,貫穿分析整個呼叫流程。 ......

    uj5u.com 2023-06-22 08:10:18 more