iotop 抱怨“CONFIG_TASK_DELAY_ACCT 未在内核中启用”仅针对特定进程

Mar*_*ert 38 linux unix io top

我试图用它来iotop确定 CPU 是否在任何时候等待名为bwa(它是下一代序列对齐程序)的特定程序的 I/O。如果我开始时iotop没有指定特定进程 ( ),我会获得所有预期信息,包括和,但我感兴趣的进程不会显示在列表中。如果我随后指定我感兴趣的进程,则会抱怨“内核中未启用 CONFIG_TASK_DELAY_ACCT”。为了保持理智,我在我的内核配置文件 ( )中验证了已启用 ( )。-p pidSWAPINIO>iotop/boot/config-3.7.10-1.11-desktopCONFIG_TASK_DELAY_ACCTCONFIG_TASK_DELAY_ACCT=y

问题:

  1. 当我知道特定进程已启用时,什么可能导致iotopthink未启用?CONFIG_TASK_DELAY_ACCT
  2. 我可以修复它吗?
  3. 我是不是忽略了一些愚蠢的事情?

小智 27

Brock 的博客描述了如何使用 Ubuntu 来做到这一点:

\n\n
    \n
  1. 编辑/etc/default/grub,将 \xe2\x80\x9cdelayacct\xe2\x80\x9d 作为选项添加到 GRUB_CMDLINE_LINUX_DEFAULT 条目。如果您没有\xe2\x80\x99t 已经修改了该行,它将来自

    \n\n
    GRUB_CMDLINE_LINUX_DEFAULT=""\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    \n\n
    GRUB_CMDLINE_LINUX_DEFAULT="delayacct"\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 运行 \xe2\x80\x9csudo update-grub\xe2\x80\x9d

  4. \n
  5. 重新启动,你应该可以开始了
  6. \n
\n

  • 仅供参考,这是更改默认值的[内核提交](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e4042ad492357fa995921376462b04a025dd53b6),其中表示“假设这个东西实际上用得不多;默认禁用它并避免分配和跟踪 task_delay_info 结构。taskstats 已更改为仍然报告常规 sched 和 sched_info,并且仅跳过缺少的 task_delay_info 字段,而不是不报告任何内容。”那么也许iotop现在需要使用taskstats? (18认同)

Irf*_*tif 27

更新:

来自延迟会计内核文档

默认情况下,延迟记帐在启动时处于禁用状态。要启用,请添加:

delayacct
Run Code Online (Sandbox Code Playgroud)

到内核​​启动选项。或者,用于sysctl kernel.task_delayacct在运行时切换状态。但请注意,只有启用它后启动的任务才会有delayacct信息。

表单iotop-c手册页

从 Linux 内核 5.14.x 开始,task_delayacct可在运行时配置并默认设置为关闭。可以在交互模式下通过 Ctrl-T 快捷键更改此设置。在批处理模式下,当设置为“关闭”时,会打印一条警告。从命令行可以通过以下方式启用:

$ sudo sysctl kernel.task_delayacct=1

并再次禁用:

$ sudo sysctl kernel.task_delayacct=0

建议在不使用此或其他监控程序时关闭此选项,因为启用后它会对系统性能产生一些影响。


小智 5

扩展@Irfan Latif的精彩答案和解释,我将其用作 zsh 别名:

alias iotopd='bash -c "sudo sysctl kernel.task_delayacct=1 && sudo iotop ; sudo sysctl kernel.task_delayacct=0"'
Run Code Online (Sandbox Code Playgroud)

请注意 ; 在 iotop 之后,因为它将在每次退出时运行,而不仅仅是成功的退出。

此别名将设置内核参数,运行命令,然后将其设置回 0。如果您仅在单个会话中运行它,则很有用,但对于多个用户来说将是一个痛苦。

您还可以将其作为 shell 脚本运行,这很有用,因为它会在退出时捕获。

#!/bin/bash

# This script enables task delay accounting in the Linux kernel, runs iotop,
# then on exit sets task_delayacct back to 0.

# Disable task delay accounting when the script exits
disable_task_delayacct() {
  sudo sysctl kernel.task_delayacct=0
}

# Trap the EXIT signal to call the disable_task_delayacct function
trap 'disable_task_delayacct' EXIT

# Enable task delay accounting
sudo sysctl kernel.task_delayacct=1

# Run iotop with administrative privileges
sudo iotop
Run Code Online (Sandbox Code Playgroud)