V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ttkit
V2EX  ›  程序员

吐糟阿里云 ECS 服务器, 4 核 8G 打包 nextjs 项目都能内存溢出!用了 github Actions 打包后感觉被骗了!

  •  
  •   ttkit · 17 天前 · 5171 次点击

    之前的机器是 2 核 4g 的配置,打包 nextjs 项目经常不成功,后面升级了 4 核 8G 打包成功了,但是速度很慢,现在好了直接不能打包!

    无奈使用免费的 github Actions ,发现吊打阿里云服务器啊,还没一个免费的服务好用!这钱花的不值~

    是我不会用阿里云 esc 吗,还是阿里云的 ecs 有猫腻。。。

    ecs.png github.png ecs1.png

    64 条回复    2025-01-13 16:09:58 +08:00
    newaccount
        1
    newaccount  
       17 天前
    默认没有 swap 吧,你加个试试看
    rekulas
        2
    rekulas  
       17 天前
    这个最好排查下,不一定是阿里的问题,有可能你这套打包就是超了 8g 呢。。。我们之前有一个 nuxt 的也是打包内存直接 oom ,现在的前端几十个页面打包时间几分钟内存数 G ,后端数百项 api 打包 20s 内存几百 M ,实在不想吐槽

    至于 github ,它的机器确实比较厚道,你的用的实例可能不止 8g
    ttkit
        3
    ttkit  
    OP
       17 天前
    @newaccount 大佬,swap 是什么?我一个小前端不是很懂运维的知识。
    ttkit
        4
    ttkit  
    OP
       17 天前
    @rekulas 是啊,太坑,打包这些都是 next 项目自带的,也问了 AI 有什么优化的方法,最多就是加 node 运行的最大内存还是不行。
    newaccount
        5
    newaccount  
       17 天前
    @ttkit #3 windows 的虚拟内存知道吧,在 linux 上就是 swap
    ttkit
        6
    ttkit  
    OP
       17 天前
    @newaccount 好的,我研究下
    skallz
        7
    skallz  
       17 天前
    打包直接用云效啊,你都用阿里云了为啥不直接用配套的云效流水线。。。
    hefish
        8
    hefish  
       17 天前
    就看在 esc ,ecs 混用的情况,感觉 op 技能还能再提高一些。
    ttkit
        10
    ttkit  
    OP
       17 天前
    @skallz 好的,谢谢提醒。
    ttkit
        11
    ttkit  
    OP
       17 天前
    @hefish 哈哈,是的,不是专业的,只能用的时候网上找找资料,问问 AI
    ttkit
        12
    ttkit  
    OP
       17 天前
    @baobao1270 这个就是专业👍
    gadfly3173
        13
    gadfly3173  
       17 天前 via Android   ❤️ 1
    我本地一个 build 完 12MB 的 angular9 的项目,打包的时候吃掉了 2.4GB 内存,再加上你系统其他占用什么的,要是没 swap 的话,超 8G 应该很轻松
    salmon5
        14
    salmon5  
       17 天前
    前端?
    ThisZKC
        15
    ThisZKC  
       17 天前
    国内各大公有云都有资源 基本官网价格的六折左右都能买到
    laminux29
        16
    laminux29  
       17 天前
    关于 swap:

    Windows 有个功能叫虚拟内存,在磁盘上设定一个文件,当成内存用。当物理内存满了后,就会开始用磁盘上的这个文件。代价是,早期用机械硬盘,速度极慢。但现在 nvme 了,速度很快。

    Linux 的 swap ,本质上也是虚拟内存,但是逻辑与 Windows 完全不一样,坑了很多人。swap 是 Linux 主动进行管理,把一小部分不常用的内容放在这里。当物理内存满了后,不一定会使用 swap ,而是会直接 kill 进程。所以经常发现,Linux 物理内存都用完了,swap 却几乎没怎么用。
    sagaxu
        17
    sagaxu  
       17 天前
    打包前先设置环境变量

    export NODE_OPTIONS=--max_old_space_size=4096
    ttkit
        18
    ttkit  
    OP
       17 天前
    @salmon5 bro, 我自己的定位不是前端,可以把我当成全栈(全干)!虽然从前端入行的。
    ttkit
        19
    ttkit  
    OP
       17 天前
    @laminux29 good, bro.
    ttkit
        20
    ttkit  
    OP
       17 天前
    @sagaxu 用了这个配置不行,感觉还是 ecs 服务器太拉垮,准备降低服务器配置了,多花 1000 多块钱很不开心。把这 1000 多去升级宽带更划算。
    sagaxu
        21
    sagaxu  
       17 天前
    node 下输入 v8.getHeapStatistics() 看看输出是什么,监控里显示内存只用了 50%,不大可能是 ECS 的问题
    ttkit
        22
    ttkit  
    OP
       17 天前
    @sagaxu v8.getHeapStatistics()
    {
    total_heap_size: 6516736,
    total_heap_size_executable: 262144,
    total_physical_size: 6291456,
    total_available_size: 2192958816,
    used_heap_size: 4726808,
    heap_size_limit: 2197815296,
    malloced_memory: 262312,
    peak_malloced_memory: 172416,
    does_zap_garbage: 0,
    number_of_native_contexts: 2,
    number_of_detached_contexts: 0,
    total_global_handles_size: 8192,
    used_global_handles_size: 2848,
    external_memory: 2293864
    }
    输出的这些。
    sagaxu
        23
    sagaxu  
       17 天前
    heap_size_limit: 2197815296, heap 最大只有 2G ,这个限制没打开

    参考 v8 的代码 heap/heap.cc
    size_t Heap::HeapSizeFromPhysicalMemory(uint64_t physical_memory) {
    // Compute the old generation size and cap it.
    uint64_t old_generation = physical_memory /
    kPhysicalMemoryToOldGenerationRatio *
    kHeapLimitMultiplier;
    old_generation =
    std::min(old_generation,
    static_cast<uint64_t>(MaxOldGenerationSize(physical_memory)));
    old_generation =
    std::max({old_generation, static_cast<uint64_t>(V8HeapTrait::kMinSize)});
    old_generation = RoundUp(old_generation, PageMetadata::kPageSize);

    size_t young_generation = YoungGenerationSizeFromOldGenerationSize(
    static_cast<size_t>(old_generation));
    return static_cast<size_t>(old_generation) + young_generation;
    }
    默认只能使用 1/4 的物理内存
    ttkit
        24
    ttkit  
    OP
       17 天前
    @sagaxu 好兄弟可以了,我之前写了一个 sh 脚本:
    log "正在构建项目..."
    rm -rf .next/
    NODE_OPTIONS="--max-old-space-size=4096" npm run build || handle_error "构建失败"

    没加 export 导致的。
    这个做备选方案吧,还是 github actions 的自动化部署方案优秀,可以省不少钱。
    Nitromethane
        25
    Nitromethane  
       17 天前
    这和阿里云有屁关系,换到 aws 照样同样的错误
    goodryb
        26
    goodryb  
       17 天前   ❤️ 2
    打包这种重复性工作可以考虑用抢占实例,价格便宜,配置可以开高一些
    msg7086
        27
    msg7086  
       17 天前
    免费打包服务好用那是因为有大佬帮你付了费了,要是换你自己掏钱支付这些 runner 的费用你就知道肉疼了。Github 的收费打包机 2c7g (免费打包机的一半规格)收费价格是每分钟$0.008 ,相当于一天$11.52 ,一个月 300 多美刀。你再和 ECS 的价格比比?
    aru
        28
    aru  
       17 天前
    Github Actions 提供的虚拟机配置比较高:Linux 4 核 16 GB 内存 14 GB ssd
    性能全面打爆你用的这个 ecs 吧,特别 cpu 配额和 ssd 的 iops
    ttkit
        29
    ttkit  
    OP
       17 天前
    @msg7086 原来如此。
    darkengine
        30
    darkengine  
       17 天前
    今天刚试了 build 一个 express 项目爆了 heap ,不过我用的是 AWS 的 t2.micro 1C1GB 的丐版配置 😂
    xmumiffy
        31
    xmumiffy  
       17 天前
    @goodryb 抢占的性能突发实例性价比还要更好,开机积分就够打包完成了.
    wnpllrzodiac
        32
    wnpllrzodiac  
       16 天前 via Android
    前端代码都干了啥,塞了一个操作系统?
    Dragonphy
        33
    Dragonphy  
       16 天前
    Next.js 项目是这样的,我都不知道塞了什么,上次跑一个 GitHub 上拉下来的服务,我还特地更新了本地 CI 服务器配置。
    ttkit
        34
    ttkit  
    OP
       16 天前
    @darkengine 哈哈,node 项目就这样,npm 包依赖太多
    ttkit
        35
    ttkit  
    OP
       16 天前
    @wnpllrzodiac 打包的时候要分析几千个模块,nextjs 又要区分哪些页面需要服务端渲染哪些需要 spa 打包,所以页面多了会变慢。我现在用的是 nextjs 是 14 版本,Next.js 15 会好些,默认的打包工具从 Webpack 升级为 Turbopack 。
    ttkit
        36
    ttkit  
    OP
       16 天前
    @Dragonphy 准备有时间升级 15 版本了,看官方说 15 版本默认使用 Turbopack 了,Turbopack 的速度比 Webpack 快 700 倍,比 Vite 快 10 倍。这使得项目的构建速度大幅提升,开发者可以更高效地进行开发。
    darkengine
        37
    darkengine  
       16 天前
    @wnpllrzodiac 有一张很出名的梗图,node_modules 的。。。
    BG7ZAG
        38
    BG7ZAG  
       16 天前
    借助云效进行打包~
    cyningxu
        39
    cyningxu  
       16 天前 via Android
    上 swap ,云服务器默认都不开 swap 的,只要内存满了就会挂
    shintendo
        40
    shintendo  
       16 天前
    @ttkit 比 Vite 快 10 倍笑笑就好
    Sunzehui
        41
    Sunzehui  
       16 天前
    限制一下 nuxt 的并行打包数量应该可以解决
    corcre
        42
    corcre  
       16 天前
    @darkengine 勒索病毒加密了一小时还在加密 node_modules 文件夹那张吗🐶
    darkengine
        43
    darkengine  
       16 天前
    @corcre “全宇宙最重的东西”那张 😂
    importmeta
        44
    importmeta  
       16 天前
    我自己项目在本地打包, 只推镜像.
    PROJECT
        45
    PROJECT  
       16 天前
    要不试试腾讯云这个
    jiangzm
        46
    jiangzm  
       16 天前
    好奇问下 为什么会用 nextjs/nuxtjs 这类框架,是确实有 SSR 需求还是其他原因呢
    sleepm
        47
    sleepm  
       16 天前
    加 swap 管用,一直以为工具有 bug...
    sudo fallocate -l 3G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    sudo swapon --show
    free -h
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    ttkit
        48
    ttkit  
    OP
       16 天前
    @jiangzm 因为我的项目要做 seo 优化,所以必须用 nextjs 。
    ttkit
        49
    ttkit  
    OP
       16 天前
    @importmeta 啊这。。
    ttkit
        50
    ttkit  
    OP
       16 天前
    @sleepm 👍
    a1248499257
        51
    a1248499257  
       16 天前
    next.js 可以配置下 config ,限制下构建内存,不过会比较慢,另外这框架确实很容易内存溢出.. 例如在使用它自身的图片优化服务的时候
    tracebundy
        52
    tracebundy  
       16 天前
    你想阿里云 8G 达到 16G 的效果?
    perfectlife
        53
    perfectlife  
       16 天前
    前端在构建这一块现在搞得比后端真的是麻烦多了,又大又重
    seansong
        54
    seansong  
       16 天前
    前端太卷了,我平时构建 react 的时候,就感觉相当吃资源,也不理解这里面到底干了啥,以前用 nextjs ,后来换到 vite ,打包速度有提升,打包时候的占用也稍微好一些了
    terranboy
        55
    terranboy  
       16 天前
    阿里云打包确实慢
    shadowyue
        56
    shadowyue  
       16 天前
    前端构建的工具链用 nodejs 的迟早会被淘汰掉,性能太低了。
    估计以后都是被 rust 语言重写的工具链替代。
    yuezhiyuan
        57
    yuezhiyuan  
       16 天前
    nodejs 赶紧淘汰吧
    换个东西来支持 js
    daimaosix
        58
    daimaosix  
       16 天前 via Android
    啥机型?
    Lanzhijiang
        59
    Lanzhijiang  
       15 天前 via Android
    开 swap 基本上就能解决了。不过我认为阿里云默认不开 swap 就是故意的,想要一些人傻傻去升级
    Betterr
        60
    Betterr  
       15 天前
    我用过的大部分 vps 的磁盘性能都堪忧,有的时候 swap 可以拉崩磁盘导致系统无响应...我后来都是只开 zram ,完全不敢在垃圾盘的 vps 上开 swap 了。
    Betterr
        61
    Betterr  
       15 天前
    @Lanzhijiang 才发现没有 at 上,重新 at 一下。
    heimoshuiyu
        62
    heimoshuiyu  
       15 天前
    应该吐嘈 javascript 框架
    coolfan
        63
    coolfan  
       14 天前
    开个竞价实例打包,配置看着随便选高配的,带宽按量计费拉满,打包完事就销毁几毛钱
    Lanzhijiang
        64
    Lanzhijiang  
       6 天前 via Android
    @Betterr 😂天哪,这么遭吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   979 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 19:36 · PVG 03:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.