Node.js의 사용 메모리를 관찰하는 방법

소개



메모리 사이즈의 취득 방법을 열거하는 것만으로, 메모리 사이즈의 해석에 관한 상세에는 들어가지 않습니다.

물품 쓰기


  • Google 크롬의 DevTools로 디버깅
  • process.memoryUsage()

  • 참고


  • Guide: How To Inspect The Memory Usage in Node.Js
  • Node.js 애플리케이션을 Google 크롬의 DevTools로 디버깅 - CLOVER
  • 5 Commands to Check Memory Usage on Linux | Linux.com | The source for Linux information

  • 본문



    개별 개체의 사용 크기 보기



    특정 오브젝트가 메모리를 크게 사용한다고 상정하고 있을 때, 실제로 어느 정도 사용하고 있는지 확인하고 싶은 것이 있습니다. 다음과 같은 용도입니다.
  • 실제 사용량을 기준으로 부하가 n배가 되었을 때의 이용 메모리량 예상
  • 메모리 사용량 튜닝 효과 측정

  • 예를 들어, itemMap라는 개체에 대량의 값을 등록하는 Map 인스턴스가 있다고 가정합니다. HEAP SNAPSHOT를 가져와서 Map 인스턴스에서 큰 인스턴스를 찾으면 해당 Map 인스턴스를 찾을 수 있습니다.


  • Shallow Size: 인스턴스 단위의 크기. Map이나 배열이라면 인스턴스 단체의 크기보다 내용의 크기를 알고 싶습니다. 이 값에는별로 관심이 없습니다
  • Retained Size: 꽉, Map 및 배열의 ​​내용 크기의 합계
  • Retained Size를 계산하는 것이 매우 편리합니다.

    HEAP SNAPSHOT을 얻고 Map 인스턴스에서 큰 인스턴스를 찾는 YouTube 동영상을 준비했습니다. DevTools의 사용법을 모르는 분은 부디.

    Google Chrome의 DevTools에서 Debug를 시작하는 방법은 Node.js 애플리케이션을 Google Chrome의 DevTools로 디버깅 - CLOVER을 참조하십시오.

    전체 메모리 사용량 추세 보기



    메모리 누수의 유무를 알고 싶을 때 알고 싶은 정보입니다.

    process.memoryUsage()



    Node.js 표준 API process.memoryUsage()를 사용합니다.
    특히 추가 리소스가 필요하지 않으므로 소스를 변경할 수 있다면 가장 쉽습니다.

    이 API를 사용하여 디버그 인쇄합니다.
    예를 들어, 다음 소스 코드를 추가하면 5분 간격으로 메모리 사용량을 표준 출력으로 출력합니다.
    // 定期的にメモリ使用量を吐き出す
    setInterval(() => {
      const used = process.memoryUsage()
      const messages = []
      for (let key in used) {
        messages.push(`${key}: ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`)
      }
      console.log(new Date(), messages.join(', '))
    }, 5 * 60 * 1000)
    

    로그의 예입니다.
    2018-05-13T11:39:46.293Z 'rss: 315.79 MB, heapTotal: 253.01 MB, heapUsed: 239.41 MB, external: 0.22 MB'
    2018-05-13T11:44:46.308Z 'rss: 355.88 MB, heapTotal: 267.43 MB, heapUsed: 254.4 MB, external: 0.31 MB'
    2018-05-13T11:49:46.323Z 'rss: 324.54 MB, heapTotal: 256.04 MB, heapUsed: 242.81 MB, external: 0.23 MB'
    2018-05-13T11:54:46.338Z 'rss: 359.49 MB, heapTotal: 271.09 MB, heapUsed: 257.61 MB, external: 0.36 MB'
    2018-05-13T11:59:46.353Z 'rss: 346.75 MB, heapTotal: 262.74 MB, heapUsed: 248.15 MB, external: 0.28 MB'
    2018-05-13T12:04:46.368Z 'rss: 316.83 MB, heapTotal: 252.87 MB, heapUsed: 239.29 MB, external: 0.2 MB'
    
  • rss: 전체 프로세스가 사용하는 메모리 사용량. top 명령 등으로 출력시키는 값
  • heapTotal : 프로그램에서 만든 객체가 사용하는 총 메모리 양

  • memwatch-next


    process.memoryUsage() 에서는 그 순간의 「사용하고 있는 오브젝트의 총 메모리량」은 취할 수 없습니다. process.memoryUsage() 는 요청한 순간의 메모리 사용량을 얻지만 그 순간이 Garbage Collection 실행 직후인지는 모릅니다. 즉, process.memoryUsage() 의 출력하는 값에는, 이미 사용하고 있지 않지만 해방되어 있지 않은 Garbage 오브젝트가 포함되어 있을 가능성이 있습니다.

    이 문제를 해결하기 위한 npm 패키지는 memwatch-next입니다. Node.js의 C 확장을 사용하여 Garbage Collection이 실행될 때 이벤트를 전달합니다. 이 이벤트를 사용하면, 정확한 「사용하고 있는 오브젝트의 총 메모리량」을 취득할 수 있습니다. 이것을 계속해서 취득해, 증가 경향이 있으면 메모리 누수의 유무를 검지할 수 있습니다.

    설명을 읽은 것만으로는 실제로 사용하지 않습니다.

    기타 참고


  • 메모리 용어  |  Tools for Web Developers  |  Google Developers
  • node.js에서 메모리 사용량을 얻는 방법 이것 - Qiita
  • Node.js를 개발할 때 필요한 정보 - Qiita
  • Node.js 응용 프로그램 디버깅은 Visual Studio Code로 쉽게 할 수 있습니다 - Qiita
  • 좋은 웹페이지 즐겨찾기