
Страница proc(5)
руководства описывает iowait как «время ожидания завершения ввода-вывода». Это былов основном объяснилв предыдущем вопросе. Мой вопрос: при ожидании в блокирующем IO, включает ли это ожидание при блокировке сетевого IO или только локального IO?
решение1
Это означает ожидание «файлового ввода-вывода», то есть любого вызова чтения/записи для файла, который находится в смонтированной файловой системе, но также, вероятно, учитывается время ожидания подкачки или загрузки страниц в память по требованию, например, библиотек, которых еще нет в памяти, или страниц файлов, обработанных с помощью mmap(), которые не находятся в оперативной памяти.
НЕ учитывается время, потраченное на ожидание объектов IPC, таких как сокеты, каналы, tty, select(), poll(), sleep(), pause() и т. д.
По сути, это время, которое поток проводит в ожидании синхронного дискового ввода-вывода - в это время он теоретически может работать, но не может, потому что некоторые необходимые ему данные еще не там. Такие процессы обычно отображаются в состоянии "D" и вносят вклад в среднюю загрузку ящика.
Как ни странно, я думаю, что это, вероятно, включает в себя файловый ввод-вывод в сетевых файловых системах.
решение2
время iowait — это количество времени, которое процесс проводит в планировщике ввода-вывода ядра. Насколько мне известно, это не имеет никакого отношения к сетевому вводу-выводу, если речь идет об обычных сокетных соединениях. Однако оно будет включать время, потраченное на ожидание сетевых файловых систем, таких как NFS.
решение3
Оно делает.
Кстати, на одном из серверов, которыми я управляю, наблюдается высокий показатель iowait, вызванный плохим монтированием NFS.
top - 06:19:03 up 14 days, 10:15, 3 users, load average: 9.67, 11.83, 12.31
Tasks: 135 total, 1 running, 134 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 0.0%id, 99.7%wa, 0.0%hi, 0.0%si, 0.0%st
top - 06:22:55 up 14 days, 10:19, 3 users, load average: 10.58, 11.13, 11.89
Tasks: 137 total, 1 running, 136 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 0.0%id, 99.8%wa, 0.0%hi, 0.0%si, 0.0%st
И посмотрите на процессы в D
государстве.
root 27011 0.0 0.0 0 0 ? S 03:12 0:00 [nfsd4]
root 27012 0.0 0.0 0 0 ? S 03:12 0:00 [nfsd4_callbacks]
root 27013 0.0 0.0 0 0 ? D 03:12 0:01 [nfsd]
root 27014 0.0 0.0 0 0 ? D 03:12 0:01 [nfsd]
root 27015 0.0 0.0 0 0 ? D 03:12 0:01 [nfsd]
root 27016 0.0 0.0 0 0 ? D 03:12 0:01 [nfsd]
решение4
iowait включает сетевые вызовы. Я говорю это, потому что NFS обрабатывается как множество локальных файловых систем Linux с точки зрения ядра:
$ vim linux-2.6.38.2/fs/nfs/file.c
const struct file_operations nfs_file_operations = {
.llseek = nfs_file_llseek,
.read = do_sync_read,
.write = do_sync_write,
.aio_read = nfs_file_read,
.aio_write = nfs_file_write,
.mmap = nfs_file_mmap,
.open = nfs_file_open,
.flush = nfs_file_flush,
.release = nfs_file_release,
.fsync = nfs_file_fsync,
.lock = nfs_lock,
.flock = nfs_flock,
.splice_read = nfs_file_splice_read,
.splice_write = nfs_file_splice_write,
.check_flags = nfs_check_flags,
.setlease = nfs_setlease,
};
Когда процессы вызывают запись в файловый дескриптор 5, происходит что-то вроде этого:
files->fd_array[5]->f_op->write(argv.......)
Таким образом, процессы не знают, какую файловую систему они используют (магия vfs), а iowait такой же, как и в локальной файловой системе.