Я узнал это:
Причина в том, что gzip
работает (с точки зрения скорости процессора и скорости поиска HD в наши дни) очень низких размеров буфера.
Он считывает несколько килобайт из входного файла, сжимает его и сбрасывает в выходной файл. Учитывая тот факт, что это требует поиска жесткого диска, только несколько операций могут быть выполнены в секунду.
Причина, по которой мое выступление не масштабировалось, заключается в том, что уже один gzip
искал как сумасшедший.
Я обошел это, используя утилиту buffer
unix:
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Буферизуя большую часть ввода перед отправкой в gzip, количество маленьких запросов может быть значительно уменьшено. Варианты:
-s
и -m
указывают размер буфера (я думаю, что это в КБ, но не уверен)
-p 100
гарантирует, что данные передаются в gzip только после заполнения буфера на 100%
Запустив четыре из них параллельно, я мог получить пропускную способность 4 * 25 МБ / с, как и ожидалось.
Мне все еще интересно, почему gzip не позволяет увеличивать размер буфера - таким образом, он довольно бесполезен, если он запускается на вращающемся диске.
РЕДАКТИРОВАТЬ: я опробовал еще несколько программ сжатия поведения:
bzip2
обрабатывает только 2 МБ / с из-за более сильного / более интенсивного сжатия процессора
- Похоже, что
lzop
допускает большие буферы: 70 МБ / с на ядро, а 2 ядра могут максимально использовать мой HD без чрезмерного поиска