由node的批量requests引發的"heap out of memory"解決方案

背景
使用nodejs的request向python的flask rest api放送大量的請求致使的"heap out of memory"。node

messages.forEach((message)=>{
    request({
      url: url,
      method: 'POST',
      json: true,
      body: JSON.stringify(message),
    }).on('end', ()=>{
      server.logger.info('End');
    }).on('error', (err) => {
      server.logger.error(`Error:${err.toString()}`);
    });
  });

分析緣由python

  1. node內存不足
  2. message object 沒有儘早釋放
  3. request沒有結束,body裏面的內容沒有及時釋放

解決辦法json

  1. 嘗試 node --max_old_space_size=4096 main.js 增長內存。
    通過測試,發現的程序的確能夠多佔用一些內存,跑的久一點,可是最後仍是崩了。
  2. 嘗試 把JSON.stringify(message)提出來,用temp存放,而後把message設置爲null, 但願gc能提早回收message。
    通過測試,發現效果不明顯,程序依然崩潰。
  3. 設置request的timeout到1秒。
    通過測試,內存能回收了,程序運行了,可是python沒有收到消息。
  4. 重構python的flask restful api, 使用tornado和flask混用方式,讓python先返回結果,而後再執行task。
    通過測試, 程序內存維持穩定, 完美運行。

思考
若是內存不是持續的增加,而是某時刻一下須要比較大的內存,能夠嘗試使用上述解決辦法#1;
若是是內存在持續增加,須要分析什麼引發的,是由於沒有及時釋放內存仍是由於內存泄露,好比閉包,定時器等。而後對症下藥。
再想一想#3還可能遇到的問題,首先是網絡很差的狀況,python返回慢了的依然會有問題。如果要解決其實應該用stream把messages總體一塊兒傳給python。可是由於如今我正處於封閉開發的階段,沒有時間去重構。flask

相關文章
相關標籤/搜索