Производительность `tar -xf` (размер блока)

Недавно я работал над оптимизацией производительности tar -xf , то есть tar -xf файл.

Я заметил, что при настройках по умолчанию tar -xf вызывает write s для записи 10 KiB-выходов одновременно в кусках. Однако это приводит к серьезному штрафу за хранение в соответствии с нашей текущей настройкой (с использованием флага O_DIRECT с O_DIRECT / выводом для флэш-памяти).

Есть ли способ увеличить размер куска, который tar записывает выходные файлы? Я играл с параметром -b и отмечал, что если я делаю tar -b 512 -xvf , производительность увеличивается на 2x . Является ли это допустимым использованием в этом случае? (Файлы tar были созданы по умолчанию.)

Есть ли что-то еще, что я могу сделать, чтобы повысить пропускную способность tar ?

Параметр -b в tar использовался для управления записью размера tar tar на устройство, так что это именно то, что вы хотите. Но -b 512 отношении страницы страницы tar (1) означает размер блока 512 * 512 = 262144. Все размеры блоков действительны, что может обрабатывать ваше устройство, на которое вы пишете вывод tar. В истории это было необходимо для разных ленточных накопителей, для которых первоначально была написана команда tar.

Все реализации tar, кроме star имеют проблемы с производительностью, которые решаются FIFO , встроенным в звезду с 1990 года.

Star по умолчанию создает 8MB FIFO, который помогает повысить производительность, потому что звезда также разворачивает два процесса. Один процесс считывает архив, а другой процесс выполняет задачу извлечения tar . Если вы используете современную ОС и используете современное ленточное устройство, я рекомендую указать больший размер FIFO до половины физической памяти устройства. См. star fs= . С современными ленточными накопителями я рекомендую fs=256M больше. Это значительно снижает обычные износ ленты из-за перепозиционирования ленты, когда режим ленточной ленты невозможен.

Если вы используете настоящие ленточные устройства, вам нужно увеличить размер блока во время создания. Обратите внимание, что для переносимости лент вам не следует использовать размер блока> 6 КБ. Если ваши локальные ОС и диски поддерживают большие размеры блоков (и не только увеличенный размер FIFO), используйте более крупные значения (см. Страницу звездного человека).

Обратите внимание: если вы используете Copy on Write файловых систем, таких как ZFS, или если вы находитесь в ОС с медленной реализацией буфера файловой системы (например, Linux), вам может понравиться переключать star в insecure mode , доступный только с помощью gtar . Сделайте это, добавив -no-fsync . В Solaris и ufs по умолчанию безопасный режим по умолчанию снижает производительность менее чем на 10%, на ZFS и медленную реализацию буфера Linux этот безопасный режим снижает производительность на 400%.