Skip to content

Commit 8435cdc

Browse files
authored
fix: Revert "fix: adding emergency garbage collection for chromium-based browsers" (#25546)
1 parent 90187ea commit 8435cdc

File tree

4 files changed

+11
-110
lines changed

4 files changed

+11
-110
lines changed

packages/driver/cypress/e2e/memory/memory_large_test.cy.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

packages/server/lib/browsers/memory/index.ts

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ const debug = debugModule('cypress:server:browsers:memory')
1616
const debugVerbose = debugModule('cypress-verbose:server:browsers:memory')
1717

1818
const MEMORY_THRESHOLD_PERCENTAGE = Number(process.env.CYPRESS_INTERNAL_MEMORY_THRESHOLD_PERCENTAGE) || 50
19-
const EMERGENCY_MEMORY_THRESHOLD_PERCENTAGE = Number(process.env.CYPRESS_INTERNAL_EMERGENCY_MEMORY_THRESHOLD_PERCENTAGE) || 90
2019
const MEMORY_PROFILER_INTERVAL = Number(process.env.CYPRESS_INTERNAL_MEMORY_PROFILER_INTERVAL) || 1000
2120
const MEMORY_FOLDER = process.env.CYPRESS_INTERNAL_MEMORY_FOLDER_PATH || path.join('cypress', 'logs', 'memory')
2221
const SAVE_MEMORY_STATS = ['1', 'true'].includes(process.env.CYPRESS_INTERNAL_MEMORY_SAVE_STATS?.toLowerCase() as string)
@@ -55,7 +54,6 @@ export type MemoryHandler = {
5554
* 2. set current renderer mem usage
5655
* 3. set max avail render mem to minimum of v8 heap size limit and total available mem (current available mem + current renderer mem usage)
5756
* 4. calc % of memory used, current renderer mem usage / max avail render mem
58-
* 5. if % of memory used exceeds the emergency memory threshold percentage (e.g. 90%) do a GC
5957
*
6058
* Before each test:
6159
* 1. if any interval exceeded the defined memory threshold (e.g. 50%), do a GC
@@ -210,7 +208,7 @@ export const getAvailableMemory: () => Promise<number> = measure(() => {
210208
/**
211209
* Calculates the memory stats used to determine if garbage collection should be run before the next test starts.
212210
*/
213-
export const calculateMemoryStats: (automation: Automation) => Promise<void> = measure(async (automation: Automation) => {
211+
export const calculateMemoryStats: () => Promise<void> = measure(async () => {
214212
// retrieve the available memory and the renderer process memory usage
215213
const [currentAvailableMemory, rendererProcessMemRss] = await Promise.all([
216214
getAvailableMemory(),
@@ -234,14 +232,6 @@ export const calculateMemoryStats: (automation: Automation) => Promise<void> = m
234232
// if we should collect garbage, set the flag to true so we can collect garbage on the next test
235233
collectGarbageOnNextTest = collectGarbageOnNextTest || shouldCollectGarbage
236234

237-
// if the renderer's memory is above the EMERGENCY_MEMORY_THRESHOLD_PERCENTAGE, we should perform an emergency garbage collection now
238-
const shouldEmergencyCollectGarbage = rendererUsagePercentage >= EMERGENCY_MEMORY_THRESHOLD_PERCENTAGE && !SKIP_GC
239-
240-
if (shouldEmergencyCollectGarbage) {
241-
debug('emergency garbage collection triggered')
242-
await checkMemoryPressure(automation, shouldEmergencyCollectGarbage)
243-
}
244-
245235
// set all the memory stats on the stats log
246236
statsLog.jsHeapSizeLimit = jsHeapSizeLimit
247237
statsLog.totalMemoryLimit = totalMemoryLimit
@@ -251,8 +241,6 @@ export const calculateMemoryStats: (automation: Automation) => Promise<void> = m
251241
statsLog.currentAvailableMemory = currentAvailableMemory
252242
statsLog.maxAvailableRendererMemory = maxAvailableRendererMemory
253243
statsLog.shouldCollectGarbage = shouldCollectGarbage
254-
statsLog.emergencyGarbageCollected = shouldEmergencyCollectGarbage
255-
statsLog.emergencyRendererMemoryThreshold = maxAvailableRendererMemory * (EMERGENCY_MEMORY_THRESHOLD_PERCENTAGE / 100)
256244
statsLog.timestamp = Date.now()
257245
}, { name: 'calculateMemoryStats', save: true })
258246

@@ -281,8 +269,8 @@ const checkMemoryPressureAndLog = async ({ automation, test }: { automation: Aut
281269
* Collects the browser's garbage if it previously exceeded the threshold when it was measured.
282270
* @param automation the automation client used to collect garbage
283271
*/
284-
const checkMemoryPressure: (automation: Automation, emergencyCollectGarbage?: boolean) => Promise<void> = measure(async (automation: Automation, emergencyCollectGarbage: boolean = false) => {
285-
if (collectGarbageOnNextTest || emergencyCollectGarbage) {
272+
const checkMemoryPressure: (automation: Automation) => Promise<void> = measure(async (automation: Automation) => {
273+
if (collectGarbageOnNextTest) {
286274
debug('forcing garbage collection')
287275
try {
288276
await automation.request('collect:garbage', null, null)
@@ -309,24 +297,24 @@ const addCumulativeStats = (stats: { [key: string]: any }) => {
309297
/**
310298
* Gathers the memory stats and schedules the next check.
311299
*/
312-
const gatherMemoryStats = async (automation: Automation) => {
300+
const gatherMemoryStats = async () => {
313301
try {
314-
await calculateMemoryStats(automation)
302+
await calculateMemoryStats()
315303
addCumulativeStats(statsLog)
316304
statsLog = {}
317305
} catch (err) {
318306
debug('error gathering memory stats: %o', err)
319307
}
320-
scheduleMemoryCheck(automation)
308+
scheduleMemoryCheck()
321309
}
322310

323311
/**
324312
* Schedules the next gathering of memory stats based on the MEMORY_PROFILER_INTERVAL.
325313
*/
326-
const scheduleMemoryCheck = (automation: Automation) => {
314+
const scheduleMemoryCheck = () => {
327315
if (started) {
328316
// not setinterval, since gatherMemoryStats is asynchronous
329-
timer = setTimeout(() => gatherMemoryStats(automation), MEMORY_PROFILER_INTERVAL)
317+
timer = setTimeout(gatherMemoryStats, MEMORY_PROFILER_INTERVAL)
330318
}
331319
}
332320

@@ -365,7 +353,7 @@ async function startProfiling (automation: Automation, spec: { fileName: string
365353
totalMemoryLimit = await handler.getTotalMemoryLimit(),
366354
])
367355

368-
await gatherMemoryStats(automation)
356+
await gatherMemoryStats()
369357
} catch (err) {
370358
debug('error starting memory profiler: %o', err)
371359
}

packages/server/test/unit/browsers/memory/memory_spec.ts

Lines changed: 2 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,6 @@ describe('lib/browsers/memory', () => {
141141
rendererUsagePercentage: 75,
142142
rendererMemoryThreshold: 50,
143143
currentAvailableMemory: 1000,
144-
emergencyGarbageCollected: false,
145-
emergencyRendererMemoryThreshold: 90,
146144
maxAvailableRendererMemory: 100,
147145
shouldCollectGarbage: true,
148146
timestamp: 0,
@@ -191,8 +189,6 @@ describe('lib/browsers/memory', () => {
191189
rendererUsagePercentage: 25,
192190
rendererMemoryThreshold: 25,
193191
currentAvailableMemory: 1000,
194-
emergencyGarbageCollected: false,
195-
emergencyRendererMemoryThreshold: 90,
196192
maxAvailableRendererMemory: 100,
197193
shouldCollectGarbage: true,
198194
timestamp: 0,
@@ -236,8 +232,6 @@ describe('lib/browsers/memory', () => {
236232
rendererUsagePercentage: 50,
237233
rendererMemoryThreshold: 50,
238234
currentAvailableMemory: 1000,
239-
emergencyGarbageCollected: false,
240-
emergencyRendererMemoryThreshold: 90,
241235
maxAvailableRendererMemory: 100,
242236
shouldCollectGarbage: true,
243237
timestamp: 0,
@@ -281,8 +275,6 @@ describe('lib/browsers/memory', () => {
281275
rendererUsagePercentage: 71.42857142857143,
282276
rendererMemoryThreshold: 17.5,
283277
currentAvailableMemory: 10,
284-
emergencyGarbageCollected: false,
285-
emergencyRendererMemoryThreshold: 31.5,
286278
maxAvailableRendererMemory: 35,
287279
shouldCollectGarbage: true,
288280
timestamp: 0,
@@ -326,8 +318,6 @@ describe('lib/browsers/memory', () => {
326318
rendererUsagePercentage: 25,
327319
rendererMemoryThreshold: 50,
328320
currentAvailableMemory: 1000,
329-
emergencyGarbageCollected: false,
330-
emergencyRendererMemoryThreshold: 90,
331321
maxAvailableRendererMemory: 100,
332322
shouldCollectGarbage: false,
333323
timestamp: 0,
@@ -421,8 +411,6 @@ describe('lib/browsers/memory', () => {
421411
rendererUsagePercentage: 51.2,
422412
rendererMemoryThreshold: 1000,
423413
currentAvailableMemory: 2000,
424-
emergencyGarbageCollected: false,
425-
emergencyRendererMemoryThreshold: 1800,
426414
maxAvailableRendererMemory: 2000,
427415
shouldCollectGarbage: true,
428416
timestamp: 0,
@@ -479,8 +467,6 @@ describe('lib/browsers/memory', () => {
479467
rendererUsagePercentage: 51.2,
480468
rendererMemoryThreshold: 1000,
481469
currentAvailableMemory: 2000,
482-
emergencyGarbageCollected: false,
483-
emergencyRendererMemoryThreshold: 1800,
484470
maxAvailableRendererMemory: 2000,
485471
shouldCollectGarbage: true,
486472
timestamp: 0,
@@ -538,8 +524,6 @@ describe('lib/browsers/memory', () => {
538524
rendererUsagePercentage: 51.2,
539525
rendererMemoryThreshold: 5000,
540526
currentAvailableMemory: 10000,
541-
emergencyGarbageCollected: false,
542-
emergencyRendererMemoryThreshold: 9000,
543527
maxAvailableRendererMemory: 10000,
544528
shouldCollectGarbage: true,
545529
timestamp: 0,
@@ -592,7 +576,7 @@ describe('lib/browsers/memory', () => {
592576
await memory.default.startProfiling(automation, { fileName: 'memory_spec' })
593577

594578
// second call will use the existing process id and use pidusage
595-
await memory.default.gatherMemoryStats(automation)
579+
await memory.default.gatherMemoryStats()
596580

597581
await memory.default.checkMemoryPressure({ automation, test: { title: 'test', order: 1, currentRetry: 0 } })
598582

@@ -606,8 +590,6 @@ describe('lib/browsers/memory', () => {
606590
rendererUsagePercentage: 34.13333333333333,
607591
rendererMemoryThreshold: 1500,
608592
currentAvailableMemory: 3000,
609-
emergencyGarbageCollected: false,
610-
emergencyRendererMemoryThreshold: 2700,
611593
maxAvailableRendererMemory: 3000,
612594
shouldCollectGarbage: false,
613595
timestamp: 0,
@@ -622,8 +604,6 @@ describe('lib/browsers/memory', () => {
622604
rendererUsagePercentage: 66.66666666666666,
623605
rendererMemoryThreshold: 1500,
624606
currentAvailableMemory: 3000,
625-
emergencyGarbageCollected: false,
626-
emergencyRendererMemoryThreshold: 2700,
627607
maxAvailableRendererMemory: 3000,
628608
shouldCollectGarbage: true,
629609
timestamp: 0,
@@ -659,7 +639,7 @@ describe('lib/browsers/memory', () => {
659639
.onSecondCall().resolves(25) // below threshold
660640

661641
await memory.default.startProfiling(automation, { fileName: 'memory_spec' })
662-
await memory.default.gatherMemoryStats(automation)
642+
await memory.default.gatherMemoryStats()
663643
await memory.default.checkMemoryPressure({ automation, test: { title: 'test', order: 1, currentRetry: 0 } })
664644

665645
const expected = [
@@ -671,8 +651,6 @@ describe('lib/browsers/memory', () => {
671651
rendererUsagePercentage: 75,
672652
rendererMemoryThreshold: 50,
673653
currentAvailableMemory: 1000,
674-
emergencyGarbageCollected: false,
675-
emergencyRendererMemoryThreshold: 90,
676654
maxAvailableRendererMemory: 100,
677655
shouldCollectGarbage: true,
678656
timestamp: 0,
@@ -686,8 +664,6 @@ describe('lib/browsers/memory', () => {
686664
rendererUsagePercentage: 25,
687665
rendererMemoryThreshold: 50,
688666
currentAvailableMemory: 1000,
689-
emergencyGarbageCollected: false,
690-
emergencyRendererMemoryThreshold: 90,
691667
maxAvailableRendererMemory: 100,
692668
shouldCollectGarbage: false,
693669
timestamp: 0,
@@ -706,62 +682,6 @@ describe('lib/browsers/memory', () => {
706682
expect(memory.getRendererMemoryUsage).to.be.calledTwice
707683
expect(memory.default.getMemoryStats()).to.deep.eql(expected)
708684
})
709-
710-
it('performs an emergency garbage collection when the renderer memory goes over the emergency threshold', async () => {
711-
const automation = sinon.createStubInstance(Automation)
712-
const gcStub = automation.request.withArgs('collect:garbage').resolves()
713-
const mockHandler = {
714-
getAvailableMemory: sinon.stub().resolves(1000),
715-
getTotalMemoryLimit: sinon.stub().resolves(2000),
716-
}
717-
718-
sinon.stub(memory, 'getJsHeapSizeLimit').resolves(100)
719-
sinon.stub(memory, 'getMemoryHandler').resolves(mockHandler)
720-
sinon.stub(memory, 'getRendererMemoryUsage')
721-
.onFirstCall().resolves(25)
722-
.onSecondCall().resolves(90) // equal to the emergency threshold
723-
724-
await memory.default.startProfiling(automation, { fileName: 'memory_spec' })
725-
// this should trigger an emergency garbage collection without needing a call to checkMemoryPressure
726-
await memory.default.gatherMemoryStats(automation)
727-
728-
const expected = [
729-
{
730-
getAvailableMemoryDuration: 0,
731-
jsHeapSizeLimit: 100,
732-
totalMemoryLimit: 2000,
733-
rendererProcessMemRss: 25,
734-
rendererUsagePercentage: 25,
735-
rendererMemoryThreshold: 50,
736-
currentAvailableMemory: 1000,
737-
emergencyGarbageCollected: false,
738-
emergencyRendererMemoryThreshold: 90,
739-
maxAvailableRendererMemory: 100,
740-
shouldCollectGarbage: false,
741-
timestamp: 0,
742-
calculateMemoryStatsDuration: 0,
743-
},
744-
{
745-
getAvailableMemoryDuration: 0,
746-
jsHeapSizeLimit: 100,
747-
totalMemoryLimit: 2000,
748-
rendererProcessMemRss: 90,
749-
rendererUsagePercentage: 90,
750-
rendererMemoryThreshold: 50,
751-
currentAvailableMemory: 1000,
752-
emergencyGarbageCollected: true,
753-
emergencyRendererMemoryThreshold: 90,
754-
maxAvailableRendererMemory: 100,
755-
shouldCollectGarbage: true,
756-
timestamp: 0,
757-
calculateMemoryStatsDuration: 0,
758-
},
759-
]
760-
761-
expect(gcStub).to.be.calledOnce
762-
expect(memory.getRendererMemoryUsage).to.be.calledTwice
763-
expect(memory.default.getMemoryStats()).to.deep.eql(expected)
764-
})
765685
})
766686

767687
context('#endProfiling', () => {

0 commit comments

Comments
 (0)