akDmuy
87
2020-03-23 00:41:39
6
291

nodejs 메모리누수문제


안녕하세요 nodejs로 구현된 push서버를 관리하고있습니다. 로직자체는 복잡하지않습니다. 아래의 스크린샷처럼 정말간단합니다. db에서 row를 읽어와서 row수만큼 loop를 돌면서 유저들에게 push메시지를 보내줍니다.


문제는 유저가 많을때 메모리 누수가 발생합니다... 몇백명대까지는 문제가 없다가 만단위로 넘어가면 메모리 누수가 발생합니다. 구체적으로 말하면 push메시지를 보낼때(스크린샷에서 send 메소드호출)메모리사용량이 증가하다가 push 작업이 다끝나도 메모리가 이전상태로 돌아오지 않습니다.

사실 이 문제에 대해서 해결방법은 찾았습니다. loop를 돌면서 push를 보내는게 아니라 

setInterval(()=>{  fcm.send(data,(err,response)=>{})},1000) 로 일정시간마다 send메소드를 호출하니까 메모리누수문제가 해결되더군요.

근데 궁금한점은 왜 해결됬는지가 더 궁금합니다.....이거와 관련해서 아시는분 계실까요?아니면 참고할수있는 자료가 있을까요??




0
0
  • 답변 6

  • 아범테크
    565
    2020-03-23 09:03:55 작성 2020-03-23 09:05:45 수정됨

    fcm.data 를 인터벌 없이 빨리 부르면 푸시하려는 서버가 응답을 안해서 머물러 있는게 아닐까요?

    전 우선 푸시받는 서버도 의심해볼거 같네요.

    0
  • nolu
    269
    2020-03-23 09:37:06

    만명일 경우에 만번의 루프가 한번에 실행되어서 그런 것 같습니다.

    순차적으로 보내거나 한번에 실행될 수 있는 수를 조절하면 되지 않을까 싶습니다.

    0
  • akDmuy
    87
    2020-03-23 09:42:04

    @아범테크

    서버응답은 로그로확인해봤는데 전부잘받았습니다.ㅜㅜ


    0
  • akDmuy
    87
    2020-03-23 09:45:54

    @nolu

    제가 궁금한게 정확히 그 부분입니다.ㅋㅋㅜㅜ

    루프를 한번에 실행이랑 나눠서 실행하는게 nodejs에서 메모리 누수랑 어떤관계있는지 모르겠네요ㅜㅜ

    한번에 루프를 실행하는게 실행당시에는 메모리가 증가할수 있어도, push작업이 다 끝나고 왜 회수가 안되는지....참 어럽네요ㅠㅠ

    0
  • Eggplantiny
    274
    2020-03-23 10:17:55

    보통은 이런 메시징 프로세스를 개발할땐 Master와 Slave 형식으로 구현하면 관리하기 좋습니다.


    Master에서 어떤 유저들에게 보낼지 결정을하고 그 목록을 Slave에게 전달해주면 


    Slave가 직접 FCM 을 콜해서 메시지를 보내주는 방식으로 구현해보심이 어떤가요?

    0
  • programmerEgg
    923
    2020-03-23 12:09:41

    Eggplantiny님 말씀대로 나누는게 좋습니다.

    추가로 fcm.send가 promise를 반환하는지 확인해보세용

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.