ablog

不器用で落着きのない技術者のメモ

iowait について

iowait の時間って、I/O要求を出しているプロセスは Disk Sleep しているという理解でいいんだろうか。
ちょっとわからなくなってきた。

  • linux-2.6/kernel/sched.c
/*
 * Account for idle time.
 * @cputime: the cpu time spent in idle wait
 */
void account_idle_time(cputime_t cputime)
{
        struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
        cputime64_t cputime64 = cputime_to_cputime64(cputime);
        struct rq *rq = this_rq();

        if (atomic_read(&rq->nr_iowait) > 0)
                cpustat->iowait = cputime64_add(cpustat->iowait, cputime64);
        else
                cpustat->idle = cputime64_add(cpustat->idle, cputime64);
}

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20751&forum=10
このへんに書いてますが、断片的なのでまとめます。

・I/O wait はidleの一種です。
・CPUがidleであった時間のうち、I/Oが進行中であった時間は I/O wait として
 記録されます。idle として記録されているのはそれ以外の残りの時間です。
・「I/Oが進行中であった時間」とは、I/O待ちで休止しているプロセスが
 ひとつでも存在していた時間のことです。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29121&forum=10

iowaitは、 CPUがアイドル状態で、システムに未処理のディスク入出力要求があった時間の割合を意味しますが、iowaitの状態であれば、CPUを必要とするプロセスが他にある場合には、そのプロセスがCPUを使用することが可能です。

つまり、iowaitが98%であってもCPUの負荷が高い状態ではありません。
一般的に、usとsyの列の値を足した値をCPU使用率と見ます。

そのため、iowaitが98%であることだけでは業務への影響が大きいとは言えません。

http://www.infosia.co.jp/posts/73

iowaitは、 CPUがアイドル状態で、システムに未処理のディスク入出力要求があった時間の割合を意味しますが、iowaitの状態であれば、CPUを必要とするプロセスが他にある場合には、そのプロセスがCPUを使用することが可能です。

つまり、iowaitが98%であってもCPUの負荷が高い状態ではありません。
一般的に、usとsyの列の値を足した値をCPU使用率と見ます。

http://capsulecorp.studio-web.net/blog/00000001/diary.cgi

システムコール発行したらコンテキストスイッチが発生してスリープし、TASK_UNINTERRUPTIBLE で Disk Sleep する。CPU が空いてるのに、I/O要求が残っている場合に iowait としてカウントされるということだと思う。