{
  "slug": "linux-iowait",
  "term": "Linux iowait",
  "aliases": [
    "iowait",
    "CPU I/O wait"
  ],
  "definition": "Linux iowait is a CPU-time accounting category for idle time attributed to outstanding I/O waits.",
  "note": "The /proc/stat cpu and cpuN lines expose this category in USER_HZ units, alongside other CPU-time categories. The aggregate cpu line combines the per-CPU figures. These are not bytes, completed requests or device-busy time. [proc-stat]\n\nIn Linux v6.12, account_idle_time adds idle time to CPUTIME_IOWAIT when the current runqueue's nr_iowait is positive, otherwise to CPUTIME_IDLE. An I/O-blocked task need not prevent another task from using the CPU, so low iowait does not establish low application I/O latency. [linux-cputime] [proc-stat]\n\nThe documented /proc/stat iowait value can decrease under some conditions, and per-CPU attribution is difficult on multicore systems. A collector should retain this caveat rather than interpret every negative delta as a reboot or silently treat the field as strictly monotonic. [proc-stat]\n\nPSI io.pressure instead tracks intervals with stalled tasks: some includes at least one stalled task; full includes all non-idle tasks stalled together. Its total uses microseconds. CPU iowait, PSI and process byte counters describe different scopes and cannot substitute for one another. [psi]\n\nApplication-level blocked-time analysis is a different measurement. Ousterhout et al. instrumented Spark tasks and simulated scheduling after removing disk or network waits. Their best-case estimate is not obtainable by subtracting host iowait from job runtime. [blocked-time]",
  "status": "shipping",
  "advantages": [],
  "limitations": [
    {
      "text": "A host-wide iowait percentage cannot identify which device or process caused a slow request.",
      "citationIds": [
        "proc-stat",
        "linux-cputime"
      ]
    }
  ],
  "related": [
    "pressure-stall-information",
    "process-io-accounting"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-08",
  "citations": [
    {
      "id": "proc-stat",
      "title": "Linux 6.12: /proc/stat CPU accounting and iowait limitations",
      "url": "https://docs.kernel.org/6.12/filesystems/proc.html#miscellaneous-kernel-statistics-in-proc-stat",
      "accessed": "2026-11-08"
    },
    {
      "id": "linux-cputime",
      "title": "Linux v6.12 kernel/sched/cputime.c: account_idle_time",
      "url": "https://github.com/torvalds/linux/blob/v6.12/kernel/sched/cputime.c#L206-L215",
      "accessed": "2026-11-08"
    },
    {
      "id": "psi",
      "title": "Linux 6.12: Pressure Stall Information",
      "url": "https://docs.kernel.org/6.12/accounting/psi.html",
      "accessed": "2026-11-08"
    },
    {
      "id": "blocked-time",
      "title": "Ousterhout et al. Making Sense of Performance in Data Analytics Frameworks. NSDI 2015, pp. 293-307, section 2.3",
      "url": "https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-ousterhout.pdf",
      "accessed": "2026-11-08"
    }
  ],
  "provenance": [
    "Source synthesis from Linux 6.12 documentation and version-pinned accounting code; no workload benchmark or new host experiment.",
    "The named helper illustrates one implementation path, not every architecture, kernel configuration or distribution patch."
  ]
}
