diff --git a/package-lock.json b/package-lock.json index 8e40aa2..37c46d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "dotenv": "^16.4.5", "express": "^4.21.0", "express-rate-limit": "^7.4.0", + "heapdump": "^0.3.15", "highcharts": "^11.1.0", "highcharts-react-official": "^3.2.1", "http-proxy-middleware": "^2.0.6", @@ -12522,6 +12523,18 @@ "he": "bin/he" } }, + "node_modules/heapdump": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/heapdump/-/heapdump-0.3.15.tgz", + "integrity": "sha512-n8aSFscI9r3gfhOcAECAtXFaQ1uy4QSke6bnaL+iymYZ/dWs9cqDqHM+rALfsHUwukUbxsdlECZ0pKmJdQ/4OA==", + "hasInstallScript": true, + "dependencies": { + "nan": "^2.13.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/highcharts": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-11.1.0.tgz", @@ -16450,9 +16463,7 @@ "node_modules/nan": { "version": "2.22.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", - "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", - "dev": true, - "optional": true + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" }, "node_modules/nanoid": { "version": "5.0.1", diff --git a/package.json b/package.json index 1bf767a..d6baf0c 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "dotenv": "^16.4.5", "express": "^4.21.0", "express-rate-limit": "^7.4.0", + "heapdump": "^0.3.15", "highcharts": "^11.1.0", "highcharts-react-official": "^3.2.1", "http-proxy-middleware": "^2.0.6", @@ -44,7 +45,7 @@ "client": "next dev", "build": "next build", "dev": "npx nodemon --exec tsx ./server/server.ts", - "start": "cross-env NODE_ENV=production NODE_OPTIONS='--max-old-space-size=8192' tsx ./server/server.ts", + "start": "cross-env NODE_ENV=production NODE_OPTIONS='--max-old-space-size=8192 --trace-gc' tsx ./server/server.ts", "submodule": "git submodule update --init --recursive" }, "eslintConfig": { diff --git a/server/server.ts b/server/server.ts index 70621a5..f315e97 100644 --- a/server/server.ts +++ b/server/server.ts @@ -1,3 +1,4 @@ +import heapdump from 'heapdump'; import "dotenv/config"; import express from "express"; import http from "http"; @@ -2077,3 +2078,16 @@ async function waitForDb() { await new Promise(res => setTimeout(res, 60 * 1e3)); } })(); + +setInterval(() => { + const memoryUsage = process.memoryUsage(); + console.log(`[Memory Log] heapUsed: ${(memoryUsage.heapUsed / 1024 / 1024).toFixed(2)} MB`); + + if (memoryUsage.heapUsed > 1.5 * 1024 * 1024 * 1024) { + const file = `/tmp/explorer/heapdump-${Date.now()}.heapsnapshot`; + heapdump.writeSnapshot(file, (err, filename) => { + if (err) console.error('Heapdump failed:', err); + else console.log('Heapdump written to', filename); + }); + } +}, 30000);