我们公司有多台计算机,有时用作工作站,有时用作服务器(运行用户定义的工作)
我想利用工作站的所有可用计算能力成为网格的一部分(将它们添加到专用服务器)
每个网格客户端可以在两种模式中的一种工作:低(30%)和高(100%) - (分配的cpu和ram的最大百分比)到网格客户端)
用户不应受此影响,用户开始使用计算机(本地或远程)时客户端切换到低模式(30%) 在用户空闲了一段时间后,例如5分钟,并且CPU使用率很低(没有正在运行的任务),客户端应切换到高模式
以下是我在stackoverflow中找到的几个例子所做的解决方案:
进入空闲状态并将模式设置为高模式我等待cmd和屏幕中的空闲时间,并且需要有限的CPU使用率, 要退出高模式,通过cmd或屏幕执行任何操作都会将其设置为低模式
#!/bin/bash
idle=false
idleAfter=300 # consider idle after 300 seconds
idleCpuAfter=100 # max cpu usage to enter high mode
idleCpuCount=10 #seconds to keep idle state(without interruptions) before starting high mode
count=0 #count for idle state, when counter reach idleCpuCount client will initiate high mode
while true; do
idleInSecondsCmd=$( who -s | perl -lane 'print "$F[0]\t" . 86400 * -A "/dev/$F[1]"'| sort -k2 -n | head -1 | cut -f2 )
idleInSecondsScreen=$(./getIdle)
cpuLoad=$(top -b -n 1 -u "$user" | awk 'NR>7 { sum += $9; } END { print user, sum; }')
echo "idleInSecondsCmd " + $idleInSecondsCmd # just for debug purposes.
echo "idleInSecondsScreen" + $idleInSecondsScreen # just for debug purposes.
echo "cpuLoad" + $cpuLoad # just for debug purposes.
if [[ ($idleInSecondsCmd -gt $idleAfter)
&& ($idleInSecondsScreen -gt $idleAfter)
&& ($(bc <<< "$cpuLoad <= $idleCpuAfter") -eq 1 )
&& $idle = false ]] ;then
count=$((count + 1))
echo $count
else
count=0
fi
if [[ $idle = false && ($count -gt $idleCpuCount) ]]; then
idle=true
setupLoad.sh 100
fi
if [[ ( $idleInSecondsCmd -lt $idleAfter
|| $idleInSecondsScreen -lt $idleAfter)
&& $idle = true ]] ; then
idle=false
setupLoad.sh 30
fi
sleep 1 # polling interval
done
这是最好的方法吗?