fshp, даже если mmap, то все равно используются операции чтения с диска. Пусть и без промежуточной буферизации, но это значительно медленнее, чем читать из пайпа.
fshp, а может быть это ошибки в реализации sort. Например, недавно обнаружил для себя, что shuf ломает данные переданные по конвейеру, но при этом корректно работает с файлами. Похоже на то, что работу с файлами писали одни люди, а работу с пайпами уже другие :)
fshp, Для меня было абсурдом, что чтение из пайпа может быть медленнее, чем чтение из файла. Поэтому я даже не рассматривал такой вариант, а сделал вывод, что в данном случае процессы делят ресурсы одного ядра. Возможно информация о размере файла позволяет sort быть более производительным. Иначе у меня больше нет предположений.
jcmvbkbc, да, действительно, вы правы. Но что делать в моей ситуации:
Убираю из конвейера sort - все ядра загружены на 100%. Добавляю sort - все ядра простаивают, работает только sort и немного cmd1 (остальные процессы зависят от cmd1).
Похоже sort читает медленнее, чем пишет cmd1. Благодарю. Но исправить эту ситуацию, получается, можно только используя временный файл?
В описанном примере sort потребляет значительную долю процессорного времени одно ядра, а cmd1 достается меньшая часть (пропорционально). В результате cmd1 не успевает обслуживать воркерыы, которые производят данные. htop показывет 90/10 sort/cmd1. Но если сделать так cmd1 > file && sort file
то никаких потерь производительности нет.
Убираю из конвейера sort - все ядра загружены на 100%. Добавляю sort - все ядра простаивают, работает только sort и немного cmd1 (остальные процессы зависят от cmd1).
Мой эксперимент говорит об обратном. Попытаюсь описать более детально ситуацию.
cmd1 создает по одному воркеру на ядро, которые производят данные и возвращают их с помощью пайпа. Далее cmd1 передает данные по конвейеру в cmd2, которым является sort.
В результате cmd1 и sort используют одно ядро процессора (sort 90%, cmd1 10%). Поэтому cmd1 не успевает обслуживать свои воркеры и производительность системы катастрофически снижается.
То есть, даже вариант cmd1 > file && sort file работает в десяток раз быстрее. Все это указывает на то, что таки делят процессы между собой ресурсы одного ядра и htop это подтверждает.
Параметр z команды grep разделяет найденные строки null-символом вместо символа перевода строки. Команда tr заменяет все вхождения символов из первого набора символами из второго набора. В частности "\0" на ";". Точка с запятой является оператором bash, поэтому требуется ее экранирование обратным слэшем.