Memcached原始碼分析之網路模型篇

2021-08-26 18:24:33 字數 1894 閱讀 3360

memcached 採用多執行緒的工作方式, 主線程接收連線, 然後把連線平攤給

工作執行緒, 工作執行緒處理業務邏輯, 

memcached 使用 libevent 處理網路

事件, 主線程和工作執行緒都有乙個 event base, 這是 libevent 

的核心資料

結構, event base 能夠監聽多個 socket 的網路事件, 概括起來,

memcached 大體框架如 圖1 

所示.

圖1 memcached的多執行緒模型

主線程的初始化

主線程首先初始化 libevent 的核心資料結構 main base, 然後建立監聽

socket, 把監聽 socket 封裝成乙個連線, 加入 main base, 這樣就能處理

網路事件.  

所有 socket 的網路事件處理都由兩個函式完成:event_handler() 和

drive_machine(), 其中 event_handler() 呼叫 drive_machine(), 

所以真正的業務邏輯都在 drive_machine() 完成, 這個函式處理 socket

的讀寫事件, 還能為監聽 socket 處理新的連線. 

main thread 初始化完成的狀態:

工作執行緒的初始化

1 首先建立 n 個工作執行緒

2 然後為工作執行緒初始化 event base, 建立通知管道, 並加入 event base, 

通知管道的作用在於: 主線程把新來的連線轉交給某個執行緒時,同時向該執行緒的通知管道傳送乙個

字元的資料,喚醒該執行緒去處理連線, 也就是呼叫 thread_libevent_process 來處理連線.

3 最後建立 cq_item 佇列, 這個佇列用於主線程和工作執行緒的上下文切換, 主線程把新來的連線

封裝成 cq_item, 放到工作執行緒的 cq_item 佇列, 並喚醒該執行緒去處理新來的連線.

初始化完成後, 工作執行緒的狀態如下:

下面這幅圖是 memcached 整體的架構圖:

連線的管理

網路伺服器的開發少不了連線的管理, 所謂連線, 是指 connection, 它儲存客戶端

的 socket 描述符, 還有讀和寫的 buffer, 以及連線所在的執行緒 id. 

連線是乙個結構體, 在 memcached 中定義為 conn, conn 占用一定的記憶體

空間, 如果伺服器對新來的連線都分配 conn 結構體,  記憶體的分配和**是一筆

不小的開銷, 將影響伺服器的效能. 

conn 結構體其實可以重複利用的, 連線用完的 conn 可以**給其他連線用, 所以

伺服器有必要維護乙個連線池, 來統一管理 conn, 最大限度地重複利用 conn, 避免

不必要的分配. 

memcached 的連線管理做得相當簡單, 就是維護乙個 conn 陣列. 如下圖所示:

freeconns 是 conn 的二維陣列, freecurr指向當前的空閒槽

conn 的分配 -- conn_from_freelist()函式

分配策略很簡單, 就是把 freeconns[freecurr -1] 分配出去, 然後 freecurr 指標下移乙個單位.

如果 freeconns 沒有空閒的 conn, 分配就失敗, 函式 conn_from_freelist 返回 null, 這時

memcached 就會從作業系統分配記憶體空間. 事實上 memcached 不會預先給 freeconns

分配一些空閒 conn, conn 都是在系統執行期間按需分配的.

conn的**

把用完的 conn 掛在 freecurr 所在的槽位.

Memcached原始碼分析之資源分享

facebook對memcached的提公升 memcached原始碼分析之記憶體管理篇 the time is passing iteye技術 memcached原始碼分析之記憶體管理篇之item結構圖及slab結構圖 yxnyxnyxnyxnyxn的專欄 關於memcache記憶體管理模型的理解...

Memcached原始碼分析 命令解析(3)

1 流程圖 1 當進入到conn read狀態後,會呼叫try read network 將socket資料讀取到conn的rbuf中。例如 char rbuf set key 0 0 4 r nget name r n 2 然後進入到conn parse cmd狀態,呼叫try read comm...

Memcached原始碼解析

memcached是乙個非常有名的高效能分布式快取系統,採用memcached作為快取系統能顯著提高系統的效能。想要更好地發揮對memcached的效能,對其源 進行分析顯得非常必要。本文基於memcached 1.4.15進行源 分析,假設讀者對socket,管道,多執行緒程式設計,hash演算法...