cpu 密集型任务,线程数应该等于核心数还是核心数+1

2021-08-05 13:38:00 +08:00
 git00ll

虽说是 cpu 密集型,但是也会有一些如打印日志这样的 io 操作,而且 logback 日志底层是堵塞的。 那么线程数应该等于核心数还是核心数+1 呢??

现象

执行 cpu 密集型操作,使用线程池数量等于 cpu 核心数,任务跑起来后,cpu 占用只能到 80%左右,无法充分利用。 猜测是因为任务中的日志部分涉及到资源堵塞和同步。

分析

增大一个线程数,好处是能利用其他线程输出日志堵塞时的 cpu 资源,缺点是增大了线程上下文切换消耗的资源。

当节省的资源 > 消耗的资源时,增大线程数是划算的,否则不划算。

结论,尚未测试

5409 次点击
所在节点    Java
33 条回复
jdjingdian
2021-08-05 14:03:33 +08:00
同问,因为经常看到开源项目编译命令推荐用“make -j $(($(nproc) + 1))”,不是很明白为什么要要比 CPU 线程数多 1
wowo243
2021-08-05 14:17:57 +08:00
CEBBCAT
2021-08-05 14:31:15 +08:00
jdhao
2021-08-05 14:34:40 +08:00
CPU 密集型任务不是应该使用多进程? 你用多线程能使用多核的能力吗。一般多线程应该是用于网络 io 密集型场景。

进程数太多不一定是好的,需要根据自己的任务做 benchmark
lithiumii
2021-08-05 14:44:28 +08:00
核心数呗,省下来的一点点利用率用于万一卡死了 ssh 还能连上去看看发生了什么(
wanguorui123
2021-08-05 14:49:56 +08:00
多加几条没问题,比较关键的应用优先级调高点,防止分不到时间片卡死
Geele
2021-08-05 14:53:42 +08:00
@jdhao Java 多线程不能使用多核能力吗?
Leviathann
2021-08-05 15:00:29 +08:00
@jdhao CPU 密集必须多进程的不是 python 吗。。
777777
2021-08-05 15:07:16 +08:00
用 go,不用管线程
tabris17
2021-08-05 15:12:17 +08:00
经验?我看到还有说 CPU*2 的呢
ikas
2021-08-05 15:35:41 +08:00
...这个肯定要看具体的用途..比如你的任务都是很快就执行完的..那线程就可以配置为 cpu 内核数量(左右),因为相当于每个线程一直在处理,不停顿..如果你的任务是有 io 相关,需要等待的..这时候你的线程数量限制主要是要考量你的内存能支持开多少个.
cubecube
2021-08-05 15:56:15 +08:00
@tabris17 *2 肯定不是 cpu 密集型了。。
其实有一个公式,就是算 io 和 cpu 的占比算的,我记得美团有个文章结过

https://p0.meituan.net/travelcube/23a44974ff68a08261fb675242b83648181953.png
Cloutain
2021-08-05 16:20:00 +08:00
建议协程
iceheart
2021-08-05 16:31:09 +08:00
还得看负载啊
jdhao
2021-08-05 16:32:05 +08:00
@Geele Java 不太了解,Java 里面线程概念和其他似乎不一样
dranfree
2021-08-05 16:42:05 +08:00
@jdhao 多线程就是为了充分利用 CPU 资源,怎么就不能使用多核能力了。。
zavierx
2021-08-05 16:45:09 +08:00
@jdhao cpu 本来就是按线程调度的,为什么用不了多核?
sununiq
2021-08-05 17:07:06 +08:00
```java
benchmark
```
billlee
2021-08-05 17:19:28 +08:00
@jdhao 这世上不是只有 cpython
rayw0ng
2021-08-05 18:06:40 +08:00
kotlin coroutine 的 Dispatcher 默认线程数 = CPU 核心数,Dispatcher.IO 默认线程数 = 64,仅供参考。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX