我们正在编写一个脚本,该脚本将告诉我们 8 组计算机上有多少线程可用。我知道我可以使用
cat /proc/cpuinfo | grep processor | wc -l
获取线程总数,但我们想知道可用线程的数量。可用线程是指当前未使用的线程数。我们有多个人访问这些计算机并运行一次需要 1-12 个线程的作业,如果能够快速查询而不是手动访问每台计算机会很好
访问计算机应该可以用这个脚本完成,我只需要找到一个合适的函数来用作 FindAvaiableThreads()
ssh user@host <<'ENDSSH'
#commands to run on remote host
FindAvaiableThreads()
ENDSSH
ssh user@host2 << 'ENDSSH'
#commands to run on remote host
FindAvaiableThreads()
ENDSSH
...
ssh user@hostN << 'ENDSSH'
#commands to run on remote host
FindAvaiableThreads()
ENDSSH
最终结果
我们正在运行 checker.scr,它向远程计算机 n 发送一个脚本,该脚本通过查看 cpu 使用情况并从 cpu 总量中减去来估计可用 cpu 的数量,并根据需要针对超线程进行纠正。
我还想指出,此实现基于使用公共/私有 ssh 密钥来延迟密码输入,但是 sshpass 可用于将您的密码传递给它;但是,我不允许在这些计算机上安装此类程序。
检查器.scr
name = username
ssh $name@remote1 'bash -s' < threadquery.scr
ssh $name@remote2 'bash -s' < threadquery.scr
ssh $name@remote3 'bash -s' < threadquery.scr
ssh $name@remote4 'bash -s' < threadquery.scr
ssh $name@remote5 'bash -s' < threadquery.scr
ssh $name@remote6 'bash -s' < threadquery_hyper.scr
ssh $name@remote7 'bash -s' < threadquery_hyper.scr
ssh $name@remote8 'bash -s' < threadquery_hyper.scr
线程查询.scr
NUMCPUS=`grep ^proc /proc/cpuinfo | wc -l`;
FIRST=`cat /proc/stat | awk '/^cpu / {print $5}'`;
sleep 1;
SECOND=`cat /proc/stat | awk '/^cpu / {print $5}'`;
USED=`echo 2 k 100 $SECOND $FIRST - $NUMCPUS / - p | dc`;
AVA=$(echo "$NUMCPUS-$NUMCPUS*$USED/100" | bc -l);
HOSTVAL=$(hostname)
echo "Estimated avaliable processors on $HOSTVAL";
echo $AVA | awk -F\. '{if(($2/10^length($2)) >= .5) printf("%d\n",$1+1);else printf("%d\n",$1)}';
threadquery_hyper.scr
NUMCPUS=`grep ^proc /proc/cpuinfo | wc -l`;
FIRST=`cat /proc/stat | awk '/^cpu / {print $5}'`;
sleep 1;
SECOND=`cat /proc/stat | awk '/^cpu / {print $5}'`;
USED=`echo 2 k 100 $SECOND $FIRST - $NUMCPUS / - p | dc`;
AVA=$(echo "$NUMCPUS-$NUMCPUS*$USED/100" | bc -l);
HOSTVAL=$(hostname)
THREADCORRECT=$(echo "$AVA/2" | bc -l);
echo "Estimated avaliable processors on $HOSTVAL";
echo $THREADCORRECT | awk -F\. '{if(($2/10^length($2)) >= .5) printf("%d\n",$1+1);else printf("%d\n",$1)}';