Skip to the content.

EEVDF 用户态实验

这个实验不直接读取内核里的 lageligiblevirtual deadline,而是从用户态去观察一个更容易看到的结果:

看短任务每次被唤醒后,实际要等多久才能开始继续执行。

这对应 EEVDF 在 fair.c 里的两个核心条件:

  1. task 必须是 eligible
  2. 在 eligible 的任务里,选 virtual deadline 最早的

对于“经常睡眠、每次只做一点点事”的任务,用户态最容易观察到的效果通常是:

运行

./eevdf-demo.out 10 1 20000 500 0 0

参数含义:

程序会创建两个 SCHED_OTHER 线程:

观察

程序启动后会直接打印两个线程的真实 tid 和可复制的 /proc/<tid>/sched 命令,例如:

thread[1] observe: watch -n 0.2 "grep -E 'se\.|vruntime|deadline|slice|sum_exec_runtime|nr_switches|nr_voluntary_switches|nr_involuntary_switches' /proc/12345/sched"

你可以重点看:

输出怎么理解

周期线程会定期打印:

thread[1] iter=40 wake_latency=31us cpu_runtime=504us

意思是:

最后会打印汇总:

summary:
  periodic thread: samples=500 period=20000us work=500us
  wake latency us: min=8 avg=24.3 p50=19 p95=61 p99=115 max=310
  wake latency buckets: >100us=3 >500us=0 >1000us=0

建议对照

1. 默认情况

./eevdf-demo.out 10 1 20000 500 0 0

先建立基线。

2. 周期任务更“交互式”

./eevdf-demo.out 10 1 10000 200 0 0

更短的工作、更频繁的周期,一般更像交互/短请求任务。

3. 提高 hog 权重

./eevdf-demo.out 10 1 20000 500 -5 0

这会让 hog 更重。短任务通常仍然能跑,但 wake latency 可能会变差。

4. 降低周期任务权重

./eevdf-demo.out 10 1 20000 500 0 5

这会让周期任务自己更轻,延迟往往会明显变差。

这个实验最想说明什么

用户态最容易看到的就是:

局限

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。