ssdb get的設計問題

2021-07-02 15:56:45 字數 1677 閱讀 2271

對ssdb進行效能測試,當跑以下測試用例時,驚奇發現set的qps跌到了百位數!

get-ssdb-bench沒結束之前,切入set-ssdb-bench

對get命令測試,併發連線數是200

./get-ssdb-bench 127.0.0.1 8888 4000000 200

qps: 41877

對set命令測試,併發連線數是200

./set-ssdb-bench 127.0.0.1 8888 4000000 200

qps: 220.02

單獨對set命令測試,set命令請求能達到40000+的qps。

ssdb的**優美,結構清晰。容易找到ssdb處理請求的核心邏輯(src/net/server.cpp)。

//只保留核心**

void networkserver::serve()else

if(events ==

null)

for(int i=

0; i<(int)events->size(); i++)else

if(fde->

data

.ptr == this->reader || fde->

data

.ptr == this->writer)

if(proc_result(&job, &ready_list) == proc_error)

}else

}for(it = ready_list.begin(); it != ready_list.end(); it ++)

if(job.result == proc_backend)

if(proc_result(&job, &ready_list_2) == proc_error)

} // end foreach ready link

}}//請求處理函式

void networkserver::proc(procjob *job)else

return;

}proc_t p = cmd->proc;

job->time_wait =

1000

* (millitime() - job->stime);

job->result = (*p)(this, job->

link, *req, &resp);//get請求會就地處理

job->time_proc =

1000

* (millitime() - job->stime) - job->time_wait;

...}

從上述**可以獲得幾個重要資訊:

最簡單有效的方法就是讓get不要在epoll執行緒處理。

方法很簡單,在(src/serv.cpp) 把 reg_proc(get, 「r」) 改為 reg_proc(get, 「rt」)。

再跑bench

./get-ssdb-bench 127.0.0.1 8888 4000000 200

qps: 41877

./set-ssdb-bench 127.0.0.1 8888 4000000 200

qps: 23454

ps,給ssdb的作者提issue,希望在專案**中做這個修改。(edit in 2015-05-19, 作者已採納修改)

類的設計問題

類是物件導向的最小單元,是物件導向程式的細胞 類的作用是將資料與相關功能進行繫結 類的設計需要從以下幾個方面考慮 1 資料與功能 是資料的成分大還是功能的成分大 2 構造與配置 資料 參量 是通過構造完成還是通過配置設定的 本質是資料的可變性或可配置性 3 資料和功能的可變性 理論上資料和功能都是可...

類圖設計的問題

請教各位高人有關類圖設計的問題 1.類圖有必要把所用資料庫表全部設計出來嗎?這是我聽別人所說 但我自已的體會應該是uml設計同資料庫表無關 但是為何即使我自已設計出來的類圖也感覺像是在設計資料庫表一樣呢?2.類圖需要把所有的頁面類設計出來嗎?因為我們是用c 做網頁開發的 朋友建議說類圖設計應包括所有...

設計登入窗體的問題

最近在csdn上總是看見關於登入窗體的問題,這在csdn上已經是老問題了,所以現在介紹乙個方法。在winform中,程式總是從main函式開始的,main中的 static void main 其中login就是登入窗體。dialogresult是窗體的返回資訊。在login窗體中,要這樣寫 if ...