feat(controller): compute the LSF CPU peak and efficiency fields (bug-1736)
update_job_cpu_stats() (misc.c), run after each usage report: - each host's cpu_rate = CPU-seconds gained / wall seconds since its previous report; the job's cores = the sum over hosts - peak_cpu = highest job cores seen (peak_cpu_time = it rounded, the wire field is an integer); peak_cpu_duration = the interval that set it - avg_cpu_efficiency = cpu_time / elapsed / slots, peak_cpu_efficiency = peak_cpu / slots, mem_efficiency = highest used_mem / rusage[mem] request (job-wide total, per task by default), all in percent aggregate_job_runusage() no longer treats cumulative cpu_time as a peak. New fields host sample_time/cpu_rate and job peak_cpu are appended to the capnp structs (old WAL entries still decode) and copied by merge_job_runusage(), so a promoted standby keeps the rate baselines. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
77b5102b3e
commit
6df644e6d5
8 changed files with 325 additions and 50 deletions
|
|
@ -188,10 +188,12 @@ static job_t* wru_seed_job(uint64_t jobid, uint32_t state)
|
|||
/* ── Real fixture data: 2 hosts' worth of accumulated CPU/mem usage ──────── */
|
||||
|
||||
static xce_host_runusage_t g_wru_host_a = {
|
||||
.host_name = (char*)"wru-host-a", .cpu_time = 1200, .mem_usage = 512.5
|
||||
.host_name = (char*)"wru-host-a", .cpu_time = 1200, .mem_usage = 512.5,
|
||||
.sample_time = 1790000000, .cpu_rate = 1.25f /* bug-1736 */
|
||||
};
|
||||
static xce_host_runusage_t g_wru_host_b = {
|
||||
.host_name = (char*)"wru-host-b", .cpu_time = 900, .mem_usage = 256.25
|
||||
.host_name = (char*)"wru-host-b", .cpu_time = 900, .mem_usage = 256.25,
|
||||
.sample_time = 1790000030, .cpu_rate = 0.5f
|
||||
};
|
||||
static xce_host_runusage_t* g_wru_host_ptrs[2];
|
||||
|
||||
|
|
@ -209,6 +211,7 @@ static xce_job_runusage_t wru_make_test_runusage(void)
|
|||
r.mem_efficiency = 0.75f;
|
||||
r.avg_cpu_efficiency = 0.6f;
|
||||
r.peak_cpu_efficiency = 0.9f;
|
||||
r.peak_cpu = 1.75f; /* bug-1736 */
|
||||
r.num_hosts = 2;
|
||||
|
||||
g_wru_host_ptrs[0] = &g_wru_host_a;
|
||||
|
|
@ -232,14 +235,19 @@ static void wru_assert_runusage_matches(xce_job_runusage_t* got)
|
|||
TEST_ASSERT_EQUAL_FLOAT(0.75f, got->mem_efficiency);
|
||||
TEST_ASSERT_EQUAL_FLOAT(0.6f, got->avg_cpu_efficiency);
|
||||
TEST_ASSERT_EQUAL_FLOAT(0.9f, got->peak_cpu_efficiency);
|
||||
TEST_ASSERT_EQUAL_FLOAT(1.75f, got->peak_cpu); /* bug-1736 */
|
||||
TEST_ASSERT_EQUAL_INT(2, got->num_hosts);
|
||||
TEST_ASSERT_NOT_NULL(got->host_runusage);
|
||||
TEST_ASSERT_EQUAL_STRING("wru-host-a", got->host_runusage[0]->host_name);
|
||||
TEST_ASSERT_EQUAL_INT(1200, got->host_runusage[0]->cpu_time);
|
||||
TEST_ASSERT_EQUAL_FLOAT(512.5, got->host_runusage[0]->mem_usage);
|
||||
TEST_ASSERT_TRUE(got->host_runusage[0]->sample_time == 1790000000);
|
||||
TEST_ASSERT_EQUAL_FLOAT(1.25f, got->host_runusage[0]->cpu_rate);
|
||||
TEST_ASSERT_EQUAL_STRING("wru-host-b", got->host_runusage[1]->host_name);
|
||||
TEST_ASSERT_EQUAL_INT(900, got->host_runusage[1]->cpu_time);
|
||||
TEST_ASSERT_EQUAL_FLOAT(256.25, got->host_runusage[1]->mem_usage);
|
||||
TEST_ASSERT_TRUE(got->host_runusage[1]->sample_time == 1790000030);
|
||||
TEST_ASSERT_EQUAL_FLOAT(0.5f, got->host_runusage[1]->cpu_rate);
|
||||
}
|
||||
|
||||
/* Build a wal_jobstate_t header + trailing Cap'n Proto JobRunusage bytes --
|
||||
|
|
@ -449,7 +457,7 @@ test_wru_apply_committed_entry_merges_without_freeing_live_host(void)
|
|||
* this job would carry. */
|
||||
xce_host_runusage_t update_host = {
|
||||
.host_name = (char*)"wru-live-host", .cpu_time = 999,
|
||||
.mem_usage = 888.0
|
||||
.mem_usage = 888.0, .sample_time = 1790000100, .cpu_rate = 2.5f
|
||||
};
|
||||
xce_host_runusage_t new_host = {
|
||||
.host_name = (char*)"wru-new-host", .cpu_time = 42, .mem_usage = 84.0
|
||||
|
|
@ -460,6 +468,7 @@ test_wru_apply_committed_entry_merges_without_freeing_live_host(void)
|
|||
memset(&r, 0, sizeof(r));
|
||||
r.max_mem = 500.0;
|
||||
r.cpu_time = 250;
|
||||
r.peak_cpu = 3.25f; /* bug-1736 */
|
||||
r.num_hosts = 2;
|
||||
r.host_runusage = host_ptrs;
|
||||
|
||||
|
|
@ -478,6 +487,7 @@ test_wru_apply_committed_entry_merges_without_freeing_live_host(void)
|
|||
TEST_ASSERT_NOT_NULL(got);
|
||||
TEST_ASSERT_EQUAL_FLOAT(500.0, got->max_mem);
|
||||
TEST_ASSERT_EQUAL_INT(250, got->cpu_time);
|
||||
TEST_ASSERT_EQUAL_FLOAT(3.25f, got->peak_cpu); /* bug-1736 */
|
||||
TEST_ASSERT_EQUAL_INT(2, got->num_hosts);
|
||||
|
||||
int live_idx = -1, found_new = 0;
|
||||
|
|
@ -494,6 +504,9 @@ test_wru_apply_committed_entry_merges_without_freeing_live_host(void)
|
|||
"malloc'd pointer)");
|
||||
TEST_ASSERT_EQUAL_INT(999, h->cpu_time);
|
||||
TEST_ASSERT_EQUAL_FLOAT(888.0, h->mem_usage);
|
||||
/* bug-1736: a merged existing host keeps the rate baseline */
|
||||
TEST_ASSERT_TRUE(h->sample_time == 1790000100);
|
||||
TEST_ASSERT_EQUAL_FLOAT(2.5f, h->cpu_rate);
|
||||
} else if (h->host_name != NULL &&
|
||||
strcmp(h->host_name, "wru-new-host") == 0) {
|
||||
found_new = 1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue