NodeJ应用程序频繁停机

ars1skjm  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(122)

我在16 GB的机器上有一个node js应用程序,托管在PM2上。node版本是16.20,npm版本是9.8。我在ecosystem.config.js和高级系统设置中都设置了--max-old-space-size=13000。我仍然看到频繁的应用程序停机。我需要帮助解决这个问题,因为客户正在使用该应用程序,他们正在将其升级到更高的管理层。下面是我捕获的堆日志和应用程序关闭时记录的错误。

堆日志:“RSS:417026048堆总数:355098624使用的堆:294669464”
错误日志

> <--- Last few GCs --->
> 
> [3428:0000015046ABE0B0]     6312 ms: Scavenge 67.3 (88.6) -> 60.3
> (90.7) MB, 23.2 / 0.2 ms  (average mu = 0.978, current mu = 0.978)
> allocation failure  [3428:0000015046ABE0B0]     6705 ms: Scavenge 72.1
> (91.3) -> 63.7 (96.3) MB, 29.5 / 0.0 ms  (average mu = 0.978, current
> mu = 0.978) allocation failure  [3428:0000015046ABE0B0]     6962 ms:
> Scavenge 76.7 (96.7) -> 65.1 (97.8) MB, 20.8 / 0.0 ms  (average mu =
> 0.978, current mu = 0.978) allocation failure 
> 
> 
> <--- JS stacktrace --->
> 
> FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap
> out of memory  1: 00007FF6FB4B15AF   2: 00007FF6FB3CC5EF   3:
> 00007FF6FC0AEF82   4: 00007FF6FBD5D5DE   5: 00007FF6FB8F7DC7   6:
> 00007FF6FC1DB734   7: 00007FF6FC1DDD4B   8: 00007FF6FC1DDA81   9:
> 00007FF6FC1DC3EB  10: 00007FF6FC1DC131  11: 00007FF6FC184E17  12:
> 00007FF6FC163BFC  13: 00007FF6FC184960  14: 00007FF6FC1850C6  15:
> 00007FF6FC184EB2  16: 00007FF6FC165C7D  17: 00007FF6FC156374  18:
> 00007FF6FC1626B7  19: 00007FF6FC15DFB1  20: 00007FF6FBCF4FE1  21:
> 00007FF6FBCC6149  22: 00007FF6FBCC6C1A  23: 00007FF6FB3CEF7D  24:
> 00007FF6FB4FF30D  25: 00007FF6FC319250  26: 00007FF91A5D7AC4  27:
> 00007FF91CB8A351 RtlUserThreadStart+33
> 
> 
> #
> # Fatal error in , line 0
> # Fatal process out of memory: Zone
> #
> #
> #
> #FailureMessage Object: 00000037EEBFA0D0

字符串

5hcedyr0

5hcedyr01#

显然,应用程序试图使用比分配给它的内存更多的内存。
我会这么做
1.寻找可以消耗更多内存的地方。例如:大型文件处理(图像、视频、电子表格等)
1.查找循环中的内存分配(例如:在循环中阅读文件的内容并将其存储在数组中)
1.查看网络连接是否被正确丢弃&确保在它们之后没有引用
1.查找更新局部-全局值的位置。例如:在每个传入请求中更新全局或文件全局数组
1.如果发现#4和#5的出现,则很容易修复。
1.对于#1和#2,我会找出一种流线型的方法来处理大文件,比如创建队列并将处理任务卸载到另一个进程等。
1.如果内存使用仅仅是由于处理而导致的,并且没有检测到内存泄漏(是的,前4个点表示内存泄漏),我会收集内存使用的峰值并将其设置为node.js进程(Node.js中有一个参数可以将可用内存更改为Node.js进程)。

相关问题