def test_gc_diagnosis_cpu_time(): diag = GCDiagnosis(warn_over_frac=0.75) diag.N_SAMPLES = 3 # shorten tests with enable_gc_diagnosis_and_log(diag, level="WARN") as sio: # Spend some CPU time doing only full GCs for i in range(diag.N_SAMPLES): gc.collect() assert not sio.getvalue() gc.collect() lines = sio.getvalue().splitlines() assert len(lines) == 1 # Between 80% and 100% assert re.match( r"full garbage collections took (100|[89][0-9])% " r"CPU time recently", lines[0], ) with enable_gc_diagnosis_and_log(diag, level="WARN") as sio: # Spend half the CPU time doing full GCs for i in range(diag.N_SAMPLES + 1): t1 = thread_time() gc.collect() dt = thread_time() - t1 run_for(dt, timer=thread_time) # Less than 75% so nothing printed assert not sio.getvalue()
def test_gc_diagnosis_cpu_time(): diag = GCDiagnosis(warn_over_frac=0.75) diag.N_SAMPLES = 3 # shorten tests with enable_gc_diagnosis_and_log(diag, level='WARN') as sio: # Spend some CPU time doing only full GCs for i in range(diag.N_SAMPLES): gc.collect() assert not sio.getvalue() gc.collect() lines = sio.getvalue().splitlines() assert len(lines) == 1 # Between 80% and 100% assert re.match(r"full garbage collections took (100|[89][0-9])% " r"CPU time recently", lines[0]) with enable_gc_diagnosis_and_log(diag, level='WARN') as sio: # Spend half the CPU time doing full GCs for i in range(diag.N_SAMPLES + 1): t1 = thread_time() gc.collect() dt = thread_time() - t1 run_for(dt, timer=thread_time) # Less than 75% so nothing printed assert not sio.getvalue()
def test_gc_diagnosis_rss_win(): diag = GCDiagnosis(info_over_rss_win=10e6) def make_refcycle(nbytes): l = [b"x" * nbytes] l.append(l) return with enable_gc_diagnosis_and_log(diag) as sio: make_refcycle(100 * 1024) gc.collect() # Too small, nothing printed assert not sio.getvalue() # NOTE: need to allocate a very large value to make sure RSS # really shrinks (depending on the system memory allocator, # "small" memory deallocations may keep the memory in the pool) make_refcycle(200 * 1024 * 1024) gc.collect() lines = sio.getvalue().splitlines() assert len(lines) == 1 # Several MB released, and at least 1 reference cycles assert re.match( r"full garbage collection released [\d\.]+ MB " r"from [1-9]\d* reference cycles", lines[0], )