Skip to content

Commit 4f6c70f

Browse files
author
Cody Tapscott
committed
Instrument jl_package_restore_image_from_file
Add tracepoints for Tracy to drill down on the loading graph. Just a rough place to start, but it's enough to identify the big hitters.
1 parent 0aa8805 commit 4f6c70f

File tree

3 files changed

+218
-96
lines changed

3 files changed

+218
-96
lines changed

src/gc.c

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "gc.h"
44
#include "julia_gcext.h"
55
#include "julia_assert.h"
6+
#include "tracy/TracyC.h"
7+
#include <stdbool.h>
68
#ifdef __GLIBC__
79
#include <malloc.h> // for malloc_trim
810
#endif
@@ -3461,6 +3463,7 @@ JL_DLLEXPORT void jl_gc_collect(jl_gc_collection_t collection)
34613463
return;
34623464
}
34633465
JL_TIMING(GC);
3466+
TracyCZoneN(ctx, "jl_gc_collect", true);
34643467
int last_errno = errno;
34653468
#ifdef _OS_WINDOWS_
34663469
DWORD last_error = GetLastError();
@@ -3520,6 +3523,7 @@ JL_DLLEXPORT void jl_gc_collect(jl_gc_collection_t collection)
35203523
SetLastError(last_error);
35213524
#endif
35223525
errno = last_errno;
3526+
TracyCZoneEnd(ctx);
35233527
}
35243528

35253529
void gc_mark_queue_all_roots(jl_ptls_t ptls, jl_gc_mark_sp_t *sp)

src/staticdata.c

+108-21
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ External links:
7474
#include <string.h>
7575
#include <stdio.h> // printf
7676
#include <inttypes.h> // PRIxPTR
77+
#include "tracy/TracyC.h"
7778

7879
#include "julia.h"
7980
#include "julia_internal.h"
@@ -2708,13 +2709,15 @@ JL_DLLEXPORT void jl_set_sysimg_so(void *handle)
27082709
// }
27092710
#endif
27102711

2712+
// TODO: Fully instrument
27112713
static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl_array_t *depmods, uint64_t checksum,
27122714
/* outputs */ jl_array_t **restored, jl_array_t **init_order,
27132715
jl_array_t **extext_methods,
27142716
jl_array_t **new_specializations, jl_array_t **method_roots_list,
27152717
jl_array_t **ext_targets, jl_array_t **edges,
27162718
char **base, arraylist_t *ccallable_list, pkgcachesizes *cachesizes) JL_GC_DISABLED
27172719
{
2720+
TracyCZoneN(ctx, "jl_restore_package_image_from_stream_", true);
27182721
JL_TIMING(SYSIMG_LOAD);
27192722
int en = jl_gc_enable(0);
27202723
ios_t sysimg, const_data, symbols, relocs, gvar_record, fptr_record;
@@ -3236,6 +3239,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
32363239
uint64_t *build_id_data = (uint64_t*)jl_array_data(jl_build_ids);
32373240
build_id_data[jl_array_len(jl_build_ids)-1] = buildid;
32383241
jl_gc_enable(en);
3242+
TracyCZoneEnd(ctx);
32393243
}
32403244

32413245
static jl_value_t *jl_validate_cache_file(ios_t *f, jl_array_t *depmods, uint64_t *checksum, int64_t *dataendpos, int64_t *datastartpos)
@@ -3267,6 +3271,7 @@ static jl_value_t *jl_validate_cache_file(ios_t *f, jl_array_t *depmods, uint64_
32673271
// TODO?: refactor to make it easier to create the "package inspector"
32683272
static jl_value_t *jl_restore_package_image_from_stream(ios_t *f, jl_image_t *image, jl_array_t *depmods, int complete)
32693273
{
3274+
TracyCZoneN(ctx, "jl_restore_package_image_from_stream", true);
32703275
uint64_t checksum = 0;
32713276
int64_t dataendpos = 0;
32723277
int64_t datastartpos = 0;
@@ -3288,9 +3293,21 @@ static jl_value_t *jl_restore_package_image_from_stream(ios_t *f, jl_image_t *im
32883293
ios_bufmode(f, bm_none);
32893294
JL_SIGATOMIC_BEGIN();
32903295
size_t len = dataendpos - datastartpos;
3296+
3297+
TracyCZoneN(ctx_gc, "jl_gc_perm_alloc", true);
32913298
char *sysimg = (char*)jl_gc_perm_alloc(len, 0, 64, 0);
3299+
TracyCZoneEnd(ctx_gc);
3300+
32923301
ios_seek(f, datastartpos);
3293-
if (ios_readall(f, sysimg, len) != len || jl_crc32c(0, sysimg, len) != (uint32_t)checksum) {
3302+
TracyCZoneN(ctx_ios, "ios_readall", true);
3303+
bool err_reading = ios_readall(f, sysimg, len) != len;
3304+
TracyCZoneEnd(ctx_ios);
3305+
{
3306+
TracyCZoneN(ctx_crc, "jl_crc32c", true);
3307+
err_reading = err_reading || jl_crc32c(0, sysimg, len) != (uint32_t)checksum;
3308+
TracyCZoneEnd(ctx_crc);
3309+
}
3310+
if (err_reading) {
32943311
restored = jl_get_exceptionf(jl_errorexception_type, "Error reading system image file.");
32953312
JL_SIGATOMIC_END();
32963313
}
@@ -3303,16 +3320,36 @@ static jl_value_t *jl_restore_package_image_from_stream(ios_t *f, jl_image_t *im
33033320
JL_SIGATOMIC_END();
33043321

33053322
// Insert method extensions
3306-
jl_insert_methods(extext_methods);
3323+
{
3324+
TracyCZoneN(ctx2, "jl_insert_methods", true);
3325+
TracyCZoneValue(ctx2, jl_array_len(extext_methods));
3326+
jl_insert_methods(extext_methods);
3327+
TracyCZoneEnd(ctx2);
3328+
}
33073329
// No special processing of `new_specializations` is required because recaching handled it
33083330
// Add roots to methods
3309-
jl_copy_roots(method_roots_list, jl_worklist_key((jl_array_t*)restored));
3331+
{
3332+
TracyCZoneN(ctx2, "jl_copy_roots", true);
3333+
jl_copy_roots(method_roots_list, jl_worklist_key((jl_array_t*)restored));
3334+
TracyCZoneEnd(ctx2);
3335+
}
33103336
// Handle edges
3311-
jl_insert_backedges((jl_array_t*)edges, (jl_array_t*)ext_targets, (jl_array_t*)new_specializations); // restore external backedges (needs to be last)
3337+
{
3338+
// TracyC: traced internally
3339+
jl_insert_backedges((jl_array_t*)edges, (jl_array_t*)ext_targets, (jl_array_t*)new_specializations); // restore external backedges (needs to be last)
3340+
}
33123341
// check new CodeInstances and validate any that lack external backedges
3313-
validate_new_code_instances();
3342+
{
3343+
TracyCZoneN(ctx2, "validate_new_code_instances", true);
3344+
validate_new_code_instances();
3345+
TracyCZoneEnd(ctx2);
3346+
}
33143347
// reinit ccallables
3315-
jl_reinit_ccallable(&ccallable_list, base, NULL);
3348+
{
3349+
TracyCZoneN(ctx2, "jl_reinit_ccallable", true);
3350+
jl_reinit_ccallable(&ccallable_list, base, NULL);
3351+
TracyCZoneEnd(ctx2);
3352+
}
33163353
arraylist_free(&ccallable_list);
33173354
htable_free(&new_code_instance_validate);
33183355
if (complete) {
@@ -3332,6 +3369,7 @@ static jl_value_t *jl_restore_package_image_from_stream(ios_t *f, jl_image_t *im
33323369
}
33333370

33343371
JL_GC_POP();
3372+
TracyCZoneEnd(ctx);
33353373
return restored;
33363374
}
33373375

@@ -3352,14 +3390,20 @@ JL_DLLEXPORT jl_value_t *jl_restore_incremental_from_buf(const char *buf, jl_ima
33523390

33533391
JL_DLLEXPORT jl_value_t *jl_restore_incremental(const char *fname, jl_array_t *depmods, int complete)
33543392
{
3393+
TracyCZoneN(ctx, "jl_restore_incremental", true);
3394+
TracyCZoneText(ctx, fname, strlen(fname));
3395+
33553396
ios_t f;
33563397
if (ios_file(&f, fname, 1, 0, 0, 0) == NULL) {
3398+
TracyCZoneEnd(ctx);
33573399
return jl_get_exceptionf(jl_errorexception_type,
33583400
"Cache file \"%s\" not found.\n", fname);
33593401
}
33603402
jl_image_t pkgimage = {};
33613403
jl_value_t *ret = jl_restore_package_image_from_stream(&f, &pkgimage, depmods, complete);
33623404
ios_close(&f);
3405+
3406+
TracyCZoneEnd(ctx);
33633407
return ret;
33643408
}
33653409

@@ -3408,7 +3452,12 @@ JL_DLLEXPORT void jl_restore_system_image_data(const char *buf, size_t len)
34083452

34093453
JL_DLLEXPORT jl_value_t *jl_restore_package_image_from_file(const char *fname, jl_array_t *depmods, int complete)
34103454
{
3455+
TracyCZoneN(ctx, "jl_restore_package_image_from_file", true);
3456+
TracyCZoneText(ctx, fname, strlen(fname));
3457+
3458+
TracyCZoneN(ctx2, "jl_dlopen", true);
34113459
void *pkgimg_handle = jl_dlopen(fname, JL_RTLD_LAZY);
3460+
TracyCZoneEnd(ctx2);
34123461
if (!pkgimg_handle) {
34133462
#ifdef _OS_WINDOWS_
34143463
int err;
@@ -3421,45 +3470,83 @@ JL_DLLEXPORT jl_value_t *jl_restore_package_image_from_file(const char *fname, j
34213470
jl_errorf("Error opening package file %s: %s\n", fname, reason);
34223471
}
34233472
const char *pkgimg_data;
3424-
jl_dlsym(pkgimg_handle, "jl_system_image_data", (void **)&pkgimg_data, 1);
3473+
{
3474+
TracyCZoneN(ctx3, "jl_dlsym", true);
3475+
jl_dlsym(pkgimg_handle, "jl_system_image_data", (void **)&pkgimg_data, 1);
3476+
TracyCZoneEnd(ctx3);
3477+
}
34253478
size_t *plen;
3426-
jl_dlsym(pkgimg_handle, "jl_system_image_size", (void **)&plen, 1);
3479+
{
3480+
TracyCZoneN(ctx3, "jl_dlsym", true);
3481+
jl_dlsym(pkgimg_handle, "jl_system_image_size", (void **)&plen, 1);
3482+
TracyCZoneEnd(ctx3);
3483+
}
34273484

34283485
jl_image_t pkgimage;
3486+
TracyCZoneN(ctx4, "jl_init_processor_pkgimg", true);
34293487
pkgimage.fptrs = jl_init_processor_pkgimg(pkgimg_handle);
3430-
if (!jl_dlsym(pkgimg_handle, "jl_sysimg_gvars_base", (void **)&pkgimage.gvars_base, 0)) {
3431-
pkgimage.gvars_base = NULL;
3488+
TracyCZoneEnd(ctx4);
3489+
{
3490+
TracyCZoneN(ctx3, "jl_dlsym", true);
3491+
if (!jl_dlsym(pkgimg_handle, "jl_sysimg_gvars_base", (void **)&pkgimage.gvars_base, 0)) {
3492+
pkgimage.gvars_base = NULL;
3493+
}
3494+
TracyCZoneEnd(ctx3);
34323495
}
34333496

3434-
jl_dlsym(pkgimg_handle, "jl_sysimg_gvars_offsets", (void **)&pkgimage.gvars_offsets, 1);
3497+
{
3498+
TracyCZoneN(ctx3, "jl_dlsym", true);
3499+
jl_dlsym(pkgimg_handle, "jl_sysimg_gvars_offsets", (void **)&pkgimage.gvars_offsets, 1);
3500+
TracyCZoneEnd(ctx3);
3501+
}
34353502
pkgimage.gvars_offsets += 1;
34363503

34373504
void *pgcstack_func_slot;
3438-
jl_dlsym(pkgimg_handle, "jl_pgcstack_func_slot", &pgcstack_func_slot, 0);
3505+
{
3506+
TracyCZoneN(ctx3, "jl_dlsym", true);
3507+
jl_dlsym(pkgimg_handle, "jl_pgcstack_func_slot", &pgcstack_func_slot, 0);
3508+
TracyCZoneEnd(ctx3);
3509+
}
34393510
if (pgcstack_func_slot) { // Empty package images might miss these
34403511
void *pgcstack_key_slot;
3441-
jl_dlsym(pkgimg_handle, "jl_pgcstack_key_slot", &pgcstack_key_slot, 1);
3512+
{
3513+
TracyCZoneN(ctx3, "jl_dlsym", true);
3514+
jl_dlsym(pkgimg_handle, "jl_pgcstack_key_slot", &pgcstack_key_slot, 1);
3515+
TracyCZoneEnd(ctx3);
3516+
}
34423517
jl_pgcstack_getkey((jl_get_pgcstack_func**)pgcstack_func_slot, (jl_pgcstack_key_t*)pgcstack_key_slot);
34433518

34443519
size_t *tls_offset_idx;
3445-
jl_dlsym(pkgimg_handle, "jl_tls_offset", (void **)&tls_offset_idx, 1);
3520+
{
3521+
TracyCZoneN(ctx3, "jl_dlsym", true);
3522+
jl_dlsym(pkgimg_handle, "jl_tls_offset", (void **)&tls_offset_idx, 1);
3523+
TracyCZoneEnd(ctx3);
3524+
}
34463525
*tls_offset_idx = (uintptr_t)(jl_tls_offset == -1 ? 0 : jl_tls_offset);
34473526
}
34483527

34493528
#ifdef _OS_WINDOWS_
34503529
pkgimage.base = (intptr_t)pkgimg_handle;
34513530
#else
34523531
Dl_info dlinfo;
3453-
if (dladdr((void*)pkgimage.gvars_base, &dlinfo) != 0) {
3454-
pkgimage.base = (intptr_t)dlinfo.dli_fbase;
3455-
}
3456-
else {
3457-
pkgimage.base = 0;
3532+
{
3533+
TracyCZoneN(ctx3, "dladdr", true);
3534+
if (dladdr((void*)pkgimage.gvars_base, &dlinfo) != 0) {
3535+
pkgimage.base = (intptr_t)dlinfo.dli_fbase;
3536+
}
3537+
else {
3538+
pkgimage.base = 0;
3539+
}
3540+
TracyCZoneEnd(ctx3);
34583541
}
34593542
#endif
34603543

3461-
jl_value_t* mod = jl_restore_incremental_from_buf(pkgimg_data, &pkgimage, *plen, depmods, complete);
3462-
3544+
jl_value_t* mod;
3545+
{
3546+
JL_TIMING(PKG_LOADING);
3547+
mod = jl_restore_incremental_from_buf(pkgimg_data, &pkgimage, *plen, depmods, complete);
3548+
}
3549+
TracyCZoneEnd(ctx);
34633550
return mod;
34643551
}
34653552

0 commit comments

Comments
 (0)