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

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

  •  
  •   ttkit · 2 天前 · 4483 次点击

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

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

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

    ecs.png github.png ecs1.png

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

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

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

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

    export NODE_OPTIONS=--max_old_space_size=4096
    ttkit
        18
    ttkit  
    OP
       2 天前
    @salmon5 bro, 我自己的定位不是前端,可以把我当成全栈(全干)!虽然从前端入行的。
    ttkit
        19
    ttkit  
    OP
       2 天前
    @laminux29 good, bro.
    ttkit
        20
    ttkit  
    OP
       2 天前
    @sagaxu 用了这个配置不行,感觉还是 ecs 服务器太拉垮,准备降低服务器配置了,多花 1000 多块钱很不开心。把这 1000 多去升级宽带更划算。
    sagaxu
        21
    sagaxu  
       2 天前
    node 下输入 v8.getHeapStatistics() 看看输出是什么,监控里显示内存只用了 50%,不大可能是 ECS 的问题
    ttkit
        22
    ttkit  
    OP
       2 天前
    @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  
       2 天前
    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
       2 天前
    @sagaxu 好兄弟可以了,我之前写了一个 sh 脚本:
    log "正在构建项目..."
    rm -rf .next/
    NODE_OPTIONS="--max-old-space-size=4096" npm run build || handle_error "构建失败"

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