0

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

$ 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 是以秒为单位的测量值之间的差异。它有什么问题?如何正确地做到这一点?

4

1 回答 1

0

一方面,我不知道如何解释/proc/schedstat.

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

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

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


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

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

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

于 2021-09-06T20:07:44.997 回答