Skip to content

Commit

Permalink
functionality to expose page utilization at the julia level (#113)
Browse files Browse the repository at this point in the history
  • Loading branch information
d-netto authored and Drvi committed Feb 28, 2024
1 parent 9208352 commit 4aa96c0
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 9 deletions.
7 changes: 7 additions & 0 deletions base/timing.jl
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,13 @@ function gc_live_bytes()
Int(ccall(:jl_gc_live_bytes, Int64, ())) + num.allocd + num.deferred_alloc
end

# must be kept in sync with the value from `src/julia_threads.h``
const JL_GC_N_MAX_POOLS = 51
function gc_page_utilization_data()
page_utilization_raw = cglobal(:jl_gc_page_utilization_stats, Float64)
return Base.unsafe_wrap(Array, page_utilization_raw, JL_GC_N_MAX_POOLS, own=false)
end

"""
Base.jit_total_bytes()
Expand Down
8 changes: 2 additions & 6 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1391,21 +1391,19 @@ int jl_gc_classify_pools(size_t sz, int *osize)
// sweep phase

gc_fragmentation_stat_t gc_page_fragmentation_stats[JL_GC_N_POOLS];
JL_DLLEXPORT double jl_gc_page_utilization_stats[JL_GC_N_MAX_POOLS];

extern gc_fragmentation_stat_t gc_page_fragmentation_stats[JL_GC_N_POOLS];

STATIC_INLINE void gc_update_page_fragmentation_data(jl_gc_pagemeta_t *pg) JL_NOTSAFEPOINT
{
#ifdef GC_MEASURE_PAGE_FRAGMENTATION
gc_fragmentation_stat_t *stats = &gc_page_fragmentation_stats[pg->pool_n];
jl_atomic_fetch_add(&stats->n_freed_objs, pg->nfree);
jl_atomic_fetch_add(&stats->n_pages_allocd, 1);
#endif
}

STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT
{
#ifdef GC_MEASURE_PAGE_FRAGMENTATION
for (int i = 0; i < JL_GC_N_POOLS; i++) {
gc_fragmentation_stat_t *stats = &gc_page_fragmentation_stats[i];
double utilization = 1.0;
Expand All @@ -1414,12 +1412,10 @@ STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT
if (n_pages_allocd != 0) {
utilization -= ((double)n_freed_objs * (double)jl_gc_sizeclasses[i]) / (double)n_pages_allocd / (double)GC_PAGE_SZ;
}
jl_safe_printf("Size class %d: %.2f%% utilization\n", jl_gc_sizeclasses[i], utilization * 100.0);
jl_gc_page_utilization_stats[i] = utilization;
jl_atomic_store_relaxed(&stats->n_freed_objs, 0);
jl_atomic_store_relaxed(&stats->n_pages_allocd, 0);
}
jl_safe_printf("-----------------------------------------\n");
#endif
}

int64_t buffered_pages = 0;
Expand Down
3 changes: 0 additions & 3 deletions src/gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,6 @@ STATIC_INLINE jl_gc_pagemeta_t *pop_lf_back(jl_gc_page_stack_t *pool) JL_NOTSAFE
}
}

// data structures for tracking fragmentation in the pool allocator
// #define GC_MEASURE_PAGE_FRAGMENTATION

typedef struct {
_Atomic(size_t) n_freed_objs;
_Atomic(size_t) n_pages_allocd;
Expand Down

0 comments on commit 4aa96c0

Please sign in to comment.