Большая задержка запуска записи "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 и тип файловой системы вы собираетесь использовать. Надеюсь, это поможет.

Другие вопросы по тегам