Я использую Ubuntu 12.04 с двумя жесткими дисками SATA3 по 2 ТБ в программном массиве RAID1. Файловая система ext4 с data=writeback
.
Когда используешь find . -maxdepth 1 -name '*' -delete
для удаления большого количества файлов в каталоге, выполняя df
время от времени показывать, что:
Первоначально удаляется большое количество файлов, и iotop
показывает find
операция занимает большую часть ввода-вывода.
Потом df
показывает, что количество файлов остается постоянным, и iotop
показывает, что в использовании ввода-вывода в настоящее время преобладают jbd2
и md4_raid1
.
Несколько минут спустя, df
показывает количество удаляемых файлов еще раз.
Кто-нибудь может объяснить такое поведение? Это нормально или с моим сервером что-то не так? Кроме того, как 3 процесса могут использовать 99,99% операций ввода-вывода одновременно?
Я этого и ожидал. Функция Find находит файлы - т.е. читает из VFS, когда данные не в кеше, их нужно извлечь с диска. По мере обработки каждого файла он ставит в очередь изменения для записи. В какой-то момент буфер записи заполняется, и изменения должны быть записаны на диск - в этот момент процесс, выполняющий запись, будет заблокирован, выполняя дальнейшие запросы записи или чтения, пока не появится место для буферизации дополнительных записей.
Вы можете предотвратить блокировку системы, снизив приоритет ввода-вывода процесса:
ionice -c3 nice -15 find ... -delete
Если этого недостаточно, вы можете использовать chrt, чтобы поместить процесс в класс SCHED_IDLE.