summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2026-01-22 14:32:57 +0900
committerGitHub <noreply@github.com>2026-01-22 14:32:57 +0900
commit2fa6ecc7efaaf9b9d189cdd3a3ebbb9171c86078 (patch)
tree765b336c2f5b27e1df1f5ee1e14f4bb6a8e54684 /packages
parentenhance(dev): improve mem report (#17117) (diff)
downloadmisskey-2fa6ecc7efaaf9b9d189cdd3a3ebbb9171c86078.tar.gz
misskey-2fa6ecc7efaaf9b9d189cdd3a3ebbb9171c86078.tar.bz2
misskey-2fa6ecc7efaaf9b9d189cdd3a3ebbb9171c86078.zip
enhance(dev): improve mem report (#17118)
* wip * wip * Update report-backend-memory.yml * Update report-backend-memory.yml * Update .github/workflows/report-backend-memory.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Diffstat (limited to '')
-rw-r--r--packages/backend/scripts/measure-memory.mjs37
-rw-r--r--packages/backend/src/boot/entry.ts14
-rw-r--r--packages/backend/src/env.ts1
3 files changed, 38 insertions, 14 deletions
diff --git a/packages/backend/scripts/measure-memory.mjs b/packages/backend/scripts/measure-memory.mjs
index 82a5a0bf0b..749f550bcc 100644
--- a/packages/backend/scripts/measure-memory.mjs
+++ b/packages/backend/scripts/measure-memory.mjs
@@ -60,9 +60,9 @@ async function measureMemory() {
...process.env,
NODE_ENV: 'production',
MK_DISABLE_CLUSTERING: '1',
- MK_FORCE_GC: '1',
},
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
+ execArgv: [...process.execArgv, '--expose-gc'],
});
let serverReady = false;
@@ -104,9 +104,21 @@ async function measureMemory() {
// Wait for memory to settle
await setTimeout(MEMORY_SETTLE_TIME);
- // Get memory usage from the server process via /proc
const pid = serverProcess.pid;
- const memoryInfo = await getMemoryUsage(pid);
+
+ const beforeGc = await getMemoryUsage(pid);
+
+ serverProcess.send('gc');
+
+ await new Promise((resolve) => {
+ serverProcess.once('message', (message) => {
+ if (message === 'gc ok') resolve();
+ });
+ });
+
+ await setTimeout(1000);
+
+ const afterGc = await getMemoryUsage(pid);
// Stop the server
serverProcess.kill('SIGTERM');
@@ -129,7 +141,8 @@ async function measureMemory() {
const result = {
timestamp: new Date().toISOString(),
- memory: memoryInfo,
+ beforeGc,
+ afterGc,
};
return result;
@@ -144,19 +157,23 @@ async function main() {
}
// Calculate averages
- const avgMemory = structuredClone(keys);
+ const beforeGc = structuredClone(keys);
+ const afterGc = structuredClone(keys);
for (const res of results) {
- for (const key of Object.keys(avgMemory)) {
- avgMemory[key] += res.memory[key];
+ for (const key of Object.keys(keys)) {
+ beforeGc[key] += res.beforeGc[key];
+ afterGc[key] += res.afterGc[key];
}
}
- for (const key of Object.keys(avgMemory)) {
- avgMemory[key] = Math.round(avgMemory[key] / SAMPLE_COUNT);
+ for (const key of Object.keys(keys)) {
+ beforeGc[key] = Math.round(beforeGc[key] / SAMPLE_COUNT);
+ afterGc[key] = Math.round(afterGc[key] / SAMPLE_COUNT);
}
const result = {
timestamp: new Date().toISOString(),
- memory: avgMemory,
+ beforeGc,
+ afterGc,
};
// Output as JSON to stdout
diff --git a/packages/backend/src/boot/entry.ts b/packages/backend/src/boot/entry.ts
index 56b339b6aa..3a33d198a5 100644
--- a/packages/backend/src/boot/entry.ts
+++ b/packages/backend/src/boot/entry.ts
@@ -86,9 +86,17 @@ if (!envOption.disableClustering) {
ev.mount();
}
-if (envOption.forceGc && global.gc != null) {
- global.gc();
-}
+process.on('message', msg => {
+ if (msg === 'gc') {
+ if (global.gc != null) {
+ logger.info('Manual GC triggered');
+ global.gc();
+ if (process.send != null) process.send('gc ok');
+ } else {
+ logger.warn('Manual GC requested but gc is not available. Start the process with --expose-gc to enable this feature.');
+ }
+ }
+});
readyRef.value = true;
diff --git a/packages/backend/src/env.ts b/packages/backend/src/env.ts
index 9957938467..ba44cfa2e6 100644
--- a/packages/backend/src/env.ts
+++ b/packages/backend/src/env.ts
@@ -11,7 +11,6 @@ const envOption = {
verbose: false,
withLogTime: false,
quiet: false,
- forceGc: false,
};
for (const key of Object.keys(envOption) as (keyof typeof envOption)[]) {