V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linyimin520812
V2EX  ›  程序员

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

  •  
  •   linyimin520812 · 197 天前 · 1926 次点击
    这是一个创建于 197 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    24 条回复    2023-10-14 16:17:37 +08:00
    julyclyde
        1
    julyclyde  
       197 天前
    你们 Java 应用一般都是长时间运行的
    启动阶段占比极低
    研究这个没啥意义
    rrfeng
        2
    rrfeng  
       197 天前
    哈哈哈 java 的启动时间真的一言难尽
    rrfeng
        3
    rrfeng  
       197 天前   ❤️ 2
    依稀记得有个帖子优化 java 应用启动时间,被好多人喷
    linyimin520812
        4
    linyimin520812  
    OP
       197 天前
    @julyclyde 研究的过程还是很有意思的,接触到了很多新的概念
    linyimin520812
        5
    linyimin520812  
    OP
       197 天前
    @rrfeng #3 这个帖子好像也是我发的😂
    julyclyde
        6
    julyclyde  
       197 天前
    @rrfeng 我一只觉得启动慢都是框架的 class 层数太多导致的
    其实也没干多少实事吧

    但是因为是层叠结构,加 cpu 核能起到什么效果吗?
    flynnlemon
        7
    flynnlemon  
       197 天前   ❤️ 1
    我觉得这个是需要看具体的 Java 应用,如果某应用启动的时候并发操作多,可被多核优化,那么效果就明显,否则效果就不太好。他的对比验证选了 0.5 核做对比就比较鸡贼,2 核启动花了 10-15s ,0.5 核启动花了 40s ,0.5 核的情况下单核心的时间片都被分走一半了,启动效果打折是很明显的。
    qiaofanxing
        8
    qiaofanxing  
       197 天前
    我好像听说有的手机厂商对微信有优化,点开微信就在 CPU 上做手脚,让系统“看起来”更流畅
    linyimin520812
        9
    linyimin520812  
    OP
       197 天前
    @julyclyde #6 是的,特别是 spring 框架下,启动过程是单线程的,这样添加 CPU 核数可能作用不大,但是可以通过一些手段,将耗时的 Bean 的初始化方法异步化,这样添加 CPU 核数可能就有用了
    julyclyde
        10
    julyclyde  
       197 天前
    @linyimin520812 初始化方法异步化,是不是得修改源代码啊?似乎并不是直接加核就能生效的吧?
    chendy
        11
    chendy  
       197 天前   ❤️ 1
    思路很有意思但是感觉意义不大,因为启动速度慢一般不是因为资源不够而是资源利用率不高
    启动慢的一般是要加载的 class 多,要扫描的包多,但是印象里这玩意是单线程的,加核心数没用
    启动特别慢的一般是启动过程中要查数据库之类的,加核心数也没用
    所以,这个操作对于启动过程中会用多线程的应用有用,另外可能会影响 gc 的一些参数(收集器线程数啥的)
    linyimin520812
        12
    linyimin520812  
    OP
       197 天前
    @julyclyde #10 这个我之前实现过,就是需要引入个 jar 包,通过动态代理的方式,将初始化方法丢到线程池中,最后等待启动完成
    julyclyde
        13
    julyclyde  
       197 天前
    @linyimin520812 厉害了
    linyimin520812
        14
    linyimin520812  
    OP
       197 天前
    @chendy 是的,刚看到这种方法的时候,觉得很有创意
    linyimin520812
        15
    linyimin520812  
    OP
       197 天前
    @chendy 有一个点就是,Java 应用启动后一般会有一个预热过程,这个过程添加核心数会很有用
    linyimin520812
        16
    linyimin520812  
    OP
       197 天前
    @qiaofanxing 哈哈哈,我还看到过反向操作的,不知道真假,就是点开其他 app 的时候,自己的 app 就疯狂占用 CPU ,让别人的 app 操作卡顿
    reeco
        17
    reeco  
       197 天前
    对于 spring 这种主线程启动的服务来说,没啥用
    learningman
        18
    learningman  
       197 天前
    @qiaofanxing 确实有,而且已经标准化了
    https://github.com/Tencent/Hardcoder
    wildec
        19
    wildec  
       197 天前   ❤️ 1
    Android 上面超级应用微信、相机等加速启动都是通过这种方式来的
    VYSE
        20
    VYSE  
       197 天前
    Java 搞个常驻, 类似 Zygote 或者 Chrome, 就不用担心启动时间的问题了
    helenfrank
        21
    helenfrank  
       197 天前
    这个看起来还行,或者给个参数 kubelet 调用高性能节点快速启动应用, 然后滚动到正常节点?
    yinmin
        22
    yinmin  
       196 天前 via Android
    java 要搞常驻的。隔壁 python 和 node.js 的容器冷启动才 0.3 秒,没法比啊。
    julyclyde
        23
    julyclyde  
       196 天前
    @helenfrank 滚动到正常节点不是另外启动一个再关闭旧的么
    notwaste
        24
    notwaste  
       196 天前
    Java 好像没这个必要吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2816 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:12 · PVG 20:12 · LAX 05:12 · JFK 08:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.