为什么 iotop 显示“?err”

为什么 iotop 显示“?err”

当我运行时iotop,第二列“PRIO”?err随处显示。

在此输入图像描述

这是什么意思?我在手册页中没有找到任何关于错误的提及。

我正在使用自定义编译的内核。难道是我的内核中缺少某些选项吗?我如何找到哪一个?

编辑

我的内核中有所有必需的选项:

CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_VM_EVENT_COUNTERS=y

答案1

如何查找 iotop 需要哪些内核选项?在手册页中:

CONFIG_TASK_DELAY_ACCT 和 CONFIG_TASK_IO_ACCOUNTING 选项需要在 Linux 内核构建配置中启用,这些选项取决于 CONFIG_TASKSTATS。

换句话说,作为 make menuconfig 菜单(我的 5.4 的)的一部分,在 CPU/任务时间和统计统计子菜单下,您应该检查Export task/process statistics through netlink然后Enable per-task delay accounting以及Enable per-task storage I/O accounting

检查 CONFIG_VM_EVENT_COUNTERS() 也没什么坏处,Enable VM event counters for /proc/vmstat in the General menu为什么?哈,因为 iotop 包中有一些名为 vmstat.c 的文件…所以…以防万一…

补充一点,归根结底,如果缺少任何强制 CONFIG 选项,iotop 应该在运行时抱怨。

我无法判断这在较新的内核下是否仍然有效,但是在我的 5.4 上,可能由于一些显着的开销,尽管 CONFIG_TASK_DELAY_ACCT = y,每个任务的延迟计算不会自动激活。
为了真正启用每个任务的延迟计算,您还需要添加delayacct到内核命令行中。


现在关于显示的问题?err: 我猜测恩诅咒(iotop 所依赖的 GUI 工具包)承担部分责任,因为该库通常显示为当前语言设置中未定义的问号字符。
因此,要么您的区域设置不匹配,要么…… PRIO 值在某种程度上无法打印。

顺便说一句,您会使用线程 IRQ 的 IOW 运行 SCHED_RR 吗?我可以承认,在任何线程实时调度的情况下,我几乎无法弄清楚 get_ioprio_from_sched 函数(在 ioprio.c 中)的输出。 (因为,在这种情况下,nice值毫无意义(即使ps不尝试显示它),因此ioprio-nice,顺便说一句,返回值取决于ioprio_nice。)

inline int get_ioprio_from_sched(pid_t pid) {
    int scheduler=sched_getscheduler(pid);
    int nice=getpriority(PRIO_PROCESS,pid);
    int ioprio_nice=(nice+20)/5;

    if (scheduler==SCHED_FIFO||scheduler==SCHED_RR)
        return (IOPRIO_CLASS_RT<<IOPRIO_CLASS_SHIFT)+ioprio_nice;
    if (scheduler==SCHED_IDLE)
        return IOPRIO_CLASS_IDLE<<IOPRIO_CLASS_SHIFT;
    return (IOPRIO_CLASS_BE<<IOPRIO_CLASS_SHIFT)+ioprio_nice;
}

相关内容