測算Redis處理實際生產請求的QPS/TPS
Benchmark工具
redis發布版本中自帶了redis-benchmark性能測試工具;
示例:
使用50個並發連接,發出100000個請求,每個請求的數據為2kb,
測試host為127.0.0.1 端口為6379的redis服務器性能:
./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -d 2 ... ====== SADD ====== 100000 requests completed in 2.27 seconds 500 parallel clients 3 bytes payload keep alive: 1 4.66% <= 1 milliseconds 14.15% <= 2 milliseconds 23.87% <= 3 milliseconds 33.59% <= 4 milliseconds 43.13% <= 5 milliseconds 52.69% <= 6 milliseconds 62.08% <= 7 milliseconds 71.43% <= 8 milliseconds 80.66% <= 9 milliseconds 89.10% <= 10 milliseconds 95.23% <= 11 milliseconds 98.76% <= 12 milliseconds 99.59% <= 13 milliseconds 99.78% <= 14 milliseconds 99.87% <= 15 milliseconds 99.95% <= 16 milliseconds 99.99% <= 17 milliseconds 100.00% <= 17 milliseconds 44150.11 requests per second
我們關注結果最后一行:每秒44150.11個請求,既QPS4.4萬;
但這里的數據都只是測試數據,測出來的QPS不能代表實際生產的處理能力;
測算redis處理實際生產請求的QPS/TPS
在實際生產中,我們需要關心這個指標,在我們的應用場景中,
redis能夠處理的最大的(QPS/TPS)是多少?
測量redis QPS的方式有兩種:
-
估計生產的報文大小,使用benchmark工具指定-d數據塊大小來模擬;
-
使用redis-cli中info統計信息計算差值;
redis-cli的info命令中有一項total_commands_processed表示:從啟動到現在處理的所有命令總數,可以通過統計兩次info指令間的差值來計算QPS:
//返回redis-cli info中total_commands_processed的結果 long getCmdProcessNum(redisContext *c) { string strVal; getInfo(c,strVal); map<string,string> mpVal; parserInfo(strVal,mpVal); map<string,string>::iterator iter = mpVal.find("total_commands_processed"); if(iter != mpVal.end()) { return atol(iter->second.c_str()); } cout << "[err] not found total_commands_processed" << endl; return 0; }
程序實現很簡單,就不全貼在這里了,完整代碼詳見github:
https://github.com/me115/cppset/tree/master/redisTPS
在實際生產中,運行這個程序來統計實際的QPS。
運行示例:
/opt/app/redisTPS#./redisTPS Time: 1 Process:40962 TPS:40839.48 Time: 1 Process:43741 TPS:43610.17 Time: 1 Process:38935 TPS:38779.88 Time: 1 Process:31724 TPS:31597.61 Time: 1 Process:32169 TPS:32008.96 Time: 1 Process:31634 TPS:31476.62 Time: 1 Process:46007 TPS:45823.71 Time: 1 Process:50460 TPS:50258.96 Time: 1 Process:47309 TPS:47167.50 Time: 1 Process:50511 TPS:50359.92 ...