Node.js &引用;“JavaScript内存不足”;以「;“集群”;(多进程)环境
我正在开发一个服务器功能,该功能从数据源获取大量数据,由于获取数据的大小,我的堆内存似乎溢出 我试图在我的子进程上增加Node.js &引用;“JavaScript内存不足”;以「;“集群”;(多进程)环境,node.js,child-process,Node.js,Child Process,我正在开发一个服务器功能,该功能从数据源获取大量数据,由于获取数据的大小,我的堆内存似乎溢出 我试图在我的子进程上增加max old space size,但看起来 子进程只分配默认的空间大小,而不是给定的选项大小 这就是我如何设置的 const{THREADS,NODE_ENV}=process.ENV; cluster.schedulingPolicy=cluster.SCHED_RR; if(cluster.isMaster){ constforks=(NODE|ENV===“develo
max old space size
,但看起来
子进程只分配默认的空间大小,而不是给定的选项大小
这就是我如何设置的
const{THREADS,NODE_ENV}=process.ENV;
cluster.schedulingPolicy=cluster.SCHED_RR;
if(cluster.isMaster){
constforks=(NODE|ENV===“development”)?1:Math.min(os.cpus().length,Math.max(THREADS | 4));
for(设i=0;i{
控制台日志(m);
});
worker.on(“退出”),(信号,=>{
log(`Server node dead:${signal}`);
cluster.fork(“./server/app.js”{
execArgv:['--max old space size=4096'],
env:Object.assign({“NODE_OPTIONS”:--max old space size=4096“})
});
})
}
console.log(“服务器已启动…”)
}
if(cluster.isWorker){
log(“工作节点有::”;
console.log(process.memoryUsage())
log(`每个节点的内存使用率:${Math.floor(process.memoryUsage().rss/10000000)/10}GB`);
log(v8.getHeapStatistics());
const server=新服务器({
schema:makeExecutableSchema({typeDefs,resolvers}),
数据源:()=>({
…//我的数据源
}),
上下文:({req,res})=>{
if(!req.body.query.includes(“内省查询”)){
log(`${req.method}${req.url}${req.body.query}`);
}
返回{…请求}
}
});
server.listen().then({url})=>{
//无所事事
});
}
这是从控制台得到的
Server started..
Worker node has ::
{ rss: 129269760,
heapTotal: 100978688,
heapUsed: 67195888,
external: 511759 }
Memory usage per node :: 1.2 GB
{ total_heap_size: 100978688,
total_heap_size_executable: 3145728,
total_physical_size: 98869008,
total_available_size: 1439367280,
used_heap_size: 67240920,
heap_size_limit: 1526909922,
malloced_memory: 16384,
peak_malloced_memory: 3562032,
does_zap_garbage: 0 }
这是我发送请求时得到的
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
[7501:0x102808000] 35581 ms: Mark-sweep 1395.8 (1424.9) -> 1395.4 (1424.4) MB, 934.0 / 0.0 ms (average mu = 0.095, current mu = 0.018) allocation failure scavenge might not succeed
1: 0x10003cf99 node::Abort() [...]
[7501:0x102808000] 36519 ms: Mark-sweep 1396.2 (1424.4) -> 1395.8 (1424.4) MB, 936.2 / 0.0 ms (average mu = 0.051, current mu = 0.003) allocation failure scavenge might not succeed
2: 0x10003d1a3 node::OnFatalError(char const*, char const*) [~/.nvm/versions/node/v10.16.0/bin/node]
3: 0x1001b7835 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [~/.nvm/versions/node/v10.16.0/bin/node]
<--- JS stacktrace --->
4: 0x100585682 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [~/.nvm/versions/node/v10.16.0/bin/node]
==== JS stack trace =========================================
5: 0x100588155 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [~/.nvm/versions/node/v10.16.0/bin/node]
0: ExitFrame [pc: 0x22a4085dbe3d]
Security context: 0x122e5461e6e9 <JSObject>
6: 0x100583fff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [~/.nvm/versions/node/v10.16.0/bin/node]
...
致命错误:堆限制附近的无效标记压缩分配失败-JavaScript堆内存不足
[7501:0x102808000]35581毫秒:标记扫描1395.8(1424.9)->1395.4(1424.4)MB,934.0/0.0毫秒(平均mu=0.095,当前mu=0.018)分配失败清除可能无法成功
1:0x10003cf99节点::中止()[…]
[7501:0x102808000]36519毫秒:标记扫描1396.2(1424.4)->1395.8(1424.4)MB,936.2/0.0毫秒(平均mu=0.051,当前mu=0.003)分配失败清除可能无法成功
2:0x10003d1a3节点::OnFatalError(字符常量*,字符常量*)[~/.nvm/versions/node/v10.16.0/bin/node]
3:0x1001b7835 v8::internal::v8::FatalProcessOutOfMemory(v8::internal::Isolate*,char const*,bool)[~/.nvm/versions/node/v10.16.0/bin/node]
4:0x100585682 v8::internal::Heap::FatalProcessOutOfMemory(char const*)[~/.nvm/versions/node/v10.16.0/bin/node]
==JS堆栈跟踪=========================================
5:0x100588155 v8::internal::Heap::CheckIneffectiveMarkCompact(无符号长,双精度)[~/.nvm/versions/node/v10.16.0/bin/node]
0:ExitFrame[pc:0x22a4085dbe3d]
安全上下文:0x122e5461e6e9
6:0x100583FFFv8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector,v8::GCCallbackFlags)[~/.nvm/versions/node/v10.16.0/bin/node]
...
官方文件说你做得很好。考虑打开一个关于No.js Github的问题。您是否尝试使用--max old space size=4096
启动mai进程?我就是这样运行的nodemon--exec babel node--max old space size=4096 server/app.js
奇怪的是,在我的主进程中,process.checkUsage()
说它只有1.5GB,但如果我在我的主进程中替换tinymax old space size=40
,它很快就会随着OOM消失。没有nodemon?官方文档说你做得很好。考虑打开一个关于No.js Github的问题。您是否尝试使用--max old space size=4096
启动mai进程?我就是这样运行的nodemon--exec babel node--max old space size=4096 server/app.js
奇怪的是,在我的主进程中,process.checkUsage()
说它只有1.5GB,但如果我在主进程中替换tinymax old space size=40
,它很快就会随着OOM而消失,而没有nodemon?