【问题标题】:How to get delta percentage from /proc/schedstat如何从 /proc/schedstat 获取增量百分比
【发布时间】:2021-09-06 12:39:50
【问题描述】:

我正在尝试以百分比限制节点 CFS 调度程序。为此,我从/proc/schedstat 读取 2 个值 2 次(忽略时间片),它具有以下格式:

$ cat /proc/schedstat
version 15
timestamp 4297299139
cpu0 0 0 0 0 0 0 1145287047860 105917480368 8608857
                 CpuTime       RunqTime  

所以我从文件中读取,休眠一段时间,再次读取,计算经过的时间和值之间的增量,然后使用以下代码计算百分比:

cputTime := float64(delta.CpuTime) / delta.TimeDelta / 10000000
runqTime := float64(delta.RunqTime) / delta.TimeDelta / 10000000
percent := runqTime

诀窍是百分比可能是 2000%

我假设 runqtime 是增量的,并以纳秒表示,所以我将它除以 10^7(使其达到 0-100% 范围),timedelta 是以秒为单位的测量值之间的差异。它有什么问题?如何正确地做到这一点?

【问题讨论】:

  • this 您要计算的是什么?
  • @Olivier 想象一辆正在驾驶的汽车。在 t=0sec 时,它位于点 x=1km。在点 t=2 秒处,它变为点 x=5 公里。然后我可以计算它的速度,它的 (5-1)/2 = 2 km/s。然后我就有了光速,没有什么能超过它。所以 2 km/s / 300000 = 0,000006667% 这是我要计算的百分比。在光速的情况下,我每 1 秒有 MAX 增量变化,我相信是 10^9 纳秒
  • @Olivier 请不要添加误导性标签
  • @Olivier 我的问题与从 /proc/schedstat 文件中解析数据有关,该文件来自 linux 内核......请从头开始重新阅读问题
  • @LeGEC 文档指出,以前它们是 jiffies,现在它们用 nanos 表示,here we have an answer,但这不起作用。我正在以 3 秒的间隔读取(我也精确地测量了这个间隔)并且 delta 声明它在调度程序运行队列上花费的时间比 3 秒多得多,比如 delta 可能是 60 秒,即 2000%

标签: linux go linux-kernel scheduler cfs


【解决方案1】:

一方面,我不知道如何解释/proc/schedstat 的输出。

您确实引用了一个 unix.stackexchange 问题的答案,并带有指向 LKML 中的邮件的链接,其中提到了文档的可能补丁。

但是,“schedstat”这个词在我的本地man proc 页面和我可以在互联网上找到的man proc 的副本中可疑地缺失。实际上,在 Google 上搜索 schedstat 时,我得到的结果要么没有提到“schedstat”这个词(例如:我得到了手册页副本的链接,其中提到了“sched”和“stat”),或者非权威的 cmets(有趣的事实:其中一些引用 stackexchange 上的答案作为参考......)

所以目前:如果我必须真正理解输出中的内容,我想我会尝试阅读我的内核版本的代码。


至于“你如何计算增量?”,我理解你打算做什么,我想到的更像是“你写了什么代码来做它?”。

通过在我的机器上循环运行cat /proc/schedstat; sleep 1,我看到“时间戳”条目在每次迭代中增加了约 250 个单位(所以老实说,我不能说该字段的底层单位是什么...... )。
计算delta.TimeDelta:你使用那个字段吗?或者你有两个time.Now() 的实例?

其他增量不那么模棱两可了,我想你拿了你看到的计数器之间的差异 :)
请注意,在我主要空闲的机器上,我有时会在这些计数器上看到高于 10^9 的增量。再说一遍:我不知道如何解释这些数字。

【讨论】:

  • 为了计算时间增量,我使用了 2 个 time.Now() 实例;要计算 runq delta,我采用 cat /proc/schedstat; sleep 1; cat /proc/schedstat,如果您在机器上运行 kubernetes 集群,并且有很多 pod 正在节流,并且 LoadAverage 很大 - 您可能会注意到 /proc/schedstat runq 时间读数的差异可能更大超过 10^9 纳秒
  • 在闲置的课程机器上,您在后续阅读之间会有小的差异。我假设 delta 不能大于实际经过的时间,所以我可以将其映射到 0-100% 范围,但这似乎不是真的,我想问如何解释它呢?
  • 好吧,我想我们达成了一致 :)
  • that or : 寻找其他方法来衡量调度程序的活动。
猜你喜欢
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2022-10-31
  • 2021-11-28
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多