帮助文档:https://linuxman7.com/linux/man-pages/man1/perf-sched.1.html
下面内容里
- Runtime,意思是 time that a task spent actually running on the CPU
- Switchs(count),number of times a delay was calculated,实际意思,就是被调度了多少次。
- delay(time that a task was ready to run but was kept waiting).
perf sched latency-i perf.data.sche---------------------------------------------------------------------------------------Task|Runtime ms|Switches|Avg delay ms|Max delay ms---------------------------------------------------------------------------------------io_context_pool:(4)|0.553ms|11|avg:2222.615ms|max:24448.340ms msgr-worker-1:(4)|2.236ms|33|avg:29.165ms|max:961.821ms log:(4)|1.304ms|76|avg:26.333ms|max:1000.036ms safe_timer:(8)|4.984ms|100|avg:20.010ms|max:1000.021ms CPU1/KVM:3875313|14626.947ms|6313|avg:0.031ms|max:0.384ms CPU0/KVM:3875312|15178.075ms|5454|avg:0.031ms|max:0.101ms比如上面这个数据里:CPU 0/KVM:3875312,运行的时间是15178.075ms,被调度的次数是5454,那相当于每次运行时间是大约2.8ms。
这个值2.8ms和什么有关系呢?为什么当前这个每次运行的时间是大约2.8ms呢?
1, 可能和自身的工作有关系。当前task是否cpu-bound类型?
2,可能和当前主机的负载有关系。当前系统cpu-bound的任务是否比较多?
3,可能和某些系统参数有关系,比如min_granularity_ns,如果这个设置为3000000,那么每个task的平均每次运行时间肯定就大于3ms。
4,其他原因。
sched_min_granularity_ns 参数用于定义 Linux 内核调度器中任务在被抢占之前允许运行的最小时间量。在5.14这个版本换成了:wakeup_granularity_ns
最小运行时间:它设定了一个任务在 CPU 上运行的最小持续时间(以纳秒为单位),即使有其他更高优先级的任务准备运行,当前任务也至少会运行这么长时间。
减少上下文切换开销:通过确保任务不会被过快地频繁切换,它有助于减少不必要的上下文切换开销。对于运行时间很短的任务,如果切换过于频繁,上下文切换本身的开销可能会超过任务实际执行的开销。
平衡延迟与吞吐量:较高的 sched_min_granularity_ns 值可以提高系统的整体吞吐量(因为减少了上下文切换),但可能会增加交互式任务的延迟。较低的值则可能提高响应速度,但会增加上下文切换开销,从而降低整体吞吐量。
migration_cost_ns 参数定义了 Linux 内核调度器在将一个任务从一个 CPU 迁移到另一个 CPU 时,所估计的开销(以纳秒为单位)。
估算迁移成本:它代表了调度器在进行负载均衡决策时,认为将一个任务从当前 CPU 移动到另一个 CPU 所需的时间成本。这个成本主要包括 CPU 缓存失效、TLB(Translation Lookaside Buffer)失效以及其他与处理器状态相关的开销。
影响负载均衡决策:
当调度器需要将任务从一个繁忙的 CPU 迁移到空闲或负载较低的 CPU 时,它会权衡迁移带来的潜在性能提升与 migration_cost_ns 所代表的迁移开销。
如果迁移成本过高,调度器可能会选择不迁移任务,即使目标 CPU 看起来更空闲,因为它认为迁移带来的性能损失会大于负载均衡的收益。
避免“乒乓效应”:通过引入这个成本,调度器可以避免任务在不同 CPU 之间过于频繁地来回迁移(即“乒乓效应”),这种频繁迁移会因为持续的缓存失效而导致性能下降。