Skip to content

Commit

Permalink
No public description
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 722767318
  • Loading branch information
Markus Kusano authored and copybara-github committed Feb 3, 2025
1 parent 1752ee0 commit 1024965
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 251 deletions.
47 changes: 23 additions & 24 deletions centipede/runner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,27 +222,24 @@ static void CheckWatchdogLimits() {
const uint64_t batch_start_time = state.batch_start_time;
if (input_start_time == 0 || batch_start_time == 0) return;
const Resource resources[] = {
{
.what = "Per-input timeout",
.units = "sec",
.value = curr_time - input_start_time,
.limit = state.run_time_flags.timeout_per_input,
.failure = kExecutionFailurePerInputTimeout.data(),
},
{
.what = "Per-batch timeout",
.units = "sec",
.value = curr_time - batch_start_time,
.limit = state.run_time_flags.timeout_per_batch,
.failure = kExecutionFailurePerBatchTimeout.data(),
},
{
.what = "RSS limit",
.units = "MB",
.value = GetPeakRSSMb(),
.limit = state.run_time_flags.rss_limit_mb,
.failure = kExecutionFailureRssLimitExceeded.data(),
},
{Resource(
/*.what =*/"Per-input timeout",
/*.units =*/"sec",
/*.value =*/curr_time - input_start_time,
/*.limit =*/state.run_time_flags.timeout_per_input,
/*.failure =*/kExecutionFailurePerInputTimeout.data(), )},
{Resource(
/*.what =*/"Per-batch timeout",
/*.units =*/"sec",
/*.value =*/curr_time - batch_start_time,
/*.limit =*/state.run_time_flags.timeout_per_batch,
/*.failure =*/kExecutionFailurePerBatchTimeout.data(), )},
{Resource(
/*.what =*/"RSS limit",
/*.units =*/"MB",
/*.value =*/GetPeakRSSMb(),
/*.limit =*/state.run_time_flags.rss_limit_mb,
/*.failure =*/kExecutionFailureRssLimitExceeded.data(), )},
};
for (const auto &resource : resources) {
if (resource.limit != 0 && resource.value > resource.limit) {
Expand Down Expand Up @@ -911,10 +908,12 @@ static int MutateInputsFromShmem(BlobSequence &inputs_blobseq,
}
auto blob = inputs_blobseq.Read();
if (!runner_request::IsDataInput(blob)) break;
inputs.push_back({.data = {blob.data, blob.data + blob.size},
.metadata = std::move(metadata)});
inputs.push_back(
MutationInput(/*.data = */ ByteArray(blob.data, blob.data + blob.size),
/*.metadata=*/std::move(metadata)));
input_refs.push_back(
{.data = inputs.back().data, .metadata = &inputs.back().metadata});
MutationInputRef(/*data = */ inputs.back().data,
/*metadata = */ &inputs.back().metadata));
}

if (!callbacks.Mutate(input_refs, num_mutants, [&](ByteSpan mutant) {
Expand Down
28 changes: 14 additions & 14 deletions centipede/runner.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,20 @@ struct GlobalRunnerState {

// Flags.
RunTimeFlags run_time_flags = {
.path_level = std::min(ThreadLocalRunnerState::kBoundedPathLength,
HasIntFlag(":path_level=", 0)),
.use_pc_features = HasFlag(":use_pc_features:"),
.use_dataflow_features = HasFlag(":use_dataflow_features:"),
.use_cmp_features = HasFlag(":use_cmp_features:"),
.callstack_level = HasIntFlag(":callstack_level=", 0),
.use_counter_features = HasFlag(":use_counter_features:"),
.use_auto_dictionary = HasFlag(":use_auto_dictionary:"),
.timeout_per_input = HasIntFlag(":timeout_per_input=", 0),
.timeout_per_batch = HasIntFlag(":timeout_per_batch=", 0),
.stack_limit_kb = HasIntFlag(":stack_limit_kb=", 0),
.rss_limit_mb = HasIntFlag(":rss_limit_mb=", 0),
.crossover_level = HasIntFlag(":crossover_level=", 50),
.skip_seen_features = HasFlag(":skip_seen_features:")};
/*.path_level =*/std::min(ThreadLocalRunnerState::kBoundedPathLength,
HasIntFlag(":path_level=", 0)),
/*.use_pc_features =*/HasFlag(":use_pc_features:"),
/*.use_dataflow_features =*/HasFlag(":use_dataflow_features:"),
/*.use_cmp_features =*/HasFlag(":use_cmp_features:"),
/*.callstack_level =*/HasIntFlag(":callstack_level=", 0),
/*.use_counter_features =*/HasFlag(":use_counter_features:"),
/*.use_auto_dictionary =*/HasFlag(":use_auto_dictionary:"),
/*.timeout_per_input =*/HasIntFlag(":timeout_per_input=", 0),
/*.timeout_per_batch =*/HasIntFlag(":timeout_per_batch=", 0),
/*.stack_limit_kb =*/HasIntFlag(":stack_limit_kb=", 0),
/*.rss_limit_mb =*/HasIntFlag(":rss_limit_mb=", 0),
/*.crossover_level =*/HasIntFlag(":crossover_level=", 50),
/*.skip_seen_features =*/HasFlag(":skip_seen_features:")};

// Returns true iff `flag` is present.
// Typical usage: pass ":some_flag:", i.e. the flag name surrounded with ':'.
Expand Down
12 changes: 8 additions & 4 deletions centipede/runner_result_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,10 @@ TEST(ExecutionResult, WriteThenRead) {
FeatureVec v2{5, 6, 7, 8};
ExecutionMetadata metadata;
metadata.AppendCmpEntry({1, 2, 3}, {4, 5, 6});
ExecutionResult::Stats stats1{.peak_rss_mb = 10};
ExecutionResult::Stats stats2{.peak_rss_mb = 20};
ExecutionResult::Stats stats1;
stats1.peak_rss_mb = 10;
ExecutionResult::Stats stats2;
stats2.peak_rss_mb = 20;
// First input.
EXPECT_TRUE(BatchResult::WriteInputBegin(blobseq));
EXPECT_TRUE(BatchResult::WriteOneFeatureVec(v1.data(), v1.size(), blobseq));
Expand Down Expand Up @@ -103,8 +105,10 @@ TEST(ExecutionResult, WriteIntoFileThenRead) {
// Imitate execution of two inputs.
FeatureVec v1{1, 2, 3};
FeatureVec v2{5, 6, 7, 8};
ExecutionResult::Stats stats1{.peak_rss_mb = 10};
ExecutionResult::Stats stats2{.peak_rss_mb = 20};
ExecutionResult::Stats stats1;
stats1.peak_rss_mb = 10;
ExecutionResult::Stats stats2;
stats2.peak_rss_mb = 20;
ExecutionMetadata metadata;
metadata.AppendCmpEntry({1, 2, 3}, {4, 5, 6});

Expand Down
23 changes: 11 additions & 12 deletions centipede/rusage_profiler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -402,18 +402,17 @@ const RUsageProfiler::Snapshot& RUsageProfiler::TakeSnapshot( //
}
}

Snapshot snapshot{
.id = static_cast<int64_t>(snapshots_.size()),
.title = std::move(title),
.location = loc,
.time = absl::Now(),
.profiler_id = id_,
.profiler_desc = description_,
.timing = snap_timing,
.delta_timing = delta_timing,
.memory = snap_memory,
.delta_memory = delta_memory,
};
Snapshot snapshot(
/*.id =*/static_cast<int64_t>(snapshots_.size()),
/*.title =*/std::move(title),
/*.location =*/loc,
/*.time =*/absl::Now(),
/*.profiler_id =*/id_,
/*.profiler_desc =*/description_,
/*.timing =*/snap_timing,
/*.delta_timing =*/delta_timing,
/*.memory =*/snap_memory,
/*.delta_memory =*/delta_memory);

return snapshots_.emplace_back(std::move(snapshot));
}
Expand Down
155 changes: 77 additions & 78 deletions centipede/rusage_stats.cc
Original file line number Diff line number Diff line change
Expand Up @@ -196,14 +196,14 @@ RUsageTiming RUsageTimingOp( //
const Op<absl::Duration> time_op;
const Op<double> cpu_op;
// clang-format off
return RUsageTiming{
.wall_time = time_op(t1.wall_time, t2.wall_time),
.user_time = time_op(t1.user_time, t2.user_time),
.sys_time = time_op(t1.sys_time, t2.sys_time),
.cpu_utilization = cpu_op(t1.cpu_utilization, t2.cpu_utilization),
.cpu_hyper_cores = cpu_op(t1.cpu_hyper_cores, t2.cpu_hyper_cores),
.is_delta = is_delta,
};
return RUsageTiming(
/*.wall_time =*/ time_op(t1.wall_time, t2.wall_time),
/*.user_time =*/ time_op(t1.user_time, t2.user_time),
/*.sys_time =*/ time_op(t1.sys_time, t2.sys_time),
/*.cpu_utilization =*/ cpu_op(t1.cpu_utilization, t2.cpu_utilization),
/*.cpu_hyper_cores =*/ cpu_op(t1.cpu_hyper_cores, t2.cpu_hyper_cores),
/*.is_delta =*/ is_delta
);
// clang-format on
}

Expand All @@ -226,14 +226,14 @@ RUsageMemory RUsageMemoryOp( //
const RUsageMemory& t1, const RUsageMemory& t2, bool is_delta) {
const Op<MemSize> mem_op;
// clang-format off
return RUsageMemory{
.mem_vsize = mem_op(t1.mem_vsize, t2.mem_vsize),
.mem_vpeak = mem_op(t1.mem_vpeak, t2.mem_vpeak),
.mem_rss = mem_op(t1.mem_rss, t2.mem_rss),
.mem_data = mem_op(t1.mem_data, t2.mem_data),
.mem_shared = mem_op(t1.mem_shared, t2.mem_shared),
.is_delta = is_delta,
};
return RUsageMemory(
/*.mem_vsize =*/ mem_op(t1.mem_vsize, t2.mem_vsize),
/*.mem_vpeak =*/ mem_op(t1.mem_vpeak, t2.mem_vpeak),
/*.mem_rss =*/ mem_op(t1.mem_rss, t2.mem_rss),
/*.mem_data =*/ mem_op(t1.mem_data, t2.mem_data),
/*.mem_shared =*/ mem_op(t1.mem_shared, t2.mem_shared),
/*.is_delta =*/ is_delta
);
// clang-format on
}

Expand Down Expand Up @@ -324,30 +324,30 @@ RUsageTiming RUsageTiming::Zero() { return {}; }

RUsageTiming RUsageTiming::Min() {
// clang-format off
return RUsageTiming{
.wall_time = -absl::InfiniteDuration(),
.user_time = -absl::InfiniteDuration(),
.sys_time = -absl::InfiniteDuration(),
.cpu_utilization = 0.0,
.cpu_hyper_cores = 0.0,
.is_delta = false,
};
return RUsageTiming(
/*.wall_time =*/ -absl::InfiniteDuration(),
/*.user_time =*/ -absl::InfiniteDuration(),
/*.sys_time =*/ -absl::InfiniteDuration(),
/*.cpu_utilization =*/ 0.0,
/*.cpu_hyper_cores =*/ 0.0,
/*.is_delta =*/ false,
);
// clang-format on
}

RUsageTiming RUsageTiming::Max() {
// clang-format off
return RUsageTiming{
.wall_time = absl::InfiniteDuration(),
.user_time = absl::InfiniteDuration(),
.sys_time = absl::InfiniteDuration(),
/*.wall_time =*/ absl::InfiniteDuration(),
/*.user_time =*/ absl::InfiniteDuration(),
/*.sys_time =*/ absl::InfiniteDuration(),
// Theoretical max CPU utilization is 100%, but real-life numbers can go
// just a little higher (the OS scheduler's rounding errors?).
.cpu_utilization = 1.0,
/*.cpu_utilization =*/ 1.0,
// hardware_concurrency() returns the number of hyperthreaded contexts.
.cpu_hyper_cores =
/*.cpu_hyper_cores =*/
static_cast<double>(std::thread::hardware_concurrency()),
.is_delta = false,
/*.is_delta =*/ false,
};
// clang-format on
}
Expand Down Expand Up @@ -382,14 +382,13 @@ RUsageTiming RUsageTiming::Snapshot( //
constexpr double kLinuxSchedCapacityScale = 1024;
cpu_utilization /= kLinuxSchedCapacityScale;
#endif // __APPLE__
return RUsageTiming{
.wall_time = absl::Seconds(wall_time),
.user_time = absl::Seconds(user_time),
.sys_time = absl::Seconds(sys_time),
.cpu_utilization = cpu_utilization,
.cpu_hyper_cores = (user_time + sys_time) / wall_time,
.is_delta = false,
};
return RUsageTiming(
/*.wall_time =*/absl::Seconds(wall_time),
/*.user_time =*/absl::Seconds(user_time),
/*.sys_time =*/absl::Seconds(sys_time),
/*.cpu_utilization =*/cpu_utilization,
/*.cpu_hyper_cores =*/(user_time + sys_time) / wall_time,
/*.is_delta =*/false);
}

std::string RUsageTiming::ShortStr() const {
Expand Down Expand Up @@ -434,14 +433,14 @@ RUsageTiming operator/(const RUsageTiming& t, int64_t div) {
CHECK_NE(div, 0);
// NOTE: Can't use RUsageTimingOp() as this operation is asymmetrical.
// clang-format off
return RUsageTiming{
.wall_time = t.wall_time / div,
.user_time = t.user_time / div,
.sys_time = t.sys_time / div,
.cpu_utilization = t.cpu_utilization / div,
.cpu_hyper_cores = t.cpu_hyper_cores / div,
.is_delta = t.is_delta,
};
return RUsageTiming(
/*.wall_time =*/ t.wall_time / div,
/*.user_time =*/ t.user_time / div,
/*.sys_time =*/ t.sys_time / div,
/*.cpu_utilization =*/ t.cpu_utilization / div,
/*.cpu_hyper_cores =*/ t.cpu_hyper_cores / div,
/*.is_delta =*/ t.is_delta,
);
// clang-format on
}

Expand Down Expand Up @@ -491,27 +490,27 @@ RUsageMemory RUsageMemory::Zero() { return {}; }

RUsageMemory RUsageMemory::Min() {
// clang-format off
return RUsageMemory{
.mem_vsize = std::numeric_limits<int64_t>::min(),
.mem_vpeak = std::numeric_limits<int64_t>::min(),
.mem_rss = std::numeric_limits<int64_t>::min(),
.mem_data = std::numeric_limits<int64_t>::min(),
.mem_shared = std::numeric_limits<int64_t>::min(),
.is_delta = false,
};
return RUsageMemory(
/*.mem_vsize =*/ std::numeric_limits<int64_t>::min(),
/*.mem_vpeak =*/ std::numeric_limits<int64_t>::min(),
/*.mem_rss =*/ std::numeric_limits<int64_t>::min(),
/*.mem_data =*/ std::numeric_limits<int64_t>::min(),
/*.mem_shared =*/ std::numeric_limits<int64_t>::min(),
/*.is_delta =*/ false
);
// clang-format on
}

RUsageMemory RUsageMemory::Max() {
// clang-format off
return RUsageMemory{
.mem_vsize = std::numeric_limits<int64_t>::max(),
.mem_vpeak = std::numeric_limits<int64_t>::max(),
.mem_rss = std::numeric_limits<int64_t>::max(),
.mem_data = std::numeric_limits<int64_t>::max(),
.mem_shared = std::numeric_limits<int64_t>::max(),
.is_delta = false,
};
return RUsageMemory(
/*.mem_vsize =*/ std::numeric_limits<int64_t>::max(),
/*.mem_vpeak =*/ std::numeric_limits<int64_t>::max(),
/*.mem_rss =*/ std::numeric_limits<int64_t>::max(),
/*.mem_data =*/ std::numeric_limits<int64_t>::max(),
/*.mem_shared =*/ std::numeric_limits<int64_t>::max(),
/*.is_delta =*/ false
);
// clang-format on
}

Expand Down Expand Up @@ -560,14 +559,14 @@ RUsageMemory RUsageMemory::Snapshot(const RUsageScope& scope) {
vpeak *= kVPeakUnits;
#endif // __APPLE__
// clang-format off
return RUsageMemory{
.mem_vsize = vsize,
.mem_vpeak = vpeak,
.mem_rss = rss,
.mem_data = data,
.mem_shared = shared,
.is_delta = false,
};
return RUsageMemory(
/*.mem_vsize =*/ vsize,
/*.mem_vpeak =*/ vpeak,
/*.mem_rss =*/ rss,
/*.mem_data =*/ data,
/*.mem_shared =*/ shared,
/*.is_delta =*/ false
);
// clang-format on
}

Expand Down Expand Up @@ -613,14 +612,14 @@ RUsageMemory operator/(const RUsageMemory& m, int64_t div) {
CHECK_NE(div, 0);
// NOTE: Can't use RUsageMemoryOp() as this operation is asymmetrical.
// clang-format off
return RUsageMemory{
.mem_vsize = m.mem_vsize / div,
.mem_vpeak = m.mem_vpeak / div,
.mem_rss = m.mem_rss / div,
.mem_data = m.mem_data / div,
.mem_shared = m.mem_shared / div,
.is_delta = m.is_delta,
};
return RUsageMemory(
/*.mem_vsize =*/ m.mem_vsize / div,
/*.mem_vpeak =*/ m.mem_vpeak / div,
/*.mem_rss =*/ m.mem_rss / div,
/*.mem_data =*/ m.mem_data / div,
/*.mem_shared =*/ m.mem_shared / div,
/*.is_delta =*/ m.is_delta
);
// clang-format on
}

Expand Down
Loading

0 comments on commit 1024965

Please sign in to comment.