Profile pre-dispatch WASM readiness

This commit is contained in:
udo
2026-07-18 05:43:36 +00:00
parent a5ad5042b7
commit 556025a779
6 changed files with 58 additions and 3 deletions
+6
View File
@@ -316,6 +316,12 @@ struct Request {
u64 wasm_workspace_complete_us = 0;
u64 wasm_entry_invoke_us = 0;
u64 wasm_output_collect_us = 0;
u64 wasm_ready_normalize_us = 0;
u64 wasm_ready_mutation_check_us = 0;
u64 wasm_ready_artifact_stat_us = 0;
u64 wasm_ready_freshness_us = 0;
u64 wasm_ready_worker_us = 0;
u32 wasm_ready_check_count = 0;
u64 mem_high = 0;
u64 mem_alloc = 0;
u32 invoke_count = 0;
+4
View File
@@ -581,10 +581,14 @@ int handle_complete(FastCGIRequest& request) {
}
};
f64 ready_phase_started = time_precise();
String entry_unit = compiler_normalize_unit_path(&request, request.params["SCRIPT_FILENAME"]);
request.stats.wasm_ready_normalize_us += (u64)((time_precise() - ready_phase_started) * 1000000.0);
String request_method = to_upper(trim(request.params["REQUEST_METHOD"]));
bool read_request = request_method == "GET" || request_method == "HEAD" || request_method == "OPTIONS";
ready_phase_started = time_precise();
bool stale_mutation = !request.resources.is_cli && !read_request && compiler_unit_needs_recompile(&request, entry_unit);
request.stats.wasm_ready_mutation_check_us += (u64)((time_precise() - ready_phase_started) * 1000000.0);
if(stale_mutation)
{
compiler_prioritize_unit(&request, entry_unit);
+13 -1
View File
@@ -116,17 +116,26 @@ static bool wasm_artifact_exists(Request* context, const String& entry_unit)
return(false);
String wasm_path = context->server->config["BIN_DIRECTORY"] + entry_unit + ".wasm";
struct stat wasm_st;
f64 phase_started = time_precise();
context->stats.wasm_ready_check_count++;
if(stat(wasm_path.c_str(), &wasm_st) != 0 || !S_ISREG(wasm_st.st_mode))
{
context->stats.wasm_ready_artifact_stat_us += (u64)((time_precise() - phase_started) * 1000000.0);
return(false);
}
context->stats.wasm_ready_artifact_stat_us += (u64)((time_precise() - phase_started) * 1000000.0);
// Require the artifact to satisfy the full compiler freshness check. Source
// mtime alone misses runtime/unit ABI changes, setup-template changes, and
// metadata mismatches, which can leave stale wasm with old imports.
bool source_missing = false;
phase_started = time_precise();
if(compiler_unit_needs_recompile(context, entry_unit, &source_missing))
{
context->stats.wasm_ready_freshness_us += (u64)((time_precise() - phase_started) * 1000000.0);
compiler_prioritize_unit(context, entry_unit);
return(compiler_request_can_serve_stale_artifact(context));
}
context->stats.wasm_ready_freshness_us += (u64)((time_precise() - phase_started) * 1000000.0);
if(source_missing)
return(false);
return(true);
@@ -141,7 +150,10 @@ bool wasm_backend_should_handle(Request& request, const String& entry_unit)
return(false);
if(!wasm_artifact_exists(&request, entry_unit))
return(false);
if(wasm_backend_ensure_started(&request) != "")
f64 phase_started = time_precise();
String start_error = wasm_backend_ensure_started(&request);
request.stats.wasm_ready_worker_us += (u64)((time_precise() - phase_started) * 1000000.0);
if(start_error != "")
return(false);
return(true);
}
+23
View File
@@ -1343,6 +1343,12 @@ public:
f64 time_params = 0;
f64 time_input = 0;
f64 time_start = 0;
u64 ready_normalize_us = 0;
u64 ready_mutation_check_us = 0;
u64 ready_artifact_stat_us = 0;
u64 ready_freshness_us = 0;
u64 ready_worker_us = 0;
u32 ready_check_count = 0;
f64 workspace_wall_start = 0;
f64 workspace_cpu_start = 0;
struct rusage thread_runtime_start = {};
@@ -1358,6 +1364,8 @@ public:
void set_perf_snapshot(u64 worker_pid, u64 parent_pid, u64 request_count,
f64 time_init, f64 time_params, f64 time_input, f64 time_start,
u64 ready_normalize_us, u64 ready_mutation_check_us, u64 ready_artifact_stat_us,
u64 ready_freshness_us, u64 ready_worker_us, u32 ready_check_count,
f64 workspace_wall_start, f64 workspace_cpu_start)
{
request_perf.worker_pid = worker_pid;
@@ -1367,6 +1375,12 @@ public:
request_perf.time_params = time_params;
request_perf.time_input = time_input;
request_perf.time_start = time_start;
request_perf.ready_normalize_us = ready_normalize_us;
request_perf.ready_mutation_check_us = ready_mutation_check_us;
request_perf.ready_artifact_stat_us = ready_artifact_stat_us;
request_perf.ready_freshness_us = ready_freshness_us;
request_perf.ready_worker_us = ready_worker_us;
request_perf.ready_check_count = ready_check_count;
request_perf.workspace_wall_start = workspace_wall_start;
request_perf.workspace_cpu_start = workspace_cpu_start;
request_perf.active = true;
@@ -2645,6 +2659,12 @@ private:
response["worker_pid"] = (f64)self->request_perf.worker_pid;
response["parent_pid"] = (f64)self->request_perf.parent_pid;
response["request_count"] = (f64)self->request_perf.request_count;
response["ready_normalize_us"] = (f64)self->request_perf.ready_normalize_us;
response["ready_mutation_check_us"] = (f64)self->request_perf.ready_mutation_check_us;
response["ready_artifact_stat_us"] = (f64)self->request_perf.ready_artifact_stat_us;
response["ready_freshness_us"] = (f64)self->request_perf.ready_freshness_us;
response["ready_worker_us"] = (f64)self->request_perf.ready_worker_us;
response["ready_check_count"] = (f64)self->request_perf.ready_check_count;
if(self->request_perf.time_start > 0 && self->request_perf.time_init > 0)
response["accept_us"] = (f64)((self->request_perf.time_start - self->request_perf.time_init) * 1000000.0);
if(self->request_perf.time_params > 0 && self->request_perf.time_init > 0)
@@ -3883,6 +3903,9 @@ inline WasmResponse wasm_worker_serve(WasmWorker& worker, const Request& request
(u64)((setup_cpu_finished - cpu_started) * 1000000.0) : 0;
workspace.set_perf_snapshot(my_pid, (u64)parent_pid, request.server ? request.server->request_count : 0,
request.stats.time_init, request.stats.time_params, request.stats.time_input, request.stats.time_start,
request.stats.wasm_ready_normalize_us, request.stats.wasm_ready_mutation_check_us,
request.stats.wasm_ready_artifact_stat_us, request.stats.wasm_ready_freshness_us,
request.stats.wasm_ready_worker_us, request.stats.wasm_ready_check_count,
serve_started, cpu_started);
workspace.request_perf.thread_runtime_start = thread_runtime_start;
workspace.request_perf.thread_cpu_start = thread_cpu_start;