启动时通过调大 CPU 核数加速启动是否有坑

2023-10-13 10:27:20 +08:00
 linyimin520812

看到一个很有创意的应用启动加速文章:

https://piotrminkowski.com/2023/08/22/resize-cpu-limit-to-speed-up-java-startup-on-kubernetes/

核心思路就是在启动时调大 CPU 核数,启动完成后再调回原来的 CPU 核数

看评论,这种方式对于 Java 应用,可能会对 GC 有影响。不知道有没有人在生产环境使用过这种启动加速方式,会不会有坑。

2137 次点击
所在节点    程序员
24 条回复
julyclyde
2023-10-13 10:57:32 +08:00
你们 Java 应用一般都是长时间运行的
启动阶段占比极低
研究这个没啥意义
rrfeng
2023-10-13 11:08:23 +08:00
哈哈哈 java 的启动时间真的一言难尽
rrfeng
2023-10-13 11:08:39 +08:00
依稀记得有个帖子优化 java 应用启动时间,被好多人喷
linyimin520812
2023-10-13 11:13:21 +08:00
@julyclyde 研究的过程还是很有意思的,接触到了很多新的概念
linyimin520812
2023-10-13 11:13:40 +08:00
@rrfeng #3 这个帖子好像也是我发的😂
julyclyde
2023-10-13 11:14:57 +08:00
@rrfeng 我一只觉得启动慢都是框架的 class 层数太多导致的
其实也没干多少实事吧

但是因为是层叠结构,加 cpu 核能起到什么效果吗?
flynnlemon
2023-10-13 11:18:54 +08:00
我觉得这个是需要看具体的 Java 应用,如果某应用启动的时候并发操作多,可被多核优化,那么效果就明显,否则效果就不太好。他的对比验证选了 0.5 核做对比就比较鸡贼,2 核启动花了 10-15s ,0.5 核启动花了 40s ,0.5 核的情况下单核心的时间片都被分走一半了,启动效果打折是很明显的。
qiaofanxing
2023-10-13 11:20:56 +08:00
我好像听说有的手机厂商对微信有优化,点开微信就在 CPU 上做手脚,让系统“看起来”更流畅
linyimin520812
2023-10-13 11:21:41 +08:00
@julyclyde #6 是的,特别是 spring 框架下,启动过程是单线程的,这样添加 CPU 核数可能作用不大,但是可以通过一些手段,将耗时的 Bean 的初始化方法异步化,这样添加 CPU 核数可能就有用了
julyclyde
2023-10-13 11:24:32 +08:00
@linyimin520812 初始化方法异步化,是不是得修改源代码啊?似乎并不是直接加核就能生效的吧?
chendy
2023-10-13 11:26:26 +08:00
思路很有意思但是感觉意义不大,因为启动速度慢一般不是因为资源不够而是资源利用率不高
启动慢的一般是要加载的 class 多,要扫描的包多,但是印象里这玩意是单线程的,加核心数没用
启动特别慢的一般是启动过程中要查数据库之类的,加核心数也没用
所以,这个操作对于启动过程中会用多线程的应用有用,另外可能会影响 gc 的一些参数(收集器线程数啥的)
linyimin520812
2023-10-13 11:26:46 +08:00
@julyclyde #10 这个我之前实现过,就是需要引入个 jar 包,通过动态代理的方式,将初始化方法丢到线程池中,最后等待启动完成
julyclyde
2023-10-13 11:27:24 +08:00
@linyimin520812 厉害了
linyimin520812
2023-10-13 11:28:05 +08:00
@chendy 是的,刚看到这种方法的时候,觉得很有创意
linyimin520812
2023-10-13 11:35:28 +08:00
@chendy 有一个点就是,Java 应用启动后一般会有一个预热过程,这个过程添加核心数会很有用
linyimin520812
2023-10-13 11:43:39 +08:00
@qiaofanxing 哈哈哈,我还看到过反向操作的,不知道真假,就是点开其他 app 的时候,自己的 app 就疯狂占用 CPU ,让别人的 app 操作卡顿
reeco
2023-10-13 12:30:37 +08:00
对于 spring 这种主线程启动的服务来说,没啥用
learningman
2023-10-13 12:36:13 +08:00
@qiaofanxing 确实有,而且已经标准化了
https://github.com/Tencent/Hardcoder
wildec
2023-10-13 12:52:42 +08:00
Android 上面超级应用微信、相机等加速启动都是通过这种方式来的
VYSE
2023-10-13 15:20:23 +08:00
Java 搞个常驻, 类似 Zygote 或者 Chrome, 就不用担心启动时间的问题了

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

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

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

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

© 2021 V2EX