node.js process.memoryUsage()의 반환 값은 무엇을 의미합니까?
공식 문서(출처)에서:
process.memory사용법()
바이트 단위로 측정된 노드 프로세스의 메모리 사용량을 설명하는 개체를 반환합니다.
var util = require('util'); console.log(util.inspect(process.memoryUsage()));이렇게 하면 다음이 생성됩니다.
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }hapTotal 및 heapUsed는 V8의 메모리 사용량을 나타냅니다.
rss, heapTotal 및 heapUsed가 정확히 무엇을 의미합니까?
사소한 질문처럼 보일 수도 있지만 찾아보니 지금까지 명확한 답을 찾을 수 없었습니다.
이 질문에 답하기 위해서는 먼저 V8의 메모리 방식을 이해해야 합니다.
실행 중인 프로그램은 항상 메모리에 할당된 일부 공간을 통해 표현됩니다.이 공간은 레지던트 세트(Resident Set)라고 불립니다.V8은 Java Virtual Machine과 유사한 방식을 사용하며 메모리를 세그먼트로 나눕니다.
- Code : 실행중인 실제 코드
- 스택: 힙의 객체를 참조하는 포인터와 프로그램의 제어 흐름을 정의하는 포인터가 있는 모든 값 유형(정수 또는 부울과 같은 프리미티브)을 포함합니다.
- 힙: 객체, 문자열 및 닫힘과 같은 참조 유형을 저장하는 전용 메모리 세그먼트입니다.
이제 질문에 쉽게 답할 수 있습니다.
- rss: 레지던트 세트 크기
- 힙합계:힙의 총 크기
- 사용된 힙:힙 실제로 사용됨
참조: http://apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/
RSS는 RAM에 저장된 프로세스의 메모리 부분인 상주 세트 크기입니다(스왑 공간이나 파일 시스템에 저장된 부분과는 반대).
힙은 새로 할당된 개체가 발생할 메모리의 부분입니다(생각해보십시오).malloc C, 에서의new(자바스크립트).
힙에 대한 자세한 내용은 위키피디아에서 확인할 수 있습니다.
Node.js 문서에서는 다음과 같이 설명합니다.
hapTotal 및 heapUsed는 V8의 메모리 사용량을 나타냅니다.external은 V8에서 관리하는 자바스크립트 객체에 바인딩된 C++ 객체의 메모리 사용량을 의미합니다. rss, Resident Set Size는 힙, 코드 세그먼트 및 스택을 포함하는 프로세스의 메인 메모리 장치(할당된 메모리의 총 부분 집합)에서 차지하는 공간의 양입니다.
언급된 모든 값은 바이트 단위로 표시됩니다.따라서 인쇄만 원하는 경우에는 MB로 다시 확장하는 것이 좋습니다.
const used = process.memoryUsage();
for (let key in used) {
console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
그러면 다음과 같은 출력이 나옵니다.
Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB
예제를 사용하여 이 작업을 수행합니다.
다음 예는 메모리 사용량의 증가가 실제로 어떻게 증가하는지 보여줄 것입니다.rss그리고.heapTotal
const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
m.set(i, i);
if (i % 10000 === 0) {
const { rss, heapTotal } = process.memoryUsage();
console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
}
}
위의 내용을 실행하면 다음과 같은 효과를 얻을 수 있습니다.
rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
변수를 사용하여 필요한 공간을 지속적으로 증가시켜 hipTotal을 증가시키고 그에 따라 Resident Set Size()를 증가시키는 방법을 명확하게 보여줍니다.rss)
RSS
RSS는 "Node.js 인터프리터 프로세스의 총 메모리 사용량"에 대한 합리적인 측정입니다.사용 가능한 RAM 이상이면 프로그램을 실행할 수 있습니다.그러나 일부 유형의 메모리는 제외되므로 단일 프로세스만 실행하는 서버의 실제 메모리 사용량은 더 높을 수 있습니다(VSZ가 최악의 경우임).
RSS의 개념은 리눅스 커널 자체에 정의되어 있으며 리눅스 메모리 관리에서 RSS 및 VSZ란 무엇이며 프로세스의 총 메모리 사용량을 측정합니다.따라서 이 값은 다음과 같은 외부 프로그램으로 측정할 수 있습니다.psNode.js internals에 대한 지식 없이, 예를 들어: Linux에서 단일 프로세스의 CPU 사용량과 메모리 사용량을 검색하시겠습니까?
heapTotal그리고.heapUsed
이러한 개념은 Node.js 구현 내부의 개념입니다.v8 소스 코드를 보다 정확하게 이해하는 것이 좋을 것입니다. 특히 프로세스의 현재 힙 크기를 얻기 위해 API 호출과 같은 기능으로 glibc에서 이러한 값을 얻는지 궁금합니다.그 위에 자체적인 힙 관리가 되어 있는 경우.
일반적으로 힙의 개념에 대해서는 다음을 참조하십시오.스택과 힙은 어디에 무엇이 있으며 x86 어셈블리의 레지스터에 사용되는 푸시/팝 명령어의 기능은 무엇입니까?이 힙은 자바스크립트 프로그램에서 메모리의 대부분을 차지할 가능성이 압도적으로 높습니다. 다른 곳에서 메모리를 찾으려고 시도할 필요가 없을 것이라고 생각합니다. (아마도 아래에 별도로 표시되는 형식 배열을 제외하고)process.memoryUsage()).
런너블 테스트
다음 코드 예제는 내가 분석하려고 시도한 간단한 테스트를 수행하는 데 사용될 수 있습니다. https://cirosantilli.com/javascript-memory-usage-benchmark 그러나 C++와 같은 가비지 컬렉션이 없는 언어와는 달리, 특히 개체 수가 적을 때 메모리 사용량이 때때로 그렇게 부풀려지는 이유를 예측하는 것은 매우 어렵습니다.하지만 다른 쓰레기 수집 언어들이 더 잘 할 수 있을지는 잘 모르겠습니다.
다음을 사용하여 프로그램을 실행해야 합니다.
node --expose-gc main.js
main.js
#!/usr/bin/env node
// CLI arguments.
let arr = false
let array_buffer = false
let dealloc = false
let klass = false
let obj = false
let n = 1000000
let objn = 0
for (let i = 2; i < process.argv.length; i++) {
switch (process.argv[i]) {
case 'arr':
arr = true
break
case 'array-buffer':
array_buffer = true
break
case 'class':
klass = true
break
case 'dealloc':
dealloc = true
break
case 'obj':
obj = true
break
case 'n':
i++
n = parseInt(process.argv[i], 10)
break
case 'objn':
i++
objn = parseInt(process.argv[i], 10)
break
default:
console.error(`unknown option: ${process.argv[i]}`);
break
}
}
class MyClass {
constructor(a, b) {
this.a = a
this.b = b
}
}
let a
if (array_buffer) {
a = new Int32Array(new ArrayBuffer(n * 4))
for (let i = 0; i < n; i++) {
a[i] = i
}
} else if (obj) {
a = []
for (let i = 0; i < n; i++) {
a.push({ a: i, b: -i })
}
} else if (objn) {
a = []
for (let i = 0; i < n; i++) {
const obj = {}
for (let j = 0; j < objn; j++) {
obj[String.fromCharCode(65 + j)] = i
}
a.push(obj)
}
} else if (klass) {
a = []
for (let i = 0; i < n; i++) {
a.push({ a: i, b: -i })
}
} else if (klass) {
a = []
for (let i = 0; i < n; i++) {
a.push(new MyClass(i, -i))
}
} else if (arr) {
a = []
for (let i = 0; i < n; i++) {
a.push([i, -i])
}
} else {
a = []
for (let i = 0; i < n; i++) {
a.push(i)
}
}
if (dealloc) {
a = undefined
}
let j
while (true) {
if (!dealloc) {
j = 0
// The collector somehow removes a if we don't reference it here.
for (let i = 0; i < n; i++) {
if (obj || klass) {
j += a[i].a + a[i].b
} else if (objn) {
const obj = a[i]
for (let k = 0; k < objn; k++) {
j += obj[String.fromCharCode(65 + k)]
}
} else if (arr) {
j += a[i][0] + a[i][1]
} else {
j += a[i]
}
}
console.error(j)
}
global.gc()
console.error(process.memoryUsage())
}
Node 16 Ubuntu 21.10에서 배우는 몇 가지 사항:
- 와 함께
node --expose-gc bench_mem.js n 1최소 RSS는 30 MiB이며 최소 RSS는heapUsed3.7 MB. 동일한 시스템에서 Chello 월드의 RSS는 비교를 위해 770 kB입니다.
언급URL : https://stackoverflow.com/questions/12023359/what-do-the-return-values-of-node-js-process-memoryusage-stand-for
'programing' 카테고리의 다른 글
| 사용자 정의 유형에 대한 정보를 얻는 방법은 무엇입니까? (0) | 2023.10.21 |
|---|---|
| MySQL pid가 종료됨(mysql을 시작할 수 없음) (0) | 2023.10.21 |
| where-clause - 성능에서 계산된 열 (0) | 2023.10.21 |
| PowerShell에 임시 디렉토리를 생성하시겠습니까? (0) | 2023.10.21 |
| CSS – 백분율 높이가 작동하지 않는 이유는 무엇입니까? (0) | 2023.10.21 |