mirror of
https://github.com/withastro/astro.git
synced 2025-02-10 22:38:53 -05:00
Revert "wip: what if we just... didn't have a memory test"
This reverts commit 173729dbdc685e52881fc3333487b8f744add55f.
This commit is contained in:
parent
169a9e524f
commit
d825a35e18
4 changed files with 100 additions and 0 deletions
79
scripts/memory/index.js
Normal file
79
scripts/memory/index.js
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import v8 from 'v8';
|
||||||
|
import dev from '../../packages/astro/dist/core/dev/index.js';
|
||||||
|
import { loadConfig } from '../../packages/astro/dist/core/config.js';
|
||||||
|
import prettyBytes from 'pretty-bytes';
|
||||||
|
|
||||||
|
if (!global.gc) {
|
||||||
|
console.error('ERROR: Node must be run with --expose-gc');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const isCI = process.argv.includes('--ci');
|
||||||
|
|
||||||
|
/** URL directory containing the entire project. */
|
||||||
|
const projDir = new URL('./project/', import.meta.url);
|
||||||
|
|
||||||
|
let config = await loadConfig({
|
||||||
|
cwd: fileURLToPath(projDir),
|
||||||
|
});
|
||||||
|
|
||||||
|
const telemetry = {
|
||||||
|
record() {
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const server = await dev(config, { logging: { level: 'error' }, telemetry });
|
||||||
|
|
||||||
|
// Prime the server so initial memory is created
|
||||||
|
await fetch(`http://localhost:3000/page-0`);
|
||||||
|
|
||||||
|
async function run() {
|
||||||
|
for (let i = 0; i < 100; i++) {
|
||||||
|
let path = `/page-${i}`;
|
||||||
|
await fetch(`http://localhost:3000${path}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global.gc();
|
||||||
|
const startSize = v8.getHeapStatistics().used_heap_size;
|
||||||
|
|
||||||
|
// HUMAN mode: Runs forever. Optimized for accurate results on each snapshot Slower than CI.
|
||||||
|
if (!isCI) {
|
||||||
|
console.log(
|
||||||
|
`Greetings, human. This test will run forever. Run with the "--ci" flag to finish with a result.`
|
||||||
|
);
|
||||||
|
let i = 1;
|
||||||
|
while (i++) {
|
||||||
|
await run();
|
||||||
|
global.gc();
|
||||||
|
const checkpoint = v8.getHeapStatistics().used_heap_size;
|
||||||
|
console.log(`Snapshot ${String(i).padStart(3, '0')}: ${(checkpoint / startSize) * 100}%`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CI mode: Runs 100 times. Optimized for speed with an accurate final result.
|
||||||
|
for (let i = 0; i < 100; i++) {
|
||||||
|
await run();
|
||||||
|
const checkpoint = v8.getHeapStatistics().used_heap_size;
|
||||||
|
console.log(`Estimate ${String(i).padStart(3, '0')}/100: ${(checkpoint / startSize) * 100}%`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Test complete. Running final garbage collection...`);
|
||||||
|
global.gc();
|
||||||
|
const endSize = v8.getHeapStatistics().used_heap_size;
|
||||||
|
|
||||||
|
// If the trailing average is higher than the median, see if it's more than 5% higher
|
||||||
|
let percentage = endSize / startSize;
|
||||||
|
const TEST_THRESHOLD = 1.5;
|
||||||
|
const isPass = percentage < TEST_THRESHOLD;
|
||||||
|
console.log(``);
|
||||||
|
console.log(`Result: ${isPass ? 'PASS' : 'FAIL'} (${percentage * 100}%)`);
|
||||||
|
console.log(
|
||||||
|
`Memory usage began at ${prettyBytes(startSize)} and finished at ${prettyBytes(endSize)}.`
|
||||||
|
);
|
||||||
|
console.log(`The threshold for a probable memory leak is ${TEST_THRESHOLD * 100}%`);
|
||||||
|
console.log(``);
|
||||||
|
console.log(`Exiting...`);
|
||||||
|
await server.stop();
|
||||||
|
process.exit(isPass ? 0 : 1);
|
21
scripts/memory/mk.js
Normal file
21
scripts/memory/mk.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
const base = new URL('./project/', import.meta.url);
|
||||||
|
const pages = new URL('./src/pages/', base);
|
||||||
|
|
||||||
|
await fs.promises.writeFile(new URL('./package.json', base), `{
|
||||||
|
"name": "@test/smoke",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"astro": "workspace:*"
|
||||||
|
}
|
||||||
|
}`);
|
||||||
|
|
||||||
|
for (let i = 0; i < 100; i++) {
|
||||||
|
let content = `---
|
||||||
|
const i = ${i};
|
||||||
|
---
|
||||||
|
<span>{i}</span>`;
|
||||||
|
await fs.promises.writeFile(new URL(`./page-${i}.astro`, pages), content, 'utf-8');
|
||||||
|
}
|
0
scripts/memory/project/.gitkeep
Normal file
0
scripts/memory/project/.gitkeep
Normal file
0
scripts/memory/project/src/pages/.gitkeep
Normal file
0
scripts/memory/project/src/pages/.gitkeep
Normal file
Loading…
Add table
Reference in a new issue