看到一个很有创意的应用启动加速文章:
https://piotrminkowski.com/2023/08/22/resize-cpu-limit-to-speed-up-java-startup-on-kubernetes/
核心思路就是在启动时调大 CPU 核数,启动完成后再调回原来的 CPU 核数
看评论,这种方式对于 Java 应用,可能会对 GC 有影响。不知道有没有人在生产环境使用过这种启动加速方式,会不会有坑。
1
julyclyde 2023-10-13 10:57:32 +08:00
你们 Java 应用一般都是长时间运行的
启动阶段占比极低 研究这个没啥意义 |
2
rrfeng 2023-10-13 11:08:23 +08:00
哈哈哈 java 的启动时间真的一言难尽
|
3
rrfeng 2023-10-13 11:08:39 +08:00 2
依稀记得有个帖子优化 java 应用启动时间,被好多人喷
|
4
linyimin520812 OP @julyclyde 研究的过程还是很有意思的,接触到了很多新的概念
|
5
linyimin520812 OP @rrfeng #3 这个帖子好像也是我发的😂
|
6
julyclyde 2023-10-13 11:14:57 +08:00
|
7
flynnlemon 2023-10-13 11:18:54 +08:00 1
我觉得这个是需要看具体的 Java 应用,如果某应用启动的时候并发操作多,可被多核优化,那么效果就明显,否则效果就不太好。他的对比验证选了 0.5 核做对比就比较鸡贼,2 核启动花了 10-15s ,0.5 核启动花了 40s ,0.5 核的情况下单核心的时间片都被分走一半了,启动效果打折是很明显的。
|
8
qiaofanxing 2023-10-13 11:20:56 +08:00
我好像听说有的手机厂商对微信有优化,点开微信就在 CPU 上做手脚,让系统“看起来”更流畅
|
9
linyimin520812 OP @julyclyde #6 是的,特别是 spring 框架下,启动过程是单线程的,这样添加 CPU 核数可能作用不大,但是可以通过一些手段,将耗时的 Bean 的初始化方法异步化,这样添加 CPU 核数可能就有用了
|
10
julyclyde 2023-10-13 11:24:32 +08:00
@linyimin520812 初始化方法异步化,是不是得修改源代码啊?似乎并不是直接加核就能生效的吧?
|
11
chendy 2023-10-13 11:26:26 +08:00 1
思路很有意思但是感觉意义不大,因为启动速度慢一般不是因为资源不够而是资源利用率不高
启动慢的一般是要加载的 class 多,要扫描的包多,但是印象里这玩意是单线程的,加核心数没用 启动特别慢的一般是启动过程中要查数据库之类的,加核心数也没用 所以,这个操作对于启动过程中会用多线程的应用有用,另外可能会影响 gc 的一些参数(收集器线程数啥的) |
12
linyimin520812 OP @julyclyde #10 这个我之前实现过,就是需要引入个 jar 包,通过动态代理的方式,将初始化方法丢到线程池中,最后等待启动完成
|
13
julyclyde 2023-10-13 11:27:24 +08:00
@linyimin520812 厉害了
|
14
linyimin520812 OP @chendy 是的,刚看到这种方法的时候,觉得很有创意
|
15
linyimin520812 OP @chendy 有一个点就是,Java 应用启动后一般会有一个预热过程,这个过程添加核心数会很有用
|
16
linyimin520812 OP @qiaofanxing 哈哈哈,我还看到过反向操作的,不知道真假,就是点开其他 app 的时候,自己的 app 就疯狂占用 CPU ,让别人的 app 操作卡顿
|
17
reeco 2023-10-13 12:30:37 +08:00
对于 spring 这种主线程启动的服务来说,没啥用
|
18
learningman 2023-10-13 12:36:13 +08:00
|
19
wildec 2023-10-13 12:52:42 +08:00 1
Android 上面超级应用微信、相机等加速启动都是通过这种方式来的
|
20
VYSE 2023-10-13 15:20:23 +08:00
Java 搞个常驻, 类似 Zygote 或者 Chrome, 就不用担心启动时间的问题了
|
21
helenfrank 2023-10-13 15:53:26 +08:00
这个看起来还行,或者给个参数 kubelet 调用高性能节点快速启动应用, 然后滚动到正常节点?
|
22
yinmin 2023-10-14 00:19:51 +08:00 via Android
java 要搞常驻的。隔壁 python 和 node.js 的容器冷启动才 0.3 秒,没法比啊。
|
23
julyclyde 2023-10-14 12:48:20 +08:00
@helenfrank 滚动到正常节点不是另外启动一个再关闭旧的么
|
24
notwaste 2023-10-14 16:17:37 +08:00
Java 好像没这个必要吧
|