线程池数量
线程数的设置需要考虑三方面的因素,服务器的配置、服务器资源的预算和任务自身的特性。具体来说就是服务器有多少个CPU,多少内存,IO支持的最大QPS是多少,任务主要执行的是计算、IO还是一些混合操作,任务中是否包含数据库连接等的稀缺资源。线程池的线程数设置主要取决于这些因素。
如果一个请求中,计算机操作需要5ms,DB需要100ms,对于一个8核的cpu来说需要设置多少个线程
1.可以拆分为两个线程池,cpu密集型的是n+1个线程,,IO密集型的就是n*2
2.如果不可以拆分,就是5/(5+100),cpu的利用率是在21%,1/(5/(100+5)) *n就是168,也就是需要的线程数
那么如何获取n的值?(也就是cpu核心数目)
int n = Runtime.getRuntime().availableProcessors();
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
虽说最佳线程数目算法更准确,但是线程等待时间和线程CPU时间不好测量,实际情况使用得比较少,一般用经验值就差不多了
QPS说明:
QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
每秒查询率:
因特网上,经常用每秒查询率来衡量域名系统服务器的机器的性能,即为QPS。
对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
计算关系:
QPS = 并发量 / 平均响应时间
并发量 = QPS * 平均响应时间