開源夏令營Memcached雜湊效能優化(二)

2021-06-22 20:21:22 字數 2738 閱讀 7619

這周周一和導師通了個**,和導師互相間認識了一下,然後和導師溝通交流討論了一下我的專案情況,導師給我提出了2個建議

memcached啟動的時候一定得多開幾個worker thread,預設是4,但是最好還是多開點,另外,測試程式也得是多執行緒連線的,要不單執行緒連線memcached的話其實都是順序序列執行的,發現不了關於並行執行時的瓶頸的。

關於ycsb的測試端的問題,以前我的是一行資料是10列,這樣訪問的壓力會比較大,導師告訴我這樣會造成傳輸的壓力過大,找不到系統真正的瓶頸所作,所以建議將列弄小,盡量測試小資料的讀寫和測試,這樣並行的瓶頸比較容易發現。

帶著這2個建議,我開始著手這一周的工作

首先按照老師說的修改測試的workload,這個是我目前的乙個測試的workload的配置檔案

recordcount=1000000

operationcount=20000000

workload=com.yahoo.ycsb.workloads.coreworkload

readallfields=false

readproportion=0.3

updateproportion=0.3

scanproportion=0

insertproportion=0.4

requestdistribution=zipfian

fieldcount=1

fieldlength=50

其中的recordcount是load workload需要的,而operationcount則是實際執行的時候的運算元,

readproportion,

updateproportion,

insertproportion分別是讀,更新和插入的比例,fieldcount則是說有多少列,而fieldlength則是說每列的長度是多少,

然後這個workload跑了1000秒有下面的乙個結果。

然後具體的看一下

我們發現pthrea_mutex_trylock這個的cpu的時間比較長啊,這個具體開啟看看

然後看看從上到下的caller tree的情況,這個要和上面那個有用的一起看

然後我們再次修改一下workload,這次主要修改一下讀寫的比例我們再來看看結果,首先是修改的workload

recordcount=1000000

operationcount=10000000

workload=com.yahoo.ycsb.workloads.coreworkload

readallfields=false

readproportion=0.7

updateproportion=0.2

scanproportion=0

insertproportion=0.1

requestdistribution=zipfian

fieldcount=1

fieldlength=50

然後是總體的結果

具體的函式排名

最後看看呼叫關係,是什麼操作佔的比重比較大

最後看看呼叫的圖

這兩個可看出pthread_mutex_trylock這裡明顯是系統的乙個瓶頸,明顯是有優化的餘地的

pthread_mutex_trylock這個在沒然後發現我們的主要是在do_item_alloc的時候呼叫了mutex_lock這個函式,我們繼續找找,發現了這個mutex_lock的實現

static inline int mutex_lock(pthread_mutex_t *mutex)

函式是pthread_mutex_lock函式的非阻塞版本。如果mutex引數所指定的互斥鎖已經被鎖定的話,呼叫pthread_mutex_trylock函式不會阻塞當前執行緒,而是立即返回乙個值來描述互斥鎖的狀況。

這裡這個鎖的實現有點類似自旋鎖的實現,如果要優化的話,可以採用的辦法就是把這裡鎖的結構去掉,盡量變成無鎖的結構,這一周主要在google找了找解決的辦法,有這麼幾個辦法

無鎖的原子操作

有個叫software transcation memory的實現

接下來的工作有了目的就比較清楚了,下面就是乙個初步的計畫

研究memcached的**,重點實在鎖的結構上,主要還是cache_lock的研究

修改原有的**,支援無鎖的操作,這個可能有點不是一兩周能簡單搞定,先看看文獻和一些說明的文件

終於有點眉目了,下面繼續好好搞搞,繼續加油吧~

開源夏令營(1)

前段時間主要做了git的一些配置和熟悉 git pull 從其他的版本庫 既可以是遠端的也可以是本地的 將 更新到本地。git add 是將當前更改或者新增的檔案加入到git的索引中,加入到git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步 git rm 從當前的工作空間中和索引中...

開源夏令營總結

時間過得很快,開源夏令營就要結束了,今天就簡單總結一下這段時間的所學所做。1.研究源 因為專案已經有一定規模,所以第一步肯定是要先弄懂現有專案結構和 邏輯。view層負責把資料顯示出來,包括每一幀的具體資料,和骨骼父子關係等 model,collection會負責資料的驗證和訪問。每當使用者操作時,...

開源夏令營(8)

例如拿標題來舉例,以下兩段 是等效的 一 php the title 二 php echo get the title 注意the permalink 對應的是get permalink 沒有 the 模板標籤大全 常用的模板標籤 php the content 日誌內容 php the title...