Memcached底層的一些認(rèn)識(shí)

memcached指南file:///C:/Users/Administrator/Desktop/簡(jiǎn)歷/memcached-筆記資料/memcached權(quán)威指南.pdf

底層認(rèn)識(shí)在p351頁(yè)

Memcached如何支持高并發(fā)

Memcached使用多路復(fù)用I/O模型(epoll,select等,具體為memcached采用的是libevent庫(kù)统捶,該庫(kù)在linux下就是用的epoll)敲街。傳統(tǒng)阻塞I/O中,系統(tǒng)可能會(huì)因?yàn)槟硞€(gè)用戶連接還沒(méi)做好I/O準(zhǔn)備而一直等待注整,直到這個(gè)連接做好I/O準(zhǔn)備(這時(shí)如果這時(shí)有其他用戶連接到服務(wù)器,很可能因?yàn)橄到y(tǒng)阻塞而得不到響應(yīng))。多路復(fù)用I/O模型熊杨,阻塞不發(fā)生在具體執(zhí)行I/O的,而是epoll或select上盗舰,當(dāng)某個(gè)鏈接準(zhǔn)備好IO時(shí)晶府,epoll就返回這個(gè)連接的信息,進(jìn)而去執(zhí)行相應(yīng)連接的IO,這樣大大提升了CPU效率钻趋。此外memcached使用了多線程模式川陆,在開(kāi)啟memcahed服務(wù)器時(shí)可以通過(guò) -t指定線程數(shù)(線程數(shù)不是越多越好,一般指定為cpu核數(shù)就好了)蛮位。

使用Slab分配算法保存數(shù)據(jù)

該算法在slabs.c源文件中较沪, 我們觀察的這個(gè)函數(shù)slab_init(),具體就是初始化這個(gè)Memcached的內(nèi)存的結(jié)構(gòu)的。最后生成了一個(gè)數(shù)組失仁,其中每個(gè)元素為slabclass_t這個(gè)結(jié)構(gòu)體尸曼。該結(jié)構(gòu)體就描述了具體每個(gè)slab class的信息(哪些塊被使用了啊,每個(gè)chunk大小為多少等)萄焦。每個(gè)slab class的維持的內(nèi)存總共都是1048576個(gè)字節(jié)(1M)控轿。每個(gè)數(shù)組的chunk都是靠著一個(gè)增長(zhǎng)因子成倍增長(zhǎng)變化的的。最后一個(gè)slab class的大小每個(gè)chunk就是1M(跳出while循環(huán)拂封,再設(shè)置組后一個(gè)slab class的chunk帶大小的)茬射。

有趣的事,知道為什么每個(gè)memcached實(shí)例為什么分配那么多個(gè)slab class嗎冒签?源碼中本來(lái)最多可以分201個(gè)slab class的躲株,但是分配的那個(gè)while循環(huán),一個(gè)條件是<201镣衡,另一個(gè)是每個(gè)slab class的size要小于一個(gè)POWER_BLOCK(這個(gè)常量就是規(guī)定的每個(gè)slab class的總大小)的一半霜定。因此我們可以每次啟動(dòng)的時(shí)候看到屏幕上的消息档悠,明白為什么是分配那么多個(gè)(通常倒數(shù)第二個(gè)的大小塊接近1M的一半)。

我們都知道惰性刪除和未過(guò)期數(shù)據(jù)被踢現(xiàn)象望浩。那么這些現(xiàn)象又是怎么實(shí)現(xiàn)的呢辖所?

刪除過(guò)期item

惰性刪除是因?yàn)閕tem的刪除機(jī)制放在item的訪問(wèn)的函數(shù)中(do_item_get_notedeleted)的,通過(guò)比較item的過(guò)期時(shí)間和當(dāng)前時(shí)間磨德,前者小的話缘回,就刪除這個(gè)item。因此item到期后不是立馬從內(nèi)存中刪除典挑,而是訪問(wèn)這個(gè)item時(shí)如果到期了酥宴,才把item從內(nèi)存中刪除。

使用LRU淘汰算法

大多數(shù)關(guān)于memcached都說(shuō)您觉,當(dāng)memcached使用的內(nèi)存數(shù)大于設(shè)置的最大內(nèi)存數(shù)時(shí)拙寡,比如20kb的slabclass都已經(jīng)使用完了chunk,這時(shí)新來(lái)的數(shù)據(jù)還要再插入20kb的slabclass琳水,會(huì)啟動(dòng)LRU算法試著淘汰最近最少使用的數(shù)據(jù)肆糕,給新數(shù)據(jù)騰位置。

有趣的事是我知道什么情況下在孝,LRU騰位置失敗诚啃,以及memcached的LRU的實(shí)現(xiàn)。Memcached的LRU實(shí)現(xiàn)顯然不能完全滿足操作系統(tǒng)原理課介紹的那般準(zhǔn)確私沮。它就是先從你需要插入的slab class的數(shù)據(jù)項(xiàng)列表從后往前遍歷(因?yàn)閙emcached會(huì)把剛剛訪問(wèn)過(guò)的item放到item列表頭部)始赎,尋找一個(gè)沒(méi)有被引用(其引用計(jì)數(shù)器為0,[這item被引用的總數(shù)])的仔燕,找到的話极阅,就把這數(shù)據(jù)項(xiàng)所占內(nèi)存騰出來(lái)。如果沒(méi)找到的話涨享,就去找一個(gè)3個(gè)小時(shí)沒(méi)有訪問(wèn)過(guò)的item(其上次訪問(wèn)的時(shí)間+3個(gè)小時(shí)的秒數(shù)小于現(xiàn)在的時(shí)間)筋搏,滿足就釋放其內(nèi)存,騰出來(lái)給新的元素用厕隧。如果上面兩個(gè)步驟都沒(méi)有找到的話奔脐,就宣布這個(gè)新item不能插入因?yàn)樯暾?qǐng)內(nèi)存失敗。

Memcached多線程模型

Memcahed是一個(gè)多線程的緩存服務(wù)器程序吁讨。在Memcached內(nèi)部髓迎,線程分為:主線程(接受客戶端鏈接,并把連接分配給工作線程處理)建丧;工作線程(處理客戶端連接的請(qǐng)求)

具體行為是主線程主要偵聽(tīng)客戶端的連接drive_machine()排龄,有客戶端連接到memcached時(shí),memcached會(huì)調(diào)用accept函數(shù)接受到來(lái)的連接翎朱, 當(dāng)主線程接收到客戶端連接后橄维,便通過(guò)dispatch_conn_new函數(shù)把客戶端連接注冊(cè)到libevent進(jìn)行偵聽(tīng)(放到多路復(fù)用中尺铣。這里采用的是libevent庫(kù),而libevent庫(kù)在linux下用的是epoll模型争舞,并指定以后處理該連接的讀寫請(qǐng)求的工作線程)凛忿,然后libevent會(huì)偵聽(tīng)到客戶端的讀寫請(qǐng)求,有請(qǐng)求來(lái)了就把任務(wù)push到某個(gè)工作線程的CQ隊(duì)列中竞川,并向那個(gè)工作線程發(fā)送一個(gè)信號(hào)店溢,以調(diào)用相應(yīng)的工作線程執(zhí)行函數(shù) thread_libevent_process。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末委乌,一起剝皮案震驚了整個(gè)濱河市床牧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遭贸,老刑警劉巖戈咳,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異革砸,居然都是意外死亡除秀,警方通過(guò)查閱死者的電腦和手機(jī)糯累,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門算利,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泳姐,你說(shuō)我怎么就攤上這事效拭。” “怎么了胖秒?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缎患,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阎肝,道長(zhǎng)挤渔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任风题,我火速辦了婚禮判导,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沛硅。我一直安慰自己眼刃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布摇肌。 她就那樣靜靜地躺著擂红,像睡著了一般。 火紅的嫁衣襯著肌膚如雪围小。 梳的紋絲不亂的頭發(fā)上昵骤,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天树碱,我揣著相機(jī)與錄音,去河邊找鬼涉茧。 笑死赴恨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伴栓。 我是一名探鬼主播伦连,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钳垮!你這毒婦竟也來(lái)了惑淳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饺窿,失蹤者是張志新(化名)和其女友劉穎歧焦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肚医,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绢馍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肠套。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舰涌。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖你稚,靈堂內(nèi)的尸體忽然破棺而出瓷耙,到底是詐尸還是另有隱情,我是刑警寧澤刁赖,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布搁痛,位于F島的核電站,受9級(jí)特大地震影響宇弛,放射性物質(zhì)發(fā)生泄漏鸡典。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一枪芒、第九天 我趴在偏房一處隱蔽的房頂上張望彻况。 院中可真熱鬧,春花似錦病苗、人聲如沸疗垛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贷腕。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泽裳,已是汗流浹背瞒斩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涮总,地道東北人胸囱。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瀑梗,于是被迫代替她去往敵國(guó)和親烹笔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容