2013-07-26 2 views
1

Я пытаюсь найти точку в моем скрипте, которая замедляет весь мой процесс. Я использую сценарий ожидания для отправки команды 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 
+2

Как именно вы выполняете эту команду? (была ли 'send' частью вашей команды?) Несмотря на то, что вы могли бы просто заменить, а не искать по-разному во-первых, для выполнения замещений не требуется так много времени. На самом деле, что вы подразумеваете под * отправкой команды *? Если вы используете это через какое-то сетевое соединение, кажется, что это очень ясно, где проблема. – Rubens

+0

Я запускал команду через сценарий ожидания. Но я не думаю, что это имеет значение, так как команда была явно выполнена в терминале после того, как «команда была отправлена». Это особенно заметно, когда последующие ожидания строк сценария уже начали выполняться в течение 20 секунд до завершения команды sed. – yhelothar

+1

Тогда вы должны попытаться запустить 'sed' в одиночку, просто чтобы проверить, требуется ли оно столько, сколько это происходит с' expect'. С вашим образцовым файлом на моей машине не требуется больше 0.038s. – Rubens

ответ

0

Вы ударяя ожидают своей стоимости тайм-аут? Запустите сценарий ожидания с exp_internal 1, чтобы узнать, чего ожидает ожидание.

+0

Время ожидания равно -1. Сценарий ожидания хорошо продолжит отправку команды sed и уже успел выполнить «send» sh $ :: env (MPJLAUNCH) \ r "' Несмотря на это, команда sed не выполняет свою работу пока несколько секунд спустя. – yhelothar

Смежные вопросы