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