@@ -14,6 +14,7 @@ import { fork } from 'node:child_process';
1414import { setTimeout } from 'node:timers/promises' ;
1515import { fileURLToPath } from 'node:url' ;
1616import { dirname , join } from 'node:path' ;
17+ import * as http from 'node:http' ;
1718import * as fs from 'node:fs/promises' ;
1819
1920const __filename = fileURLToPath ( import . meta. url ) ;
@@ -88,6 +89,40 @@ async function measureMemory() {
8889 process . stderr . write ( `[server error] ${ err } \n` ) ;
8990 } ) ;
9091
92+ async function triggerGc ( ) {
93+ const ok = new Promise ( ( resolve ) => {
94+ serverProcess . once ( 'message' , ( message ) => {
95+ if ( message === 'gc ok' ) resolve ( ) ;
96+ } ) ;
97+ } ) ;
98+
99+ serverProcess . send ( 'gc' ) ;
100+
101+ await ok ;
102+
103+ await setTimeout ( 1000 ) ;
104+ }
105+
106+ function createRequest ( ) {
107+ return new Promise ( ( resolve , reject ) => {
108+ const req = http . request ( {
109+ host : 'localhost' ,
110+ port : 61812 ,
111+ path : '/api/meta' ,
112+ method : 'POST' ,
113+ } , ( res ) => {
114+ res . on ( 'data' , ( ) => { } ) ;
115+ res . on ( 'end' , ( ) => {
116+ resolve ( ) ;
117+ } ) ;
118+ } ) ;
119+ req . on ( 'error' , ( err ) => {
120+ reject ( err ) ;
121+ } ) ;
122+ req . end ( ) ;
123+ } ) ;
124+ }
125+
91126 // Wait for server to be ready or timeout
92127 const startupStartTime = Date . now ( ) ;
93128 while ( ! serverReady ) {
@@ -108,17 +143,19 @@ async function measureMemory() {
108143
109144 const beforeGc = await getMemoryUsage ( pid ) ;
110145
111- serverProcess . send ( 'gc' ) ;
146+ await triggerGc ( ) ;
112147
113- await new Promise ( ( resolve ) => {
114- serverProcess . once ( 'message' , ( message ) => {
115- if ( message === 'gc ok' ) resolve ( ) ;
116- } ) ;
117- } ) ;
148+ const afterGc = await getMemoryUsage ( pid ) ;
118149
119- await setTimeout ( 1000 ) ;
150+ // create some http requests to simulate load
151+ const REQUEST_COUNT = 10 ;
152+ await Promise . all (
153+ Array . from ( { length : REQUEST_COUNT } ) . map ( ( ) => createRequest ( ) ) ,
154+ ) ;
120155
121- const afterGc = await getMemoryUsage ( pid ) ;
156+ await triggerGc ( ) ;
157+
158+ const afterRequest = await getMemoryUsage ( pid ) ;
122159
123160 // Stop the server
124161 serverProcess . kill ( 'SIGTERM' ) ;
@@ -143,6 +180,7 @@ async function measureMemory() {
143180 timestamp : new Date ( ) . toISOString ( ) ,
144181 beforeGc,
145182 afterGc,
183+ afterRequest,
146184 } ;
147185
148186 return result ;
@@ -159,21 +197,25 @@ async function main() {
159197 // Calculate averages
160198 const beforeGc = structuredClone ( keys ) ;
161199 const afterGc = structuredClone ( keys ) ;
200+ const afterRequest = structuredClone ( keys ) ;
162201 for ( const res of results ) {
163202 for ( const key of Object . keys ( keys ) ) {
164203 beforeGc [ key ] += res . beforeGc [ key ] ;
165204 afterGc [ key ] += res . afterGc [ key ] ;
205+ afterRequest [ key ] += res . afterRequest [ key ] ;
166206 }
167207 }
168208 for ( const key of Object . keys ( keys ) ) {
169209 beforeGc [ key ] = Math . round ( beforeGc [ key ] / SAMPLE_COUNT ) ;
170210 afterGc [ key ] = Math . round ( afterGc [ key ] / SAMPLE_COUNT ) ;
211+ afterRequest [ key ] = Math . round ( afterRequest [ key ] / SAMPLE_COUNT ) ;
171212 }
172213
173214 const result = {
174215 timestamp : new Date ( ) . toISOString ( ) ,
175216 beforeGc,
176217 afterGc,
218+ afterRequest,
177219 } ;
178220
179221 // Output as JSON to stdout
0 commit comments