实战背景
博主在进行CPU的性能测试时,发现CPU的性能不达标初步怀疑四点。一跟服务器的散热有关因为CPU表面很烫有可能FAN自适应温控有问题。二测试过程中有的时候CPU loading很高有的时候但是会随机在2秒左右降下来怀疑跟OS与CPU的保护机制有关理论上应该会持续一段高loading时间。三是怀疑跟挂载的硬盘容量不够有关(os层面)因为跑相关性能测试会在系统盘下生成大量缓存问题(已知问题)。四跟内存容量不足有关。因此博主为了想抓住四个变量在实时动态下的横向以及纵向关系由此生成编写该脚本的背景。本文将深入浅出整个脚本的制作过程。
一 软硬件环境配置
硬件环境:带有BMC功能可用的服务器
软件环境:ipmitool
1.1 impitool安装
在线安装: 前提是能上网且配置好yum源,因为重点不在这方面所以本文不做详细赘述
redhat/centos系
[root@localhost ~]# yum install ipmi*
debian系
[root@localhost ~]# apt-get install ipmi*
#如果你安装了ipmitool运行时依然报错,那是因为你的系统没有自动加载IPMI服务,使用ipmitool前需要打开IPMI服务
[root@localhost ~]# modprobe ipmi_si
[root@localhost ~]# systemctl restrt ipmi.service
离线方式: 可参看该链接下载
https://sourceforge.net/projects/ipmitool/files/latest/download
#解压安装包
[root@localhost ~]# tar -zxvf ipmitool-1.8.16.tar.gz
# 进入解压后的目录
[root@localhost ~]# cd ipmitool-1.8.16
# 对ipmitool进行编译配置
[root@localhost ~]# ./configure
# 编译ipmitool
[root@localhost ~]# make -j 64
# 编译安装
[root@localhost ~]# make install
# 对IPMI模块进行导入且启动ipmi服务
[root@localhost ~]# modprobe ipmi_si
[root@localhost ~]# systemctl restrt ipmi.service
————————————————
被正确安装后ipmi服务起来后应该是如下图所示
1.2 脚本监控模块
脚本用于动态监控四个变量,如下图所示
二 shell 脚本开发及解析
2.1 定义脚本测试实际
定义变量time_run,用于进行测试时间的管控
read -p "Input working time (seconds): " time_run
在这里交替使用制表符跟换行符用于内容的输出
printf "Memory\t\tDisk\t\tCPU\t\tFAN1\t\t\tFAN2\t\t\tFAN3\n"
2.2 定义脚本循环体
这里使用交互式while循环用于脚本运行时间的管控
i=0
while (($i <= $time_run))
do
循环体..
done
MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }')
DISK=$(df -h | awk '$NF=="/"{printf "%s\t\t", $5}')
CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}')
FAN1=$(ipmitool sdr list | grep -i FaN1 | awk -F "|" '{printf "%s\t", $2}')
FAN2=$(ipmitool sdr list | grep -i FaN2 | awk -F "|" '{printf "%s\t", $2}')
FAN3=$(ipmitool sdr list | grep -i FaN3 | awk -F "|" '{printf "%s\t\t", $2}')
echo "$MEMORY$DISK$CPU$FAN1$FAN2$FAN3"
sleep 1
let "i++"
2.3 解析主题的监控部件编写
内存监控:
awk 后面的 NR2 从第二行提取数据。如果NR1表示是第一行。 $3*100/$2 表示used值/total值再乘以100%
系统盘监控:
awk后面的awk $NF==“/”‘表示’非贪婪’找到仅仅带有’/'的行,而这个就是根目录,其中$1…$5值如下图所示
CPU监控:
top -bn : 参数n 表示更新的次数,完成后将会退出 top;参数b表示批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内。在这里n1表示记录一次
awk ‘{printf “%.2f%%\t\t\n”, $(NF-2)}’: 这里表示我将倒数第2列的平均每5分钟的系统负载作为CPU的负载
小知识点NF NR $NF $NR的区别与联系
NF 每行字段总数(Number of Font)
[~/AWK_learning]$ cat test.txt
111 222
333 444
555 666
[~/AWK_learning]$ awk '{print NF}' test.txt
2
2
2
[~/AWK_learning]$ awk '{print $NF}' test.txt
222
444
666
NR 当前行数(Number of Row)
[~/AWK_learning]$ cat test.txt
111 222
333 444
555 666 777
[~/AWK_learning]$ awk '{print NR}' test.txt
1
2
3
[~/AWK_learning]$ awk '{print $NR}' test.txt
##表示找当前行代表第当前行的元素的位置比如为什么是777那是因为系统去做第三行的第三个元素
111
444
777
风扇监控:
这里博主仅抓取前3个风扇的转速作为散热策略的层面反馈
awk -F “|” ‘{printf “%s\t”, $2}’: 这里表示以’|'为分隔符抓取第二个值也就是转速
最终的输出形式如下所示:
总结
这里博主仅仅做一个抛砖引玉的作用,大家可以根据自己的实际需求进行定制化修改。其详细脚本如以下链接可以随意进行修改
https://mp.csdn.net/mp_download/manage/download/UpDetailed