astro/scripts/memory/index.js

73 lines
2.3 KiB
JavaScript
Raw Normal View History

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';
2022-02-19 01:08:28 +00:00
if (!global.gc) {
console.error('ERROR: Node must be run with --expose-gc');
process.exit(1);
}
2022-02-19 01:08:28 +00:00
const isCI = process.argv.includes('--ci');
2022-02-19 01:08:28 +00:00
/** URL directory containing the entire project. */
const projDir = new URL('./project/', import.meta.url);
let config = await loadConfig({
2022-02-18 20:24:55 +00:00
cwd: fileURLToPath(projDir),
});
merge `next` into `main` (#2705) * Unflag the static build (#2652) * Unflag the static build * Only set legacyBuild to false if experimentalSSR is true * Use legacy build when we have to * Put a few more tests into legacy mode * Last two * Make astro-basic use the legacy build * Adds a changeset * Mark the lit test as legacy * Update yarn lock * Update based on feedback * Add --legacy-build flag * Move astro-basic test to use static build (#2682) * Move some tests over to the static build (#2677) * Move some tests over to the static build * Fix assets tests * Fix the assets tests * Fix for the client:only components * Moves asset tests to the static build * Move postcss test over to static build * Bring back legacy build for astro-basic test * Move astro-basic test to use static build * Migrate more tests to the static build (#2693) * fix: disable HMR during build (#2684) * Migrate more tests to the static build * Only prepend links in non-legacy mode * Add the 0-css tests * Convert all CSS tests to the static build * Migrate Astro global tests * Remove .only * Fix static build tests * Migrate a few more * More tests * Move the lit test back to legacy * Increase the test timeout Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com> * Improve `head` injection behavior (#2436) * feat: add renderHead util to server * feat: remove `layouts` from config, Vite plugin * fix: improve head injection during rendering * chore: update compiler * fix: do not escape links * chore: enter `pre` mode * Replace `send` with `sirv` (#2713) * remove send * Create thick-ravens-chew.md * I feel like I'm going to screw something up * working finally! * rewrite req.url * Add tiny bit of doc * Update .gitignore Co-authored-by: Evan Boehs <evan@boehs.org> * Move remaining tests to the static build (#2712) * Move lit test to the static build * Migrate astro-env plugin to work in the static build * Do not remove vite:define * Adds a changeset * Add a warning when passing the --experimental-static-build flag (#2718) * Add a warning when passing the --experimental-static-build flag * Disable the lint warning * [ci] release (next) (#2721) * [ci] release (next) * chore: update changeset Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Nate Moore <nate@skypack.dev> * 404 page (#2719) * Fix: build to 404.html in the static build * Adds a changeset * fix pnpm install missing peer deps * fix svelte version in workspace * fix lockfile * fix(webapi): add dev script * improve preview reliability (#2739) * improve preview reliability - fix broken tests * shamefully hoist to unblock * remove lit from test running * chore: update lockfile Co-authored-by: Matthew Phillips <matthew@skypack.dev> Co-authored-by: Evan Boehs <evan@boehs.org> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Fred K. Schott <fkschott@gmail.com>
2022-03-09 21:44:26 +00:00
config.buildOptions.legacyBuild = false;
2022-02-19 01:08:28 +00:00
const server = await dev(config, { logging: { level: 'error' } });
// Prime the server so initial memory is created
await fetch(`http://localhost:3000/page-0`);
async function run() {
2022-02-18 20:24:55 +00:00
for (let i = 0; i < 100; i++) {
let path = `/page-${i}`;
await fetch(`http://localhost:3000${path}`);
}
}
2022-02-19 01:08:28 +00:00
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.
2022-02-18 20:24:55 +00:00
for (let i = 0; i < 100; i++) {
await run();
2022-02-19 01:08:28 +00:00
const checkpoint = v8.getHeapStatistics().used_heap_size;
console.log(`Estimate ${String(i).padStart(3, '0')}/100: ${(checkpoint / startSize) * 100}%`);
}
2022-02-19 01:08:28 +00:00
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
2022-02-19 01:08:28 +00:00
let percentage = endSize / startSize;
const TEST_THRESHOLD = 1.5;
2022-02-19 01:08:28 +00:00
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();
2022-02-19 01:08:28 +00:00
process.exit(isPass ? 0 : 1);