Я передаю вывод из одной программы в какой-то Perl, который я написал. Это длительный процесс, иногда дни, поэтому я хочу выяснить, где мои узкие места, и попытаться их устранить. Я хочу знать, передаются ли данные в мой сценарий быстрее, чем мой сценарий может их обработать. Если это так, я постараюсь настроить свой сценарий, но не тогда, когда мне это не нужно. Я вижу разговоры о том, что флаг устанавливается, когда буфер заполнен, что предотвращает дальнейшую запись в него, но как мне проверить, установлен ли или как часто этот флаг? Есть идеи?
11
pv
где-нибудь вдоль цепи трубы.Ответы:
Я бы проследил ваш сценарий Perl с помощью инструмента трассировки системных вызовов:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris) и т. Д. Цель состоит в том, чтобы узнать, сколько времени ваш сценарий Perl ожидает в ожидании чтения из своего stdin и сколько времени другая программа тратит на запись в свой стандартный вывод.Здесь я проверяю это с писателем как узким местом:
Первое число здесь - это время с начала предыдущего системного вызова, а последнее число - время, проведенное в системном вызове. Таким образом, мы можем немного постобработать с Perl, чтобы агрегировать его ... [*]
Вы можете пойти дальше и создать скрипт SystemTap или DTrace, который отслеживает обе стороны одновременно, отслеживает только правильный дескриптор файла и печатает хорошее обновление состояния каждую секунду или около того, с каким процентом времени каждый ждал другого.
[*] - Предупреждение: моя грубая агрегация не совсем верна, если чтение / запись вызывается для других файловых дескрипторов; это будет недооценивать рабочее время в этом случае.
Версия dtrace на самом деле довольно аккуратная.
И версия SystemTap:
источник
Вы можете вставить
pv -TC
команду в свою конвейерную линию:pv
использует свой собственный буфер и-T
заставляет его сообщать, насколько он заполнен в среднем за 1 секунду (по умолчанию).Если это всегда 100%, то это означает, что
cmd1
при производстве продукции быстрее, чемcmd2
при потреблении. Если нет, то все наоборот. Остерегайтесь, что сами трубы могут держать 64 КБ.Смотрите также,
-B
чтобы указатьpv
размер буфера. Вы можете использовать несколькоpv
s как в:источник