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