Большая задержка запуска записи "dd" в фоновом режиме в bash даже при использовании nohup
Я написал небольшой скрипт для печати использования памяти во время большой последовательной записи файла.
#!/bin/bash
rm result
echo 3 > /proc/sys/vm/drop_caches
sync;
echo start
nohup time dd if=/dev/zero of=mem bs=1M count=2000 &
for i in {1..200}
do
sleep 0.2
cat /proc/meminfo | grep Dirty >> result
cat /proc/meminfo | grep Dirty
done
cat nohup.out
cat result
Я должен увидеть увеличение размера "Грязный" с начала пробега. Но когда я запускаю скрипт, я часто вижу большую задержку (до нескольких секунд), в течение которой размер "грязного" размера не увеличивается, что, возможно, означает, что запуск программы "dd" задерживается. Пример проблемного вывода:
Dirty: 20 kB
Dirty: 20 kB
Dirty: 20 kB
Dirty: 20 kB
Dirty: 20 kB
Dirty: 24 kB
Dirty: 24 kB
Dirty: 24 kB
Dirty: 24 kB
Dirty: 28 kB
Dirty: 28 kB
Dirty: 28 kB
Dirty: 28 kB
Dirty: 28 kB
Dirty: 16528 kB
Dirty: 140608 kB
Dirty: 277228 kB
Dirty: 311768 kB
Dirty: 434308 kB
Dirty: 563352 kB
Dirty: 690952 kB
...
Длина задержки не определена, иногда вообще нет задержки. И наоборот, когда я побежал
time dd if=/dev/zero of=mem bs=1M count=2000
с некоторым средством просмотра meminfo в реальном времени, таким как:
#!/bin/bash
clear
while true
do
sleep 0.2
tput home
cat /proc/meminfo
done
Я всегда вижу, что "грязный" размер увеличивается сразу. Что-то не так с моим сценарием? Я также сомневаюсь в том, как ОС выполняет операцию "запись", потому что я также проверил чтение файла и обнаружил поле "Кэширование" в /proc/meminfo, и, похоже, вообще не имеет задержки.
Спасибо,
3 ответа
Вы можете определить, что занимает дополнительное время, вызвав скрипт с
/bin/bash -x /path/to/script
и смотреть вывод. Это напечатает каждую строку кода скрипта во время его выполнения. В качестве альтернативы вы могли бы предварять каждую команду командой time, и то, что занимает дополнительное время, станет очевидным.
nohup time dd if=/dev/zero of=mem bs=1M count=2000 &
у вас есть бинарный файл "time" в вашей системе? в противном случае nohup не будет знать, как запустить bash внутри себя, и это не удастся
Можете ли вы перезагрузить систему и убедиться, что после перезапуска не слишком много записи происходит хотя бы со стороны приложения, теперь попробуйте выполнить команду dd, причина в том, что если вы хотите проверить операции записи, система должна быть чистой и стабильной. Ваша задержка будет зависеть от того, какие параметры fs и тип файловой системы вы собираетесь использовать. Надеюсь, это поможет.