缘起
需要设置线程数量地方:tomcat,mysql,线程池
问题:到底设置多少现成量合适呢?
答案:不是臆测,根据数据说话
1+M+N模型
1:1个监听线程,监听新来的socket
N:N个IO线程,负责对socket进行读写。N一般等于cpu核数
M:业务逻辑处理线程,这里就讨论这个线程数量
为啥要用多线程
单线程不好么,单线程会有等待资源的情况(网络IO,磁盘IO),这时候CPU就可以干点其他事
CPU密集 vs. IO密集
- 用CPU比较多就是CPU密集;IO比较多就是IO密集
CPU:IO 比测算
Sum内存和IO时间,统计计算
单接口和整体怎么统一:一种方法是先计算一个接口的比,然后根据接口请求梳理和整体QPS比重,计算加权值; 第二种是测试一段时间的内存和IO的整体时间比
线程数量计算
如 2核,CPU:IO = 1:1 那么4个线程就可以占满CPU了 (2/(1/(1+1)))
总结:N核服务器,通过执行业务的单线程分析出本地计算时间为x(CPU占用时间),等待时间为y(IO时间),则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。
经验之谈:后端非CPU密集业务,瓶颈都是在IO。实际开发也不会测试每个接口的CPU和IO时间,差不多点设置几十几百都可能。
纯内存场景Redis
CPU1
IO 0
那么就有N*(x+y)/x=N*(1+0)/1=N
END