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

5 天前
 ttkit

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

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

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

4896 次点击
所在节点    程序员
63 条回复
sagaxu
5 天前
node 下输入 v8.getHeapStatistics() 看看输出是什么,监控里显示内存只用了 50%,不大可能是 ECS 的问题
ttkit
5 天前
@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
5 天前
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
5 天前
@sagaxu 好兄弟可以了,我之前写了一个 sh 脚本:
log "正在构建项目..."
rm -rf .next/
NODE_OPTIONS="--max-old-space-size=4096" npm run build || handle_error "构建失败"

没加 export 导致的。
这个做备选方案吧,还是 github actions 的自动化部署方案优秀,可以省不少钱。
Nitromethane
5 天前
这和阿里云有屁关系,换到 aws 照样同样的错误
goodryb
5 天前
打包这种重复性工作可以考虑用抢占实例,价格便宜,配置可以开高一些
msg7086
5 天前
免费打包服务好用那是因为有大佬帮你付了费了,要是换你自己掏钱支付这些 runner 的费用你就知道肉疼了。Github 的收费打包机 2c7g (免费打包机的一半规格)收费价格是每分钟$0.008 ,相当于一天$11.52 ,一个月 300 多美刀。你再和 ECS 的价格比比?
aru
5 天前
Github Actions 提供的虚拟机配置比较高:Linux 4 核 16 GB 内存 14 GB ssd
性能全面打爆你用的这个 ecs 吧,特别 cpu 配额和 ssd 的 iops
ttkit
5 天前
@msg7086 原来如此。
darkengine
5 天前
今天刚试了 build 一个 express 项目爆了 heap ,不过我用的是 AWS 的 t2.micro 1C1GB 的丐版配置 😂
xmumiffy
5 天前
@goodryb 抢占的性能突发实例性价比还要更好,开机积分就够打包完成了.
wnpllrzodiac
5 天前
前端代码都干了啥,塞了一个操作系统?
Dragonphy
5 天前
Next.js 项目是这样的,我都不知道塞了什么,上次跑一个 GitHub 上拉下来的服务,我还特地更新了本地 CI 服务器配置。
ttkit
5 天前
@darkengine 哈哈,node 项目就这样,npm 包依赖太多
ttkit
5 天前
@wnpllrzodiac 打包的时候要分析几千个模块,nextjs 又要区分哪些页面需要服务端渲染哪些需要 spa 打包,所以页面多了会变慢。我现在用的是 nextjs 是 14 版本,Next.js 15 会好些,默认的打包工具从 Webpack 升级为 Turbopack 。
ttkit
5 天前
@Dragonphy 准备有时间升级 15 版本了,看官方说 15 版本默认使用 Turbopack 了,Turbopack 的速度比 Webpack 快 700 倍,比 Vite 快 10 倍。这使得项目的构建速度大幅提升,开发者可以更高效地进行开发。
darkengine
5 天前
@wnpllrzodiac 有一张很出名的梗图,node_modules 的。。。
BG7ZAG
5 天前
借助云效进行打包~
cyningxu
4 天前
上 swap ,云服务器默认都不开 swap 的,只要内存满了就会挂
shintendo
4 天前
@ttkit 比 Vite 快 10 倍笑笑就好

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

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

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

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

© 2021 V2EX