Java线程池设置大小-如何合理利用CPU-记录

每个人都想完全榨干CPU,但明显,对于一个需要7*24小时无间断运行的系统,你必须把CPU的使用率保持在70%左右,100%使用很容易造成系统hang住,再加上线程池设置的不合理,导致系统资源持续被占用无法释放,灾难就爆发了,所以,确认CPU利用率是第一步。


比如你的线程任务需要大量I/O操作,依赖了磁盘、存储性能;如果你依赖网络通讯,那么更考验服务端的处理能力以及你的网络质量;这些情况可以总结是“任务执行的平均时间”、“任务最大的超时时间”、“网络延迟时间”等,或者叫“计算时间”。

假如我计算了以上所有的时间平均是200ms,可以理解成单线程模式tps可以达到5,如果我有大小为100的线程池,那么tps理论上可以达到500;但是要考虑实际的系统资源,比如很常见的中低档服务器配置“4路12核”,其逻辑个数可以达到96,但是我们不可以把线程池大小设置成96,我们一台服务器不可能只运行一个服务,而且我们要考虑其他比如“GC线程”之类的消耗。

java代码获取逻辑个数:

int processNum = Runtime.getRuntime().availableProcessors();//获取Processors
System.out.println("逻辑个数:" + processNum);

如果你的线程一直在处理接踵而至的任务,没有任何一点空余时间,那么你就要考虑针对线程池排队策略的问题,本篇先不讲。如果我们的线程无任何等待时间,那么:

利用《Java Concurrency in Practice》一书中提到了一个计算公式:

ThreadPoolsSize = CPU_n * CPU_t * ( 1 + \frac{T_w}{T_c})

线程池最优大小=CPU逻辑数*CPU期望使用率*任务比例(w等待时间、c计算时间)。

96 * 70% * (1+(0/200)) = 96 * 70% * 1 = 67.2 ≈ 67


以上内容均是个人的工作记录,如果偏差,欢迎指正。

你可能感兴趣的:(java,thread,多线程)