期望脚本中的性能瓶颈
Posted
技术标签:
【中文标题】期望脚本中的性能瓶颈【英文标题】:Performance bottleneck in expect script 【发布时间】:2013-07-27 09:00:12 【问题描述】:我正在尝试找出脚本中减慢整个过程的点。我正在使用 expect 脚本发送一个 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
单独的执行速度非常快,这意味着它不是上述脚本的瓶颈。但是,如果从期望脚本完成,则需要很长时间。
sed -i '/wait=on/ s//wait=off/' qsubwait.sh
文件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
是您的命令的一部分吗?)即使您可以简单地替换,而不是先单独搜索,执行替换也不应该花很长时间。实际上,发送命令是什么意思?如果您通过某些网络连接运行此程序,那么问题出在哪里似乎很明显。
我通过期望脚本运行命令。但我认为这无关紧要,因为在“命令已发送”之后,该命令已在终端中明显执行。当后续的期望脚本行在 sed 命令完成之前已经开始执行 20 秒时,这一点尤其明显。
那么你应该尝试单独运行sed
,只是为了检查它是否与expect
一样长。使用您的示例文件,在我的机器上完成不会超过 0.038 秒。
你能试着更好地解释一下你在这里实际想要做什么吗?完成一项简单任务似乎是一种非常复杂的方式;也许我错过了一些微妙的东西。为什么例如使用eval
而不是直接声明?
@yhelothar 我已经编辑了您的问题,并留下了一个字段 <add your script here>
供您使用 expect
调用添加您尝试执行的脚本。补充这个问题,更多的人将能够帮助你——在没有看到你正在运行的其他命令的情况下,很难说问题到底出在哪里。
【参考方案1】:
你是否达到了期望的超时值?用exp_internal 1
运行你的expect 脚本,看看expect 正在等待什么。
【讨论】:
超时设置为 -1。在发送 sed 命令之后,expect 脚本已经很好地继续执行,并且已经很好地执行了send "sh $::env(MPJLAUNCH)\r"
。尽管如此,sed 命令直到几秒钟后才成功完成其工作。以上是关于期望脚本中的性能瓶颈的主要内容,如果未能解决你的问题,请参考以下文章