AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 410628
Accepted
Alchemist
Alchemist
Asked: 2017-12-14 04:45:55 +0800 CST2017-12-14 04:45:55 +0800 CST 2017-12-14 04:45:55 +0800 CST

CPU 怎么知道有 IO 挂起?

  • 772

我一直iowait在研究顶部实用程序输出中显示的属性,如下所示。

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait一般定义如下:

“这是 CPU 空闲并且有一些 IO 挂起的时间。”

据我了解,一个进程在单个 CPU 上运行。在它被取消调度后,要么因为它已经用完它的时间槽,要么在它被阻塞之后,它最终可以再次在任何一个 CPU 上再次被调度。

在 IO 请求的情况下,将进程置于不间断睡眠的 CPU 负责跟踪iowait时间。其他 CPU 将在其端报告与空闲时间相同的时间,因为它们实际上是空闲的。这个假设正确吗?

此外,假设有一个长 IO 请求(意味着该进程有多次机会被调度但由于 IO 未完成而没有被调度),CPU 怎么知道有“待处理的 IO”?这种信息是从哪里获取的?CPU 怎么能简单地发现某个进程在某个时间进入睡眠状态以完成 IO,因为任何 CPU 都可能使该进程进入睡眠状态。这种“pending IO”的状态是如何确认的?

linux cpu
  • 1 1 个回答
  • 3942 Views

1 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2017-12-14T05:00:28+08:002017-12-14T05:00:28+08:00

    CPU 不知道这些,任务调度程序知道。

    您引用的定义有些误导;当前的procfs(5)联机帮助页有更准确的定义,但需要注意:

    iowait(自 Linux 2.5.41 起)

    (5) 等待 I/O 完成的时间。该值不可靠,原因如下:

    1. CPU 不会等待 I/O 完成;iowait是任务等待 I/O 完成的时间。当一个 CPU 因未完成的任务 I/O 进入空闲状态时,另一个任务将被安排在该 CPU 上。

    2. 在多核 CPU 上,等待 I/O 完成的任务不在任何 CPU 上运行,因此iowait每个 CPU 的 t 都难以计算。

    3. 在某些情况下,此字段中的值可能会减小。

    iowait通常,尝试测量等待 I/O 所花费的时间。它没有被特定的 CPU 跟踪,也不能被跟踪(上面的第 2 点——这也符合您的疑惑)。不过,它是尽可能按CPU测量的。

    任务调度程序“知道”有挂起的 I/O,因为它知道它挂起给定的任务是因为它正在等待 I/O。in_iowait这是在领域中的每个任务跟踪的task_struct;您可以in_iowait在调度程序核心中查找它是如何设置、跟踪和清除的。Brendan Gregg 最近关于 Linux 平均负载的文章包含有用的背景信息。中的iowait条目/proc/stat,即 中的条目,top每当考虑到计时器滴答时就会递增,并且当前进程“开启” CPU 空闲;account_idle_time您可以通过在调度程序的 CPU 时间跟踪代码中查找来看到这一点。

    所以更准确的定义应该是“在没有更好的事情可做的情况下,在这个 CPU 上等待 I/O 所花费的时间”......

    • 33

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve