【发布时间】: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