測試機: amd 兩核心 ,客戶端與服務端都在本機上跑。
網絡層:A類epoll線程處理accept的被動連接;
B類epoll線程處理connect的主動連接;
C類epoll線程把A或B類epoll線程得到的連接分配到某個線程,專門處理send和recv操作;
D類線程池處理C類拋出來的數據,處理完之后,再投遞到C類線程做send操作。
用ab測試短連接
ab -n 1000 -c 150 http://127.0.0.1:8090/
測試20次之后,得到一個峰值tps=6000
用字節的寫的基于數據echo測試的壓力測試程序測試長連接:
client發出64字節數據,echosvrd返回64字節,client又發出64字節。
每次傳輸網絡傳輸數據在64字節以下的情況下:
./stree_client 127.0.0.1 8090 100 得到tps=13851
./stree_client 127.0.0.1 8090 1000 得到tps=16641
./stree_client 127.0.0.1 8090 10000 得到tps=16600 service cpu跑到90%,始終在90%以下;stree_client的cpu跑到32%左右;
./stree_client 127.0.0.1 8090 20000 stree_client的cpu跑到100%告終
./stree_client 127.0.0.1 8090 15000 stree_client的cpu跑到100%告終
把日志的輸出級別調到1,此時基本無日志輸出:
./stree_client 127.0.0.1 8090 10000 得到tps=29436 service cpu跑到70%;stree_client的cpu跑到48%左右;
./stree_client 127.0.0.1 8090 15000 stree_client的cpu跑到100%告終
再把網絡傳輸的字節調整為128字節左右:
./stree_client 127.0.0.1 8090 10000 得到tps=29179 service cpu跑到68%;stree_client的cpu跑到45%左右;
結論:
在本機測試,就忽略了網絡io時延,得到網絡引擎cpu跑到100%時的tps是 不超過30000,或者不偏離30000很遠,
此時并發連接數在10000