我试图使用 来iotop
确定 CPU 是否在任何时候都在等待名为 的特定程序的 I/O bwa
(它是下一代序列比对程序)。如果我在启动时iotop
没有指定特定进程(),我会获得所有预期信息,包括和,但我感兴趣的进程不会显示在列表中。如果我随后指定我感兴趣的进程,则会抱怨“内核中未启用 CONFIG_TASK_DELAY_ACCT”。为了合理起见,我在内核配置文件( )中验证了已启用()。-p pid
SWAPIN
IO>
iotop
/boot/config-3.7.10-1.11-desktop
CONFIG_TASK_DELAY_ACCT
CONFIG_TASK_DELAY_ACCT=y
问题:
- 当我知道某个特定进程已启用
iotop
“思考”时,什么原因导致它未启用?CONFIG_TASK_DELAY_ACCT
- 我可以修复它吗?
- 我是否忽略了一些愚蠢的事情?
答案1
布洛克的博客描述了如何使用 Ubuntu 来实现这一点:
编辑
/etc/default/grub
,将“delayacct”作为选项添加到 GRUB_CMDLINE_LINUX_DEFAULT 条目中。如果您尚未修改该行,它将从GRUB_CMDLINE_LINUX_DEFAULT=""
到
GRUB_CMDLINE_LINUX_DEFAULT="delayacct"
运行“sudo update-grub”
- 重新启动,您就可以开始了。
答案2
更新:
从延迟会计内核文档:
启动时默认禁用延迟记账。要启用,请添加:
delayacct
内核启动选项。或者,使用
sysctl kernel.task_delayacct
在运行时切换状态。但请注意,只有在启用后启动的任务才会有delayacct
信息。
形式iotop-c
手册页:
从 Linux 内核 5.14.x 开始,
task_delayacct
可在运行时配置,默认设置为关闭。此设置可以在交互模式下通过 Ctrl-T 快捷键更改。在批处理模式下,当设置为 OFF 时会打印警告。从命令行可以通过以下方式启用此功能:$ sudo sysctl kernel.task_delayacct=1
并再次被禁用:
$ sudo sysctl kernel.task_delayacct=0
当不使用此程序或其他监控程序时,建议关闭此选项,因为启用它会对系统性能产生一定影响。
答案3
扩展了以下精彩的答案和解释@Irfan Latif,我将其用作 zsh 别名:
alias iotopd='bash -c "sudo sysctl kernel.task_delayacct=1 && sudo iotop ; sudo sysctl kernel.task_delayacct=0"'
请注意 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
答案4
您可以通过发出以下命令简单地运行它而无需重新启动:
sysctl kernel.task_delayacct=1