![为什么 iotop 显示“?err”](https://linux22.com/image/204832/%E4%B8%BA%E4%BB%80%E4%B9%88%20iotop%20%E6%98%BE%E7%A4%BA%E2%80%9C%EF%BC%9Ferr%E2%80%9D.png)
答案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;
}