Java 最佳线程数怎么得来?

2021-01-05 19:17:24 +08:00
 shangzhanyu
根据公式:服务器端最佳线程数量=((线程等待时间+线程 cpu 时间)/线程 cpu 时间) * cpu 数量,算出来的数量不过百,但是实际情况 service 的线程数又设置的 500 甚至更多,又看了 HotSpot 用的 1:1 内核线程,搞懵逼了。。。
6321 次点击
所在节点    Java
50 条回复
shangzhanyu
2021-01-06 10:22:12 +08:00
@wysnylc 不信书才有此问
shangzhanyu
2021-01-06 10:24:16 +08:00
@php8 这个我去再研究下,好像是这么回事
YouLMAO
2021-01-06 10:36:18 +08:00
@php8 大厂 io 都是 epoll, 是 cpu 中断通知工作线程, 而工作线程从不停止等 io
shangzhanyu
2021-01-06 10:49:31 +08:00
@YouLMAO epoll -> tomcat 分配 -> 工作线程执行 java 程序,现在就差 jvm 和操作系统线程之间的关系了
Jooooooooo
2021-01-06 11:04:52 +08:00
你看 io, 如果 io 很多基本都在等 io, 那线程数就大点

如果都是内存本地操作, 线程数和核数差不多就行
emSaVya
2021-01-06 11:37:01 +08:00
你们可以试试 用 Vizier 这种调参工具 来确定线程数
laminux29
2021-01-06 12:01:37 +08:00
现代软硬件太复杂了,教科书里那种简单的公式只能用来参考。建议通过实际压测 + 2 分法来寻找这个值。
YouLMAO
2021-01-06 13:07:26 +08:00
java nio/nio2 老早就是 epoll 异步的了, 不管 tomcat 还是 netty, 很多人在说 io 密集就多开 io 线程, 这是啥年代的网民????
有数据才会触发的呀, io 触发后业务逻辑是在业务线程池完成的, io 线程池很少就能十万并发
tairan2006
2021-01-06 13:11:36 +08:00
你要自己压测,或者换 golang 无脑开协程…
php8
2021-01-06 13:20:58 +08:00
@YouLMAO 同步阻塞 IO 依然是最主流的 Java 并发模型,tomcat 和 springboot 的默认 worker 线程数是 200 。异步回调写写 framework 和 infra 还行,拿来写业务逻辑有时会比较麻烦,大厂不论 C++还是 JVM 都搞了协程。
fakeshadow
2021-01-06 13:25:07 +08:00
常见的异步并不能处理所有 IO(如果你用 io_uring 或者 IOCP 之类的当我没说),所以阻塞线程池的 IO 作用仍然是很大的。具体设置多少可以根据你的实际情况,一般上限高的都是 spin on load 。
assiadamo
2021-01-06 13:32:22 +08:00
线程池设置线程数可以在运行时动态调的,根本不慌
weizhen199
2021-01-06 13:33:58 +08:00
很多大佬提过了,自己压测。

这个影响的因素包括了 cpu 架构,别试图整通项式了。 但是一个大致的范围还是能参考的.
elintwenty
2021-01-06 13:36:50 +08:00
美团技术团队的博客: https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
这个问题文章给的结论就是
—— “也曾尝试着去追求线程池参数设置的合理性,但面对业界方案具体落地的复杂性、可维护性以及真实运行环境的不确定性,我们在前两个方向上可谓“举步维艰”。最终,我们回到线程池参数动态化方向上探索,得出一个且可以解决业务问题的方案,”
YouLMAO
2021-01-06 13:37:29 +08:00
我只看过 morgan stanley 和 facebook 都是异步的, 我是感觉大陆所谓架构师在 500nm 芯片年代追 5nm
Goldilocks
2021-01-06 13:47:02 +08:00
@YouLMAO 那不是异步。真正的异步 driven 的 io 只有 Windows 才有,linux 上是半残废没人用。
YouLMAO
2021-01-06 13:53:18 +08:00
@Goldilocks 举个例子, 我随手一搜, tomcat 8 默认是 nio 或 nio2, linux 下是不是异步? 或者等价问题 8 个 io 线程在 tomcat 8 够不够用, 还是说本帖架构师:最好核数*2 甚至 pool size=上百的线程池
gdcbhtd
2021-01-06 14:30:03 +08:00
IO 密集型任务:2*CPU 数,因为 IO 密集型任务,线程不是一直在运行,所以可以配置多一点;
CPU 密集型任务:因为一直在使用 CPU,所以要保证线程数不能太多,可以 CPU 数+1 ;
shangzhanyu
2021-01-06 15:12:03 +08:00
感觉又要默默的去复习一下操作系统了。。。
xcstream
2021-01-06 15:19:58 +08:00
只要大于 cpu 核心数 小于千 区别应该不是很大

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

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

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

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

© 2021 V2EX