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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值