0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis單實例內(nèi)存最大申請到多大比較合適

冬至配餃子 ? 來源:開發(fā)內(nèi)功修煉 ? 作者:張彥飛allen ? 2022-08-30 17:26 ? 次閱讀

我們公司的基礎(chǔ)架構(gòu)部有個云Redis平臺,其中Redis實例在申請的時候可以自由選擇需要的內(nèi)存的大小。然后就引發(fā)了我的一個思考,Redis單實例內(nèi)存最大申請到多大比較合適?假設(shè)母機是64GB內(nèi)存的物理機,如果不考慮CPU資源的的浪費,我是否可以開一個50G的Redis實例?

于是我在Google上各種搜索,討論這個問題的人似乎不多。找到唯一感覺靠譜點的答案,那就是單進程分配的內(nèi)存最好不要超過一個node里的內(nèi)存總量,否則linux當(dāng)該node里的內(nèi)存分配光了的時候,會在自己node里動用硬盤swap,而不是其它node里申請。這即使所謂的numa陷阱,當(dāng)Redis進入這種狀態(tài)后會導(dǎo)致性能急劇下降(不只是redis,所有的內(nèi)存密集型應(yīng)用如mysql,mongo等都會有類似問題)。

看起來這個解釋非常有說服力。于是乎,我就想親手捕捉一次NUMA陷阱,看看這個家伙究竟什么樣。

1 先聊聊QPI與NUMA

最早在CPU都是單核的時候,用的總線都是FSB總線。經(jīng)典結(jié)構(gòu)如下圖:

poYBAGMN1piAOk-uAAA9LTZlzWI841.png

圖1 單核時代的FSB總線

到來后來CPU的開發(fā)者們發(fā)現(xiàn)CPU的頻率已經(jīng)接近物理極限了,沒法再有更大程度的提高了。在2003年的時候,CPU的頻率就已經(jīng)達到2個多GB,甚至3個G了。現(xiàn)在你再來看今天的CPU,基本也還是這個頻率,沒進步多少。摩爾定律失效了,或者說是向另外一個方向發(fā)展了。那就是多核化、多CPU化。

poYBAGMN1qmAdVyWAABYYA6gqOU319.png

圖2 多核時代的FSB總線

剛開始核不多的時候,F(xiàn)SB總線勉強還可以支撐。但是隨著CPU越來越多,所有的數(shù)據(jù)IO都通過這一條總線和內(nèi)存交換數(shù)據(jù),這條FSB就成為了整個計算機系統(tǒng)的瓶頸。舉個北京的例子,這就好比進回龍觀的京藏高速,剛開始回龍觀人口不多的時候,這條高速承載沒問題。但是現(xiàn)在回龍觀聚集了幾十萬人了,“總線”還僅有這一條,未免效率太低。

CPU的設(shè)計者們很快改變了自己的設(shè)計,引入了QPI總線,相應(yīng)的CPU的結(jié)構(gòu)就叫NMUA架構(gòu)。下圖直觀理解

pYYBAGMN1riANwZaAAA8NMAaGH4739.png

圖3 QPI總線

2 話說NUMA陷阱

NUMA陷阱指的是引入QPI總線后,在計算機系統(tǒng)里可能會存在的一個坑。大致的意思就是如果你的機器打開了numa,那么你的內(nèi)存即使在充足的情況下,也會使用磁盤上的swap,導(dǎo)致性能低下。原因就是NUMA為了高效,會僅僅只從你的當(dāng)前node里分配內(nèi)存,只要當(dāng)前node里用光了(即使其它node還有),也仍然會啟用硬盤swap。

當(dāng)我第一次聽說到這個概念的時候,不禁感嘆我運氣好,我的Redis實例貌似從來沒有掉進這個陷阱里過。那為了以后也別栽坑,趕緊去了解了下我的機器的numa狀態(tài):

pYYBAGMN1siAA1okAABXu0dXtME357.png

上面結(jié)果說明我們有兩個node,node0和node1,分別有12個核心,各有32GB的內(nèi)存。再看zone_reclaim_mode,它用來管理當(dāng)一個內(nèi)存區(qū)域(zone)內(nèi)部的內(nèi)存耗盡時,是從其內(nèi)部進行內(nèi)存回收還是可以從其他zone進行回收的選項:

0 關(guān)閉zone_reclaim模式,可以從其他zone或NUMA節(jié)點回收內(nèi)存

1 打開zone_reclaim模式,這樣內(nèi)存回收只會發(fā)生在本地節(jié)點內(nèi)

2在本地回收內(nèi)存時,可以將cache中的臟數(shù)據(jù)寫回硬盤,以回收內(nèi)存

4 在本地回收內(nèi)存時,表示可以用Swap 方式回收內(nèi)存

poYBAGMN1t-AQog4AAASUyHegVA103.png

3 實踐捕捉numa陷阱未遂

那我的好奇心就來了,既然我的單個node節(jié)點只有32G,那我部署一個50G的Redis,給它填滿數(shù)據(jù)試試到底會不會發(fā)生swap。

實驗開始,我先查看了本地總內(nèi)存,以及各個node的內(nèi)存剩余狀況。

poYBAGMN1u-AQCIVAABS08kGT7A438.png

總內(nèi)存不用解釋,/proc/zoneinfo里包含了node可供應(yīng)用程序申請的free pages。node1有4651908個頁面,4651908*4K=18G的可用內(nèi)存。接下來讓我們啟動redis實例,把其內(nèi)存上限設(shè)置到超過單個node里的內(nèi)存大小。我這里單node內(nèi)存大小是32G,我把redis設(shè)置成了50G。開始灌入數(shù)據(jù)。最終數(shù)據(jù)全部灌完之后,

poYBAGMN1wCAGr97AACLBjomYE8494.png

實驗證明,在zone_reclaim_mode為1的情況下,Redis是平均在兩個node里申請節(jié)點的,并沒有固定在某一個cpu里。

莫非是大佬們的忠告錯了嗎?其實不是,如果不綁定親和性的話,分配內(nèi)存是當(dāng)進程在哪個node上的CPU發(fā)起內(nèi)存申請,就優(yōu)先在哪個node里分配內(nèi)存。之所以是平均分配在兩個node里,是因為redis-server進程實驗中經(jīng)常會進入主動睡眠狀態(tài),醒來后可能CPU就換了。所以基本上,最后看起來內(nèi)存是平均分配的。如下圖,CPU進行了500萬次的上下文切換,用top命令看到cpu也是在node0和node1跳來跳去。

pYYBAGMN1w-AJ1aVAAAfGnzURbE204.png

4 綁定親和性,成功捕獲NUMA陷阱

殺死進程,內(nèi)存歸位

pYYBAGMN1x-AMhfoAAAkilonPYw204.png

綁定CPU和內(nèi)存的親和性,然后再啟動。

numactl --cpunodebind=0 --membind=0 /search/odin/daemon/redis/bin/redis-server /search/odin/daemon/redis/conf/redis.conf

top命令觀察到CPU確實一直在node0的節(jié)點里。node里的內(nèi)存也在快速消耗。
pYYBAGMN1z6AKRbfAAAuGejz7A0511.png

看,內(nèi)存很快就消耗光了。我們再看top命令觀察到的swap,很激動地發(fā)現(xiàn),我終于陷入到傳說中的numa陷阱了。

poYBAGMN11GAPuJGAACYjSaa4sQ642.png

這時候,Redis實際使用的物理內(nèi)存RES定格到了30g不再上漲,而是開始消耗Swap。又過了一會兒,Redis被oom給kill了。

5 結(jié)論

通過今天的實驗,我們可以發(fā)現(xiàn)確實有NUMA陷阱這種東西存在。不過那是我手工通過numactl指令綁定cpu和mem的親和性后才遭遇的。相信國內(nèi)絕大部分的線上Redis沒有進行這個綁定,所以理論上來單Redis單實例可以使用到整個機器的物理內(nèi)存。(實踐中最好不要這么干,你的大部分內(nèi)存都綁定到一個redis進程里的話,那其它CPU核就沒啥事干了,浪費了CPU的多核計算能力)

6 擴展

當(dāng)通過numactl綁定CPU和mem都在一個node里的時候,內(nèi)存IO不需要經(jīng)過總線,性能會比較高,你Redis的QPS能力也會上漲。和跨node的內(nèi)存IO性能對比,可以下面的實例,就是10:21的區(qū)別。

poYBAGMN126Aa9ehAAAbdV2jAUg120.png

你要是對性能有極致的追求,可以試著綁定numa的親和性玩玩。不過,no作no die,掉到numa陷阱里可別賴我,嘎嘎!



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    587

    瀏覽量

    27181
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2817

    瀏覽量

    87705
  • FSB
    FSB
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    9373
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評論

    相關(guān)推薦

    在那能申請到STC89C52單片機的開發(fā)學(xué)習(xí)板????

    在那能申請到STC89C52單片機的開發(fā)學(xué)習(xí)板????
    發(fā)表于 10-29 10:50

    8x8x8光立方間距多大比較

    8x8x8光立方間距多大比較好?
    發(fā)表于 05-12 22:58

    請問發(fā)燒友么 免費能申請到開發(fā)板,芯片的方法匯總

    請問發(fā)燒友么 免費能申請到開發(fā)板,芯片,元器件的各種方法 都有什么方法啊。請親們能不能匯總出來。包括什么樣的網(wǎng)站什么的。
    發(fā)表于 07-25 09:43

    dip40的IC緊鎖座的焊盤和孔應(yīng)該設(shè)置多大比較合適?

    請教一下dip40的IC緊鎖座的焊盤和孔應(yīng)該設(shè)置多大比較合適
    發(fā)表于 01-07 09:48

    【Aworks申請】盡最大努力掌握每個模塊,及設(shè)計出一個具有創(chuàng)新精神的實物

    申請理由:最近真正學(xué)習(xí)ARM開發(fā),幸而貴公司提供免費開發(fā)板,且這款開發(fā)板控制簡單,是初學(xué)ARM的首選,所以想想通過這次機會,申請到這款開發(fā)板,向?qū)W習(xí)更深層次的ARM提供幫助。項目描述:盡自己最大努力,體現(xiàn)出它的
    發(fā)表于 07-10 10:21

    哪里可以申請到單片機的開發(fā)板

    哪里可以申請到單片機的開發(fā)板哪里有靠譜點兒的地方?。繙I奔。。。。。。
    發(fā)表于 07-22 15:22

    請問怎么在TI官方網(wǎng)上申請到免費樣品?

    本帖最后由 一只耳朵怪 于 2018-6-6 14:48 編輯 在TI官方網(wǎng)上怎么樣才能申請到免費樣品?
    發(fā)表于 06-06 01:31

    睡眠模式向協(xié)調(diào)器申請數(shù)據(jù),請問如何看申請到的消息是什么?

    星型網(wǎng)絡(luò),協(xié)調(diào)器直接掛終端。終端在睡眠模式下,通過按鍵喚醒并使用函數(shù)NLME_SetPollRate(1)向協(xié)調(diào)器申請數(shù)據(jù),如何看申請到的消息是什么?如何提取返回的數(shù)據(jù)?
    發(fā)表于 08-09 07:54

    請問ADM2483隔離電源功率選擇多大比較合適?

    Hi 大家好: 現(xiàn)在使用ADM2483芯片來做RS485收發(fā)器,隔離電源采用金升陽BS0505-1W模塊,現(xiàn)在一塊電路板想支持5路485電路,使用5片ADM2483芯片,請問需要多大功率的隔離電源比較合適? 謝謝大家!
    發(fā)表于 08-29 11:45

    AD9517參考輸入電壓選用多大比較合適

    想咨詢下ADI工程師,AD9517-4這款芯片的參考時鐘信號電壓選用多大比較合適??丛u估板上給出的是0-6dbm,數(shù)據(jù)手冊上推薦REF為1.6V,REF_N為1.5V。這樣的話如果是輸入端時鐘信號,通過變壓器ETC1-1-13
    發(fā)表于 12-18 09:20

    請問RESET引腳通過多大的電阻連接到OUT比較合適

    請問。TLE4275的,RESET引腳通過多大的電阻連接到OUT比較合適,即圖中的R1取多大比較合適
    發(fā)表于 07-29 15:42

    請問ucosii中函數(shù)的timeout設(shè)置多大比較好?

    ucosii中的函數(shù)中的timeout設(shè)置多大比較合適?只能隨便設(shè)嗎?有沒有別的辦法?
    發(fā)表于 08-12 21:58

    電流采樣電路,放大比例選擇問題

    電流采樣負載電流是瞬間的,≤90mA,頻率2-100HZ,屬于低頻脈沖電流,單片機3.3V供電。問題:電流采樣電阻R9、放大比例(1+R12/R7用多大比較合適?
    發(fā)表于 06-06 18:01

    redis應(yīng)用場景及實例

    本文主要闡述了redis應(yīng)用場景及實例。Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。在這篇
    的頭像 發(fā)表于 02-09 15:01 ?6910次閱讀
    <b class='flag-5'>redis</b>應(yīng)用場景及<b class='flag-5'>實例</b>

    香港移動成功申請到了香港5G頻段

    香港通訊事務(wù)管理局辦公室發(fā)布公告宣布中國移動香港、香港電訊、數(shù)碼通三家電信服務(wù)商成功申請到香港5G頻段。 據(jù)悉,本次三家獲得的頻段為26GHz到28GHz。其中,中國移動香港、香港電訊、數(shù)碼通分別獲得400MHz頻譜。
    發(fā)表于 03-21 09:57 ?1356次閱讀
    香港移動成功<b class='flag-5'>申請到</b>了香港5G頻段