对于thrift的几种server模型在不一样场景下的性能表现作了一个压测,结果仅供参考。网络
(一)环境多线程
服务端机器:并发
24核CPU,E5-2430,2.5GHz,96GB内存性能
客户端机器:spa
24核CPU,E5-2430,2.5GHz,64GB内存线程
网络环境:日志
千兆网server
thrift版本:xml
0.9.1blog
语言:
C++
服务端处理:
sleep 0.5ms,打印一条日志
(二)不一样server特色
每新到一个链接就新建一个线程处理,直到链接关闭线程销毁
线程数=当前链接数,线程数无限制
新建线程&销毁线程耗资源
主线程将新链接放入任务队列,工做线程从任务队列区链接处理,直到链接关闭线程再从任务队列取链接
线程数=线程池size
若是线程池设置的不够,可能致使上游等待
使用libevent
(三)压测结果
对每种状况并发执行500000个请求
threadpool的size:2048
nonblocking中,work线程池size:256,IO线程个数:256
qps | 线程池+长链接 | 线程池+短链接 | 多线程+长链接 | 多线程+短链接 | 非阻塞+长链接 | 非阻塞+短链接 |
4 | 5102 | 3571 | 5102 | 3521 | 5319 | 4032 |
8 | 10416 | 7352 | 10416 | 6944 | 10416 | 7352 |
16 | 20833 | 13157 | 20833 | 12500 | 19230 | 12500 |
32 | 35714 | 17857 | 35714 | 15625 | 31250 | 19230 |
64 | 35714 | 19230 | 35714 | 20833 | 35714 | 22727 |
128 | 33333 | 19230 | 35714 | 20833 | 35714 | 19230 |
256 | 27777 | 19230 | 35714 | 19230 | 41666 | 20833 |
512 | 27777 | 17857 | 27777 | 16129 | 41666 | 19230 |
1024 | 27777 | 17857 | 27777 | 16666 | 41666 | 19230 |
2048 | 27777 | 13888 | 27777 | 12820 | 50000 |
对比图以下所示:
(四)结论
1)线程池threadpool和多线程threaded性能差异不大
2)在全部模型中,长链接比短链接性能高30%~50%,且性能最优时均在并发链接为32~256时
3)在并发达到512后,只用非阻塞+长链接的性能逐步提高,其余case的性能都会随着并发的增大而下降
综上,长链接时使用非阻塞方式性能最优;短链接时,各类模型差别不大。