У меня есть две программы, которые записывают на диск моего сервера.
Один, который я написал, он выполняет линейную запись, он записывает данные быстро. Другой, который я тестирую, он записывает данные на 3-й скорости. Больше он ничего не делает, и я считаю, что проблема вызвана тем, что вторая программа ищет большего (то есть выполняет больше произвольного доступа к файлам).
Есть ли в Linux инструмент, который я могу использовать для определения количества операций поиска, выполняемых на определенном диске? Или с помощью определенного процесса?
Возможно, будет полезно взглянуть на влияние нагрузки и поведение системы хранения:
iostat -x 1
Здесь есть несколько интересных значений:
avgrq-sz
описывает размер (в секторах) запросов, отправляемых на дискavgqu-sz
показывает длину этой очереди (подумайте о количестве транзакций)await
отображает время ожидания доступа к устройству (до тех пор, пока устройство не начнет обработку запроса)svctm
показывает время, затраченное устройством на удовлетворение запросовВ вашем случае размер запроса должен увеличиваться для вашего описания линейной записи, а длина очереди и использование устройства должны оставаться от среднего до низкого. Во втором случае с большим количеством шаблонов произвольного доступа размер запроса должен оставаться ниже, но размер очереди, время ожидания доступа и использование должны возрасти.
В зависимости от шаблонов доступа может иметь смысл настроить /proc/sys/vm/dirty_writeback_centisecs
или /proc/sys/vm/dirty_background_ratio
, но это зависит от количества и схемы перемещаемых данных (просто чтобы дать вам указатель на то, где находятся настраиваемые параметры для кеша страниц / кеша записи).
Для определения количества искать вызовов на процесс, который вы можете использовать strace
и ищите все интересные системные вызовы (fseek (o), lseek (64), я ищу и т.д.). Лучше просто grep
для искать чтобы увидеть, какие функции вызываются этим конкретным процессом.
Примеры:
lseek(3, -1467, SEEK_CUR) = 842
Файл, открытый через файловый дескриптор 3 установлен на -1467 байты из ток позиция, в результате чего новая позиция 842 байты.
lseek(12, 40267, SEEK_SET) = 40267
Файл, открытый через файловый дескриптор 12 установлен на общее количество положение 40267 байтов, в результате чего новая позиция 40267 байтов (что равно успех поскольку оба числа одинаковые).
Этот инструмент может вам помочь http://sourceforge.net/projects/hdparm/ - Я использовал это в прошлом с некоторым успехом. Другой инструмент, который может дать вам эталон, - это iometer. Iostat - еще один инструмент, но он может не отображать процессы, и этот инструмент также может помочь http://www.atoptool.nl/. Надеюсь, это поможет!