Можно ли увидеть в Linux, сколько запросов на чтение и запись из пользовательского пространства в конечном итоге вызывают попадания в кеш и пропуски блочных устройств?
Теперь есть утилита cachestat из пакета perf-tools.
Автор также перечисляет некоторые (возможно, более грубые) альтернативы, которые люди используют:
A) Изучите скорость пропуска страниц в кэше с помощью iostat(1) для мониторинга чтения с диска, и предположим, что это пропуски в кэше, а не, например, O_DIRECT. Скорость промахов обычно более важная метрика, чем соотношение, так как промахи пропорциональны боли приложения. Также используйте free(1), чтобы увидеть размеры кэша.
B) Бросьте кэш страниц (echo 1 > /proc/sys/vm/drop_cache), и измерьте, насколько производительность ухудшается! Мне нравится использовать отрицательный эксперимент, но это, конечно, болезненный способ пролить свет на использование кэша.
C) Используйте sar(1) и изучайте мелкие и крупные неисправности. Не думаю, что это сработает (например, обычный ввод/вывод).
D) Используйте скрипт cache-hit-rate.stp SystemTap, который является вторым номером в Интернет-поиске по соотношению хитов кэша страниц Linux. Он утилизирует доступ к кэшу высоко в стеке, в VFS-интерфейсе, так что чтение на любую файловую систему или устройство хранения может быть просмотрено. Пропуски в кэше измеряются через дисковый ввод/вывод. Это также пропускает некоторые типы рабочих нагрузок (некоторые из них упоминаются в "Уроках" на этой странице), и соотношение вызовов "скорость".
Если вас интересует соотношение хит/мисс ввода-вывода конкретного процесса, простым, но очень эффективным подходом является чтение файла /proc/
.
Здесь вы найдете 4 ключевых значения:
rchar
: общее количество прочитанных байтов с точки зрения применения (т.е. без разницы между прочтением, выполненным из физического хранилища, а не из кэша)wchar
: как было сказано выше, но о байтах read_bytes
: байты действительно считываются из подсистемы храненияwrite_bytes
: байты really записанные в подсистему храненияскажем, процесс имеет следующие значения:
rchar: 1000000
read_bytes: 200000
Коэффициент пропуска прочитанного кэша (в байтах) равен 100*200000/1000000 = 20%
, а коэффициент попадания равен 100-20 = 80%
Тем не менее, есть улов: значение rchar
включает вещь как tty IO, так что для процессов, которые много читают/записывают из/в трубу, вычисление, приведенное выше, будет искажено, сообщая о более высоком коэффициенте попадания, чем эффективный.