终于找到写的 NodeJS 微服务都支持不到 1 天的原因了

2017-10-08 07:47:37 +08:00
 doubleflower

前情: https://www.v2ex.com/t/392238

从 Python 转过来写了几个 Node 微服务全它妈的跑一天就 Out of memory,之前暂时用了高内存就主动自杀的补丁顶着。

然后这二天查了相关文章,发现 Node 的 gc 和 Python 是完全不同的,Python 的 gc 相当主动(可能和引用计数有关),一有无用内存当场就回收了,而 Node 不会(类似于 Java )。 默认 64 位机器 Node gc 认为你有 1.4G 内存,到这个点之前 gc 干活相当偷懒,可是我都是跑在 1G 小鸡上的,所以就 BOOM 了。

所以你是在内存小于 1G 的机器上跑比较忙的需长时间运行的程序,需要在 Node 命令行上加上 --max_old_space_size=384 --optimize_for_size 这二参数,我跑了几天内存都没过 400M,而以前没多长时间就超 700M 引起 OOM。

14221 次点击
所在节点    Node.js
38 条回复
iwj
2017-10-08 08:06:15 +08:00
有意思,我跟楼主情况差不多,也刚写 Node,估计也会遇到这个问题:)
opengps
2017-10-08 08:07:56 +08:00
新手处理不到这么深的 bug...
kangkang
2017-10-08 08:32:37 +08:00
点赞
janxin
2017-10-08 08:37:02 +08:00
确实没机会跑在 1G 的小鸡上...
zjqzxc
2017-10-08 09:30:41 +08:00
感谢楼主。。我好像明白为啥之前写的 nodejs 版的 ddns 服务器跑再 vps 上几天就挂了,而 python 版一直很坚挺。。
timothyye
2017-10-08 09:46:10 +08:00
blanu
2017-10-08 10:33:25 +08:00
阅读一下《深入浅出 node.js 》很快就能找到答案了。。。。
lilydjwg
2017-10-08 12:05:19 +08:00
CPython 使用引用计数,没有循环引用的话会立即回收的。JavaScript、Java (以及 Go )都是经常性地找有没有垃圾,所以会不及时。Python 文档中也有提及,不要依赖对象立即被销毁,因为在其它实现里不一定如此。

不过我也是第一次听说有人使用 NodeJS 遇到 gc 的问题。绝大部分遇到 gc 问题的都是 Go 用户,绝大部分调 gc 参数的都是 Java 用户呀。
janxin
2017-10-08 12:09:22 +08:00
@lilydjwg 其实很多 Go 用户现在也遇不到 GC 问题啊...
lilydjwg
2017-10-08 12:14:20 +08:00
@janxin #9 名气大的除了 Google 和 Cloudflare 我都听说在折腾 gc 了,有的已经放弃 Go 了,有的还在挣扎。
lilydjwg
2017-10-08 12:15:19 +08:00
@janxin #9 而且我说的是遇到 gc 问题的用户里 Go 用户多。原命题成立逆命题不一定成立嘛。
gongzili456
2017-10-08 13:19:58 +08:00
善用内存.......
janxin
2017-10-08 13:28:50 +08:00
@lilydjwg 没错没错
jun4rui
2017-10-08 15:03:18 +08:00
用 PM2 啊,然后选择一个时间间隔自动 load 一下(相当于重启但服务不会停),这样能保证不出问题。然后你就有时间慢慢查了
coderfox
2017-10-08 15:34:40 +08:00
我在 700M 机器上用 docker 跑 node,64 位,没感觉到 gc 的问题哇。
是不是不同版本的表现不同?
kimown
2017-10-08 15:40:49 +08:00
楼主有没有想过是写的程序有问题 ?
workwonder
2017-10-08 15:49:01 +08:00
@lilydjwg 根据普遍的反映,Python 在内存方面并不省心。 据说 Python 程序一旦在某个时刻占用了很高的内存,后面就下不来了。而我的多次实践也未能幸免于此,我的 Django 应用不得不启用 max-requests + max-memory 来不断采用新的 worker 来轮回,另一个 flask 应用里面的 celery workers 也不得不根据消费的任务数量来自杀轮回。关于此大神能否谈谈看法?
可以试试关键词 python memory leak not release 看看相关材料。
lilydjwg
2017-10-08 15:50:52 +08:00
@workwonder #17 是的,请小心使用旧版本。
wsy2220
2017-10-08 15:51:23 +08:00
感觉程序有问题的可能性比较大
workwonder
2017-10-08 16:00:33 +08:00
@lilydjwg 有没有关于此方面讲的比较透测的资料。
关于版本,我用 python 3.5 感觉泄露问题还很严重啊。

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

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

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

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

© 2021 V2EX