Ответ 1
Я думаю, что iowait/irq/softirq не учитываются в одном из первых четырех чисел. Вы можете увидеть комментарий irqtime_account_process_tick в коде ядра для более подробной информации:
(для Linux kernel 4.1.1)
2815 * Tick demultiplexing follows the order
2816 * - pending hardirq update <-- this is irq
2817 * - pending softirq update <-- this is softirq
2818 * - user_time
2819 * - idle_time <-- iowait is included in here, discuss below
2820 * - system time
2821 * - check for guest_time
2822 * - else account as system_time
Для обработки времени простоя, см. функцию account_idle_time:
2772 /*
2773 * Account for idle time.
2774 * @cputime: the cpu time spent in idle wait
2775 */
2776 void account_idle_time(cputime_t cputime)
2777 {
2778 u64 *cpustat = kcpustat_this_cpu->cpustat;
2779 struct rq *rq = this_rq();
2780
2781 if (atomic_read(&rq->nr_iowait) > 0)
2782 cpustat[CPUTIME_IOWAIT] += (__force u64) cputime;
2783 else
2784 cpustat[CPUTIME_IDLE] += (__force u64) cputime;
2785 }
Если процессор не работает И есть ожидающий IO, он будет считать время в CPUTIME_IOWAIT. В противном случае, это счет в CPUTIME_IDLE.
В заключение, я думаю, что jiffies в irq/softirq следует считать "занятым" для процессора, потому что он фактически обрабатывает IRQ или soft IRQ. С другой стороны, jiffies в "iowait" следует считать "простоя" для процессора, потому что он ничего не делает, а ждет ожидающего ввода-вывода.