Как дросселировать трубу в bash / shell - PullRequest
0 голосов
/ 11 февраля 2020

Фон

Я восстанавливаю снимок tar базы данных.

Во время восстановления мой компьютер почти не работает из-за переполнения дискового ввода-вывода.

К сожалению, моя ОС (Ubuntu 18.04) использует планировщик ввода-вывода дедлайна, который игнорирует любую концепцию приоритета ввода-вывода.

Вопрос

Вместо этого я пытаюсь создать конвейер оболочки что ограничивает чтение исходного tar.

something db.tar.gz | tar xzf -

Таким образом, я могу контролировать скорость записи и подделывать отсутствие в моей ОС реального планировщика ввода / вывода.

Как я могу это сделать?

Попытка

До сих пор я пробовал pv, однако она кажется непригодной для этой задачи.

pv -L 5M db.tar.gz | tar xzf -

Индикатор прогресса регулярно показывает скорости, в несколько раз превышающие предел и мой компьютер зависает, когда это происходит.

1 Ответ

0 голосов
/ 11 февраля 2020

Для системы ненормально задушить дисковый ввод-вывод и требовать ограничения пропускной способности, но вы задали вопрос для StackOverflow, а не для ServerFault, поэтому ...

Команда pv работает так, как объявлено. Причина, по которой вы видите всплеск скорости, заключается в том, что tar был временно слишком медленным, поэтому pv позволил ему считывать быстрее, чтобы восстановить в среднем до 5 МБ / с.

Любой данный фрагмент в 5 МБ Данные в сжатом виде могут соответствовать чему-либо от 5 МБ до 100 МБ + несжатых данных, поэтому, чтобы сделать обработку более равномерной, вы можете применить ее после декомпрессии вместо:

gzip -d < db.tar.gz | pv -L 5M | tar x

В противном случае вы можете взломать вместе bash l oop, который будет писать в устойчивом темпе и не допускать наверстывания:

cat db.tar.gz |
    while sleep 1 && [[ $(LC_ALL=C dd bs=5M count=1 2>&1 >&3) != "0+0 records"* ]] 3>&1; do true; done |
    pv |
    tar xz
...