Я пытаюсь найти точку в моем скрипте, которая замедляет весь мой процесс. Я использую сценарий ожидания для отправки команды sed для поиска и замены строки в файле. Это займет от 2 до 20 секунд, чтобы закончить, когда он не должен длиться больше секунды. Я два ожидающих сценариев параллельно в двух терминалах. Первый файл, launchmpj.exp
запускает задание qsub, для запуска которого требуется несколько секунд. Второй файл, launchneuron.exp
ждет запуска qsub-задания и продолжения скрипта. Когда начинается qsub-задание, launchmpj.exp
отправляет команду, которая позволяет второму файлу launchneuron.exp
знать о запущенной работе qsub и прекратить ожидание.Узкое место производительности в сценарии ожиданий
Вот launchmpj.exp
#!/usr/bin/expect -f
set timeout -1
spawn ssh $::env(username)@server
expect "$ "
send "qsub -I -q berger -A lc_tb -l nodes=\$nbnodes -l walltime=24:00:00 -d .\r"
expect "$ "
send "cp \$PBS_NODEFILE node`sed -n '1p' nodequeue`\r"
expect "$ "
send "sed -i '/wait=on/ s//wait=off/' `sed -n '1p' qsubwaitqueue`\r"
expect "$ "
send "cd $::env(MPJ_HOME)/bin\r"
expect "$ "
send "sh $::env(MPJLAUNCH)\r"
expect "Process 6 ended"
Вот второй файл launchneuron.exp
#!/usr/bin/expect -f
set timeout -1
spawn ssh $::env(username)@server
expect "$ "
send "set qsubwait = qsub`sed -n '\$p' queue`.sh\r"
expect "$ "
send "sh \$qsubwait\r"
expect "$ "
send "set nodefile = node`sed -n '1p' nodequeue`\r"
expect "$ "
send "ssh `sed -n '2'p \$nodefile`\r"
expect "$ "
send "cd $::env(NEURON_HOME)\r"
expect "$ "
send "nrniv -python $::env(NEURONPY)\r"
expect "$ "
В рамках этого процесса, я бегу sed
подстановку ниже файла. Выполнение только sed
очень быстрое, что означает, что это не узкое место в вышеупомянутом скрипте. Однако, когда это делается из сценария ожидания, это занимает много времени.
qsubwait.sh
Файл:
wait=on
echo "Waiting for qsub to start."
while [ $wait = on ]; do
eval `sed -n '1'p qsubwait.sh`
echo `sed -n '1'p qsubwait.sh`
done
Как именно вы выполняете эту команду? (была ли 'send' частью вашей команды?) Несмотря на то, что вы могли бы просто заменить, а не искать по-разному во-первых, для выполнения замещений не требуется так много времени. На самом деле, что вы подразумеваете под * отправкой команды *? Если вы используете это через какое-то сетевое соединение, кажется, что это очень ясно, где проблема. – Rubens
Я запускал команду через сценарий ожидания. Но я не думаю, что это имеет значение, так как команда была явно выполнена в терминале после того, как «команда была отправлена». Это особенно заметно, когда последующие ожидания строк сценария уже начали выполняться в течение 20 секунд до завершения команды sed. – yhelothar
Тогда вы должны попытаться запустить 'sed' в одиночку, просто чтобы проверить, требуется ли оно столько, сколько это происходит с' expect'. С вашим образцовым файлом на моей машине не требуется больше 0.038s. – Rubens