[CWS] Add configurable RT scheduling for ring buffer reader thread#48854
[CWS] Add configurable RT scheduling for ring buffer reader thread#48854
Conversation
Files inventory check summaryFile checks results against ancestor 00ba5786: Results for datadog-agent_7.79.0~devel.git.473.2fdead3.pipeline.106413747-1_amd64.deb:No change detected |
Static quality checks✅ Please find below the results from static quality gates Successful checksInfo
15 successful checks with minimal change (< 2 KiB)
On-wire sizes (compressed)
|
Regression DetectorRegression Detector ResultsMetrics dashboard Baseline: 118f309 Optimization Goals: ✅ No significant changes detected
|
| perf | experiment | goal | Δ mean % | Δ mean % CI | trials | links |
|---|---|---|---|---|---|---|
| ➖ | docker_containers_cpu | % cpu utilization | +1.53 | [-1.61, +4.67] | 1 | Logs |
Fine details of change detection per experiment
| perf | experiment | goal | Δ mean % | Δ mean % CI | trials | links |
|---|---|---|---|---|---|---|
| ➖ | docker_containers_cpu | % cpu utilization | +1.53 | [-1.61, +4.67] | 1 | Logs |
| ➖ | tcp_syslog_to_blackhole | ingress throughput | +0.71 | [+0.55, +0.86] | 1 | Logs |
| ➖ | quality_gate_metrics_logs | memory utilization | +0.68 | [+0.44, +0.91] | 1 | Logs bounds checks dashboard |
| ➖ | otlp_ingest_logs | memory utilization | +0.41 | [+0.31, +0.52] | 1 | Logs |
| ➖ | ddot_logs | memory utilization | +0.36 | [+0.29, +0.43] | 1 | Logs |
| ➖ | ddot_metrics_sum_delta | memory utilization | +0.28 | [+0.10, +0.46] | 1 | Logs |
| ➖ | quality_gate_idle | memory utilization | +0.18 | [+0.13, +0.23] | 1 | Logs bounds checks dashboard |
| ➖ | file_to_blackhole_500ms_latency | egress throughput | +0.13 | [-0.26, +0.52] | 1 | Logs |
| ➖ | ddot_metrics | memory utilization | +0.04 | [-0.15, +0.23] | 1 | Logs |
| ➖ | file_to_blackhole_0ms_latency | egress throughput | +0.03 | [-0.47, +0.52] | 1 | Logs |
| ➖ | file_to_blackhole_1000ms_latency | egress throughput | +0.02 | [-0.42, +0.46] | 1 | Logs |
| ➖ | uds_dogstatsd_to_api_v3 | ingress throughput | +0.01 | [-0.19, +0.22] | 1 | Logs |
| ➖ | tcp_dd_logs_filter_exclude | ingress throughput | +0.01 | [-0.10, +0.12] | 1 | Logs |
| ➖ | uds_dogstatsd_to_api | ingress throughput | -0.00 | [-0.21, +0.20] | 1 | Logs |
| ➖ | file_to_blackhole_100ms_latency | egress throughput | -0.01 | [-0.14, +0.11] | 1 | Logs |
| ➖ | ddot_metrics_sum_cumulativetodelta_exporter | memory utilization | -0.04 | [-0.26, +0.19] | 1 | Logs |
| ➖ | file_tree | memory utilization | -0.10 | [-0.16, -0.05] | 1 | Logs |
| ➖ | docker_containers_memory | memory utilization | -0.16 | [-0.25, -0.08] | 1 | Logs |
| ➖ | ddot_metrics_sum_cumulative | memory utilization | -0.30 | [-0.44, -0.16] | 1 | Logs |
| ➖ | uds_dogstatsd_20mb_12k_contexts_20_senders | memory utilization | -0.46 | [-0.51, -0.40] | 1 | Logs |
| ➖ | quality_gate_idle_all_features | memory utilization | -0.57 | [-0.61, -0.54] | 1 | Logs bounds checks dashboard |
| ➖ | otlp_ingest_metrics | memory utilization | -0.79 | [-0.94, -0.63] | 1 | Logs |
| ➖ | quality_gate_logs | % cpu utilization | -2.76 | [-4.41, -1.12] | 1 | Logs bounds checks dashboard |
Bounds Checks: ✅ Passed
| perf | experiment | bounds_check_name | replicates_passed | observed_value | links |
|---|---|---|---|---|---|
| ✅ | docker_containers_cpu | simple_check_run | 10/10 | 715 ≥ 26 | |
| ✅ | docker_containers_memory | memory_usage | 10/10 | 273.81MiB ≤ 370MiB | |
| ✅ | docker_containers_memory | simple_check_run | 10/10 | 680 ≥ 26 | |
| ✅ | file_to_blackhole_0ms_latency | memory_usage | 10/10 | 0.19GiB ≤ 1.20GiB | |
| ✅ | file_to_blackhole_0ms_latency | missed_bytes | 10/10 | 0B = 0B | |
| ✅ | file_to_blackhole_1000ms_latency | memory_usage | 10/10 | 0.23GiB ≤ 1.20GiB | |
| ✅ | file_to_blackhole_1000ms_latency | missed_bytes | 10/10 | 0B = 0B | |
| ✅ | file_to_blackhole_100ms_latency | memory_usage | 10/10 | 0.19GiB ≤ 1.20GiB | |
| ✅ | file_to_blackhole_100ms_latency | missed_bytes | 10/10 | 0B = 0B | |
| ✅ | file_to_blackhole_500ms_latency | memory_usage | 10/10 | 0.21GiB ≤ 1.20GiB | |
| ✅ | file_to_blackhole_500ms_latency | missed_bytes | 10/10 | 0B = 0B | |
| ✅ | quality_gate_idle | intake_connections | 10/10 | 3 = 3 | bounds checks dashboard |
| ✅ | quality_gate_idle | memory_usage | 10/10 | 173.35MiB ≤ 181MiB | bounds checks dashboard |
| ✅ | quality_gate_idle_all_features | intake_connections | 10/10 | 3 = 3 | bounds checks dashboard |
| ✅ | quality_gate_idle_all_features | memory_usage | 10/10 | 489.49MiB ≤ 550MiB | bounds checks dashboard |
| ✅ | quality_gate_logs | intake_connections | 10/10 | 4 ≤ 6 | bounds checks dashboard |
| ✅ | quality_gate_logs | memory_usage | 10/10 | 202.95MiB ≤ 220MiB | bounds checks dashboard |
| ✅ | quality_gate_logs | missed_bytes | 10/10 | 0B = 0B | bounds checks dashboard |
| ✅ | quality_gate_metrics_logs | cpu_usage | 10/10 | 340.90 ≤ 2000 | bounds checks dashboard |
| ✅ | quality_gate_metrics_logs | intake_connections | 10/10 | 4 ≤ 6 | bounds checks dashboard |
| ✅ | quality_gate_metrics_logs | memory_usage | 10/10 | 410.04MiB ≤ 475MiB | bounds checks dashboard |
| ✅ | quality_gate_metrics_logs | missed_bytes | 10/10 | 0B = 0B | bounds checks dashboard |
Explanation
Confidence level: 90.00%
Effect size tolerance: |Δ mean %| ≥ 5.00%
Performance changes are noted in the perf column of each table:
- ✅ = significantly better comparison variant performance
- ❌ = significantly worse comparison variant performance
- ➖ = no significant change in performance
A regression test is an A/B test of target performance in a repeatable rig, where "performance" is measured as "comparison variant minus baseline variant" for an optimization goal (e.g., ingress throughput). Due to intrinsic variability in measuring that goal, we can only estimate its mean value for each experiment; we report uncertainty in that value as a 90.00% confidence interval denoted "Δ mean % CI".
For each experiment, we decide whether a change in performance is a "regression" -- a change worth investigating further -- if all of the following criteria are true:
-
Its estimated |Δ mean %| ≥ 5.00%, indicating the change is big enough to merit a closer look.
-
Its 90.00% confidence interval "Δ mean % CI" does not contain zero, indicating that if our statistical model is accurate, there is at least a 90.00% chance there is a difference in performance between baseline and comparison variants.
-
Its configuration does not mark it "erratic".
CI Pass/Fail Decision
✅ Passed. All Quality Gates passed.
- quality_gate_idle_all_features, bounds check memory_usage: 10/10 replicas passed. Gate passed.
- quality_gate_idle_all_features, bounds check intake_connections: 10/10 replicas passed. Gate passed.
- quality_gate_idle, bounds check intake_connections: 10/10 replicas passed. Gate passed.
- quality_gate_idle, bounds check memory_usage: 10/10 replicas passed. Gate passed.
- quality_gate_logs, bounds check missed_bytes: 10/10 replicas passed. Gate passed.
- quality_gate_logs, bounds check memory_usage: 10/10 replicas passed. Gate passed.
- quality_gate_logs, bounds check intake_connections: 10/10 replicas passed. Gate passed.
- quality_gate_metrics_logs, bounds check memory_usage: 10/10 replicas passed. Gate passed.
- quality_gate_metrics_logs, bounds check missed_bytes: 10/10 replicas passed. Gate passed.
- quality_gate_metrics_logs, bounds check intake_connections: 10/10 replicas passed. Gate passed.
- quality_gate_metrics_logs, bounds check cpu_usage: 10/10 replicas passed. Gate passed.
Picks up RT scheduling support for the ring buffer reader goroutine (SchedPolicy/SchedPriority fields in RingBufferOptions).
…g keys These new keys under event_monitoring_config.event_stream allow configuring a realtime scheduling policy for the ring buffer reader thread. Disabled by default (empty policy, priority 0).
Add EventStreamSchedulingPolicy and EventStreamSchedulingPriority to the security probe config. Validation rejects invalid policy strings, priorities outside 1-99, and mismatched policy/priority settings.
When event_stream.scheduling_policy is configured, convert the policy string to the unix constant, set up an ErrChan with a drain goroutine for warning on sched_setscheduler failures, and pass both policy and priority to ebpf-manager's RingBufferOptions.
…essages Align error messages in sanitize() with the full config key path so users can find the exact parameter to fix.
648e7c8 to
2fdead3
Compare
|
This pull request has been automatically marked as stale because it has not had activity in the past 15 days. It will be closed in 30 days if no further activity occurs. If this pull request is still relevant, adding a comment or pushing new commits will keep it open. Also, you can always reopen the pull request if you missed the window. Thank you for your contributions! |
What does this PR do?
Adds a configurable realtime scheduling policy (
SCHED_FIFOorSCHED_RR) for the OS thread running the eBPF ring buffer reader goroutine in the eventmonitor module.Motivation
Under heavy syscall load, the ring buffer reader goroutine can be starved by the kernel's default CFS scheduler, causing the ring buffer to fill and security events to be dropped. By applying a realtime scheduling policy to the reader thread, it gets priority over normal workloads, reducing event loss and improving runtime security coverage.
Describe how you validated your changes
TestSanitizeSchedulingConfig, 9 cases covering valid/invalid policy and priority combinations)CAP_SYS_NICEis missing,sched_setattrfails and the reader continues with default scheduling, logging a warning viaErrChanAdditional Notes
RingBufferOptions)event_monitoring_config.event_stream.scheduling_policy(string, default"") andevent_monitoring_config.event_stream.scheduling_priority(int, default0)CAP_SYS_NICEin containerized environments when enabled