Как я могу видеть i/o статистику для кратко рабочего процесса?

Я не полагаю, что существует любой способ определить, является ли файловая система удаленной или локальная использующий только интерфейсы POSIX. POSIX не делает даже мандата a mount команда и все ссылки на файловые системы, насколько я знаю, переполнены "определенными реализацией" словами.

-local основной к find команда не является большим количеством справки, так как это только доступно на Солярисе, и она зависит от существования конфигурационного файла, который перечисляет типы удаленной файловой системы.

POSIX делает мандат a df управляйте и требует определенного выходного формата, если та команда используется с -P флаг; в том формате существует шесть разделенных пробелом полей, из которых первым является "название файловой системы в определенном формате реализации", и последней является точка монтирования.

То, в чем Вы нуждаетесь, является списком всех точек монтирования, соответствующих локальным файловым системам. Здесь, я думаю, что Вы оказываетесь перед необходимостью отступать к эвристике; который должен исключить имена файловой системы, которые похожи" на удаленные файловые системы. Некоторые примеры:

//...     CIFS (Samba)
host:...  NFS
/afs      AFS

Это не исчерпывающий список, и он прибывает полностью без гарантий.

Если Вы затем фильтруете те строки из вывода df и затем удалите первые пять столбцов, Вы могли затем подать список к find команда с -xdev основной.

Даже если это звучит вероятным, нет на самом деле никакой гарантии, что файловая система на самом деле "смонтирована" (см. AFS), или что файловая система является или совершенно локальной или совершенно удаленной (основанная на предохранителе файловая система может произвольно перенаправить отдельные файлы). Поэтому соблюдите осторожность, мой совет.

5
22.07.2014, 21:31
2 ответа

В общем, похоже, вам нужен общий совет по профилированию ввода/вывода приложения во время выполнения. Вы делали это с помощью /proc/$PID/io, что даст вам некоторое представление о том, как много пропускной способности используется между диском и памятью приложения. Опрос этого файла может дать Вам приблизительное представление о том, что делает процесс, но это неполная картина, так как он показывает только то, сколько данных перемещается на диск и с диска.

Для решения поставленной задачи у Вас, в основном, есть следующие возможности:

  • Использовать платформенную аппаратуру. На Linux написание скрипта SystemTap является наиболее многофункциональным полным решением, но в зависимости от того, как сильно Вы хотите работать, это может быть больше работы, чем Вы действительно хотите потратить на желаемую выгоду.

  • Используйте инструментарий, основанный на приложениях. Много способов сделать это, но gprof profile является популярным вариантом. Некоторые приложения могут также предоставлять свои собственные инструменты, но вам придется проверить.

Вероятно, лучшая альтернатива - использовать уже существующие инструменты инструментов платформы вместе, чтобы достичь желаемого эффекта и получить от этого максимум пользы.


Я не знаю программы, которая запустит приложение и сделает всё это за вас (это не значит, что её нет ни в коем случае, просто я не слышал о ней), так что лучший вариант - просто начать собирать общесистемную информацию и просто отфильтровать PID, о котором вы беспокоитесь после этого (так что вы получите полный образец).

Прежде всего, я бы включил аудит вызовов execve, чтобы вы могли сохранить PID приложения, которое вы запускаете. После получения PID вы можете удалить аудит.

Запустите mount debugfs -t debugfs /sys/kernel/debugs, чтобы запустить отладку, так что вы можете запустить blktrace.

На своей системе я запустил blktrace -d /dev/sda -a read -a write -o - | blkparse -i -, но вы можете настроиться соответственно. Вот пример вывода blktrace:

8,0   15        3 1266874889.709440165 32679  Q   W 20511277 + 8 [rpc.mountd]

В приведенном выше выводе пятая колонка (32679) - это PID, связанный с приложением, выполняющим запись. Части, которые нас волнуют, это Q (тип события, очередь) - W (поле RWBS, W означает, что это запись, так как в этом поле нет S, а также подразумевается, что это была асинхронная запись. ) и 20511277 + 8 (операция начинается с номера блока 20511277 и продолжается еще на восемь блоков). Определение размеров для чтения/записи должно быть просто сложением блоков вместе и умножением на размер блока.

blktrace также расскажет вам не только о пропускной способности, но и о том, что происходит со слияниями, о которых вы беспокоитесь.

После того, как вы запустили blktrace, вы можете запустить процесс, используя strace -c, что даст вам ощущение средней латентности, связанной с каждым системным вызовом (включая чтение и операции записи ). В зависимости от того, насколько надежным должен быть каждый вызов, латентность может быть важна, она также может рассказать вам больше о том, что делает приложение (указать области для изучения настройки), не имея никаких инструментов приложения.

Между этими двумя вы должны получить довольно хорошую выборку того, что ваша программа делает, не теряя никаких данных и, возможно, включая ввод/вывод других приложений. Очевидно, что есть больше способов сделать это, чем я описывал, но именно так я бы решил проблему.

Также необходимо иметь возможность собирать связанные с вводом/выводом меры латентности, например, используя выходные опции blkparse. Я просто не играл с ними, потому что недостаточно играл.

2
27.01.2020, 20:41

Можно запустить команду в фоновом режиме, а затем получить ее pid через переменную $!.

Пример:

$ ls & cat /proc/$!/io
[1] 6410
rchar: 7004
wchar: 0
syscr: 13
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
1
27.01.2020, 20:41

Теги

Похожие вопросы