一、memcache記憶體分配機制
關於這個機制網上有很多解釋的,我個人的總結如下。
page為記憶體分配的最小單位。memcached的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過-i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被**或者重新分配(page ressign已經從1.2.8版移除了)
slabs劃分資料空間。memcached並不是將所有大小的資料都放在一起的,而是預先將資料空間劃分為一系列slabs,每個slab只負責一定範圍內的資料儲存。如下圖,每個slab只儲存大於其上乙個slab的size並小於或者等於自己最大size的資料。例如:slab 3只儲存大小介於137 到 224 bytes的資料。如果乙個資料大小為230byte將被分配到slab 4中。從下圖可以看出,每個slab負責的空間其實是不等的,memcached預設情況下下乙個slab的最大值為前乙個的1.25倍,這個可以通過修改-f引數來修改增長比例。
chunk才是存放快取資料的單位。chunk是一系列固定的記憶體空間,這個大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實際存放快取資料的地方,因為chunk的大小固定為slab能夠存放的最大值,所以所有分配給當前slab的資料都可以被chunk存下。如果時間的資料大小小於chunk的大小,空餘的空間將會被閒置,這個是為了防止記憶體碎片而設計的。例如下圖,chunk size是224byte,而儲存的資料只有200byte,剩下的24byte將被閒置。
slab的記憶體分配。memcached在啟動時通過-m指定最大使用記憶體,但是這個不會一啟動就占用,是隨著需要逐步分配給各slab的。
如果乙個新的快取資料要被存放,memcached首先選擇乙個合適的slab,然後檢視該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請。slab申請記憶體時以page為單位,所以在放入第乙個資料,無論大小為多少,都會有1m大小的page被分配給該slab。申請到page後,slab會將這個page的記憶體按chunk的大小進行切分,這樣就變成了乙個chunk的陣列,在從這個chunk陣列中選擇乙個用於儲存資料。如下圖,slab 1和slab 2都分配了乙個page,並按各自的大小切分成chunk陣列。
memcached記憶體分配策略。綜合上面的介紹,memcached的記憶體分配策略就是:按slab需求分配page,各slab按需使用chunk儲存。
這裡有幾個特點要注意,
memcached分配出去的page不會被**或者重新分配
memcached申請的記憶體不會被釋放
slab空閒的chunk不會借給任何其他slab使用
知道了這些以後,就可以理解為什麼總記憶體沒有被全部占用的情況下,memcached卻出現了丟失快取資料的問題了。
伺服器資料庫系列 優化資料庫的10個建議
第乙個技巧也許看來理所當然,但事實上大部分資料庫的問題都來自於設計不好的資料庫結構。譬如我曾經遇見過將客戶端資訊和支付資訊儲存在同乙個資料庫列中的例子。對於系統和用資料庫的開發者來說,這很糟糕。新建資料庫時,應當將資訊儲存在不同的表裡,採用標準的命名方式,並採用主鍵。如果你想優化某個查詢語句,清楚的...
伺服器資料庫優化
最近玩家 性增長,使得原來設計的ws和資料庫那塊承受了更大的壓力,開始有點受不住了,於是理所當然的優化開始了。這裡說幾個資料庫優化的建議和方法 在資料庫優化工作中,使資料盡可能的小,使表在硬碟 上佔據的空間盡可能的小,這是最常用 也是最有效的手段之一。因為縮小資料,相對來說可以提高硬碟 的讀寫速度,...
資料庫伺服器優化
1.為查詢優化你的查詢 2.explain 你的 select 查詢 3.當只要一行資料時使用 limit 1 4.為搜尋欄位建索引 5.千萬不要 order by rand 6.避免 select 7.永遠為兩張表設定乙個 id 8.盡可能的使用 not null 9.把 ip 位址存成 unsi...