Назад | Перейти на главную страницу

Как определить количество выполненных поисков в Linux?

У меня есть две программы, которые записывают на диск моего сервера.

Один, который я написал, он выполняет линейную запись, он записывает данные быстро. Другой, который я тестирую, он записывает данные на 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/. Надеюсь, это поможет!