Мне интересно, замедляет ли тройник трубопроводы. В конце концов, запись данных на диск происходит медленнее, чем их передача.
Дождется ли передача данных в следующий канал, пока они не будут записаны на диск? (Если нет, то, наверное, нужно поставить в очередь данные, которые были отправлены вместе, но не записаны на диск, что мне кажется маловероятным.)
$ program1 input.txt | tee intermediate-file.txt | program2 ...
Ответы:
Да, это замедляет ход событий. И у него в основном есть очередь неписанных данных, хотя на самом деле они поддерживаются ядром - так есть во всех программах, если они явно не требуют другого.
Например, вот тривиальное использование канала
pv
, что приятно, поскольку отображает скорость передачи:Теперь давайте добавим
tee
туда, даже не написав лишнюю копию - просто перешлем ее:Так что это немного медленнее, и он даже ничего не делал! Это накладные расходы на внутреннее копирование STDIN в STDOUT. (Интересно, что добавление секунды
pv
остается на скорости 5,19 ГБ / с, так чтоpv
это значительно быстрее, чемtee
.pv
Используетsplice(2)
,tee
скорее всего, нет.)В любом случае, давайте посмотрим, что произойдет, если я скажу
tee
записать файл на диск. Он запускается довольно быстро (~ 800 МБ / с), но по мере замедления продолжает замедляться - в конечном счете, до ~ 100 МБ / с, что составляет в основном 100% пропускной способности записи на диск. (Быстрый запуск происходит из-за того, что ядро кэширует запись на диск, а замедление до скорости записи на диск приводит к отказу ядра в бесконечном росте кеша.)Это имеет значение?
Выше приведен худший случай. Выше используется канал для выброса данных как можно быстрее. Единственное реальное использование, о котором я могу думать, это передача необработанных данных YUV в / из
ffmpeg
.Когда вы отправляете данные с более низкой скоростью (потому что вы их обрабатываете и т. Д.), Это будет гораздо менее значительным эффектом.
источник
В конце концов, ничего удивительного
> POSIX говорит ,
А также что
Таким образом, без объяснения «обоснования»,
tee
вероятно , будет считываться и записываться только то количество байтов, которое может поместиться в буфер канала за раз, сбрасывая вывод при каждой записи.И да, в зависимости от приложения, это может быть довольно неэффективно, поэтому вы можете просто удалить / прокомментировать любой из них:
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224
источник
tee
выполнялось быстрее?