摘要:而多路復(fù)用無需等待任務(wù)完成,而是將所有任務(wù)維護(hù)在一個(gè)組中,在等待過程中線程可以去處理其他的任務(wù),當(dāng)某個(gè)任務(wù)完成后,再去操作該操作符。而目前僅有的調(diào)優(yōu)方案是調(diào)整因子,讓的大小盡可能的接近,減少空間的浪費(fèi)。
0x00 Memcached簡(jiǎn)述
Memcached是一套高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于在動(dòng)態(tài)系統(tǒng)中減少數(shù)據(jù)庫(kù)負(fù)載,提升性能。
0x01 Memcached特性基于libevent的事件處理
內(nèi)置內(nèi)存存儲(chǔ)方式SLab Allocation機(jī)制
并不單一的數(shù)據(jù)刪除機(jī)制
基于客戶端的分布式系統(tǒng)
0x02 高性能的基礎(chǔ):libevent事件處理Libevent 是一個(gè)用C語(yǔ)言編寫的、輕量級(jí)的開源高性能網(wǎng)絡(luò)庫(kù),主要有以下幾個(gè)亮點(diǎn):事件驅(qū)動(dòng)( event-driven),高性能;輕量級(jí),專注于網(wǎng)絡(luò),不如 ACE 那么臃腫龐大;源代碼相當(dāng)精煉、易讀;跨平臺(tái),支持 Windows、 Linux、 *BSD 和 Mac Os;支持多種 I/O 多路復(fù)用技術(shù), epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定時(shí)器和信號(hào)等事件;注冊(cè)事件優(yōu)先級(jí)。
以上引自百度百科,在不支持I/O多路復(fù)用的情況下,一個(gè)線程同時(shí)只能處理一個(gè)socket文件操作符,所以當(dāng)一個(gè)任務(wù)未完成時(shí),線程需要等待任務(wù)的處理,這種處理模型效率低下。而I/O多路復(fù)用無需等待任務(wù)完成,而是將所有任務(wù)維護(hù)在一個(gè)I/O組中,在等待過程中線程可以去處理其他的任務(wù),當(dāng)某個(gè)任務(wù)完成后,再去操作該socket操作符。值得一提的是,在I/O多路復(fù)用技術(shù)中,epoll是非常棒的,相比于select模型,epoll沒有文件操作符數(shù)量的限制;并且select模型是將所有操作符維護(hù)在一個(gè)I/O組中,當(dāng)有socket數(shù)據(jù)可操作時(shí),線程需要在組中尋找哪個(gè)文件操作符可操作,而epoll只將可操作的socket文件操作符給線程,線程無需自己尋找,可以直接操作該socket,提高了處理性能。
所以,使用libevent時(shí)間處理模型,非常好的提升了memcached的性能。
0x03 SLab Allocation機(jī)制在memcached中,內(nèi)存不是直接C語(yǔ)言提供的malloc() free() 進(jìn)行管理的,因?yàn)樵膬?nèi)存管理方式會(huì)造成內(nèi)存碎片,會(huì)加重內(nèi)存管理器的內(nèi)存管理負(fù)擔(dān)。而SLab Allocation機(jī)制完美的解決了內(nèi)存碎片化的問題。
SLab Allocator 在初始化時(shí),通過將內(nèi)存分配成預(yù)先設(shè)置的大小,將這些內(nèi)存分割成特定長(zhǎng)度的塊(chunk),并把尺寸相同的chunk分成一個(gè)組,也就是chunk集合,而這種方式就解決了內(nèi)存碎片化的問題。
在需要存儲(chǔ)緩存數(shù)據(jù)時(shí),memcached會(huì)在chunk中選擇與所存數(shù)據(jù)大小最接近的chunk,并將數(shù)據(jù)存儲(chǔ)到該chunk中,這樣不需要每次在存儲(chǔ)數(shù)據(jù)時(shí),都向操作系統(tǒng)申請(qǐng)空間,提升了memcached的處理性能。
當(dāng)存儲(chǔ)的數(shù)據(jù)過期后,memcached不會(huì)釋放該數(shù)據(jù)的所占用的內(nèi)存,而僅僅是將該數(shù)據(jù)標(biāo)記為不可用,當(dāng)有新數(shù)據(jù)需要存儲(chǔ)時(shí),memcached會(huì)將數(shù)據(jù)重新存儲(chǔ)到該空間中,用這種方式對(duì)內(nèi)存進(jìn)行重復(fù)利用。
因?yàn)镾lab Allocator將內(nèi)存分割成固定大小的塊,當(dāng)存儲(chǔ)的數(shù)據(jù)小于chunk的長(zhǎng)度,會(huì)導(dǎo)致該chunk剩余空間的浪費(fèi)。例如:當(dāng)一個(gè)數(shù)據(jù)占用60K,而最接近的chunk長(zhǎng)度為64K,此時(shí)就有4K的空間造成浪費(fèi)。而目前僅有的調(diào)優(yōu)方案是調(diào)整Growth Factor因子,讓chunk的大小盡可能的接近,減少空間的浪費(fèi)。
當(dāng)存儲(chǔ)在memcached中的記錄過期時(shí),memcached不會(huì)釋放該內(nèi)存,而是讓客戶端對(duì)該記錄不可見。留下內(nèi)存來,讓之后的存儲(chǔ)記錄進(jìn)行內(nèi)存重復(fù)利用。
memcached為了提升性能,在內(nèi)部不會(huì)對(duì)存儲(chǔ)在memcached中的記錄進(jìn)行監(jiān)視,而是在每次get數(shù)據(jù)的時(shí)候,對(duì)該記錄的過期時(shí)間進(jìn)行校驗(yàn),當(dāng)記錄過期,則不返回?cái)?shù)據(jù)。
雖然memcached擁有內(nèi)存重復(fù)利用的機(jī)制,但是進(jìn)行大量數(shù)據(jù)緩存時(shí),還是會(huì)出現(xiàn)內(nèi)存吃滿,memcached無法在SLab中獲取到空閑的內(nèi)存,在這種情況下,memcached會(huì)觸發(fā)LRU,會(huì)在最近未被使用的記錄中進(jìn)行搜索,并將這些空間分配給新的記錄。
不同于其他軟件的分布式,memcached的分布式不存在于服務(wù)端,而是完全由客戶端進(jìn)行分布式的處理。這樣的好處是,減少memcached服務(wù)端之間的網(wǎng)絡(luò)連接,當(dāng)某一個(gè)服務(wù)器宕機(jī)時(shí),不至于影響其他機(jī)器的正常使用。
通過crc32()計(jì)算出鍵的整數(shù)哈希值,然后除以服務(wù)器的臺(tái)數(shù),求得余數(shù)進(jìn)行服務(wù)器節(jié)點(diǎn)的選擇,此種方式的優(yōu)點(diǎn)是,簡(jiǎn)單易操作,并且數(shù)據(jù)的分散性也非常優(yōu)秀。但缺點(diǎn)是,當(dāng)改變服務(wù)器的數(shù)量時(shí),緩存重組的代價(jià)巨大,在此過程中緩存的命中率急劇下降。
首先求出memcached服務(wù)器節(jié)點(diǎn)的哈希值,并將其分配到一個(gè)0~2^32的圓上,我們稱該這個(gè)圓為值域,之后通過同樣的計(jì)算方式求出鍵的哈希值,并將值映射到圓上,然后從數(shù)據(jù)映射到的位置開始順時(shí)針尋找,并將數(shù)據(jù)存儲(chǔ)到找到的第一個(gè)服務(wù)器節(jié)點(diǎn)上,如果找到2^32仍然找不到就將數(shù)據(jù)存儲(chǔ)到第一臺(tái)memcached機(jī)器上。
當(dāng)添加一臺(tái)新機(jī)器時(shí),通過同樣的hash算法將該機(jī)器映射到圓上,影響的僅僅是新機(jī)器的節(jié)點(diǎn)到它的上一個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)。
當(dāng)刪除一臺(tái)機(jī)器時(shí),同樣也僅僅影響映射到刪除的機(jī)器和它的上一臺(tái)機(jī)器之間的數(shù)據(jù),而不會(huì)造成大面積的緩存重組即rehash.
memcached完全剖析
使用 libevent 和 libev 提高網(wǎng)絡(luò)應(yīng)用性能
高性能IO模型淺析
備注:資源和圖片等均來自網(wǎng)絡(luò)
原文作者:我才是二亮
原文鏈接:http://blog.2liang.me/2016/11/28/learn-memcached-principle/
轉(zhuǎn)載請(qǐng)?jiān)谡闹袠?biāo)注并保留原文鏈接、作者等信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/61700.html
摘要:學(xué)習(xí)背景近些年,如果你是一名開發(fā),那么這個(gè)熱門的技術(shù)名詞你一定聽說過,我也不例外,但是因?yàn)槠綍r(shí)沒接觸過,所以一直都沒動(dòng)力去了解使用。 學(xué)習(xí)背景 近些年,如果你是一名開發(fā),那么Docker這個(gè)熱門的技術(shù)名詞你一定聽說過,我也不例外,但是因?yàn)槠綍r(shí)沒接觸過,所以一直都沒動(dòng)力去了解使用。最近在折騰自己維護(hù)在github上的項(xiàng)目的時(shí)候,發(fā)現(xiàn)項(xiàng)目所依賴的外部環(huán)境比較多,比如zookeeper、re...
摘要:所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些面試和學(xué)習(xí)中你必須掌握的問題。在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。 昨天寫了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問題。...
摘要:五技術(shù)棧整個(gè)看下來會(huì)發(fā)現(xiàn)美拍的架構(gòu)做的非常的穩(wěn),小軍也有提到,在項(xiàng)目初期高速發(fā)展階段做架構(gòu)時(shí)要克服對(duì)完美架構(gòu)的欲望克服對(duì)新技術(shù)的欲望,先讓系統(tǒng)跑起來。 昨晚把美拍架構(gòu)負(fù)責(zé)人洪小軍在Qcon上的『九個(gè)月實(shí)現(xiàn)破億用戶的可擴(kuò)展架構(gòu)』分享看了一遍(其實(shí)那場(chǎng)QCon我也在現(xiàn)場(chǎng),但是當(dāng)時(shí)小軍這個(gè)會(huì)場(chǎng)實(shí)在太多人了,而且當(dāng)時(shí)北京還沒開空調(diào)又熱又悶,所以我就挑了個(gè)涼快的會(huì)場(chǎng)去聽了哈哈),感覺有不少值得學(xué)...
閱讀 808·2021-11-17 09:33
閱讀 3853·2021-09-01 10:46
閱讀 1851·2019-08-30 11:02
閱讀 3357·2019-08-29 15:05
閱讀 1453·2019-08-26 11:39
閱讀 2358·2019-08-23 17:04
閱讀 2032·2019-08-23 15:43
閱讀 1425·2019-08-23 14:12