From 303f8c0a756ee2692fdb02522b676556ce6f7282 Mon Sep 17 00:00:00 2001 From: wangdong_cmcc Date: Tue, 5 Nov 2024 11:15:34 +0800 Subject: [PATCH] add virtual machine detect module --- rpm/sysak-build-nodep-aarch64.sh | 1 + rpm/sysak-build-nodep.sh | 1 + rpm/sysak-build.sh | 1 + source/tools/bclinux/vm_monitor/Makefile | 4 + source/tools/bclinux/vm_monitor/README.md | 51 +++++++++++++ source/tools/bclinux/vm_monitor/clean.sh | 39 ++++++++++ source/tools/bclinux/vm_monitor/vm_gauge.py | 40 ++++++++++ .../bclinux/vm_monitor/vm_monitor_detect.sh | 74 +++++++++++++++++++ 8 files changed, 211 insertions(+) create mode 100644 source/tools/bclinux/vm_monitor/Makefile create mode 100644 source/tools/bclinux/vm_monitor/README.md create mode 100644 source/tools/bclinux/vm_monitor/clean.sh create mode 100644 source/tools/bclinux/vm_monitor/vm_gauge.py create mode 100644 source/tools/bclinux/vm_monitor/vm_monitor_detect.sh diff --git a/rpm/sysak-build-nodep-aarch64.sh b/rpm/sysak-build-nodep-aarch64.sh index 2c712b6b..3a5320b3 100755 --- a/rpm/sysak-build-nodep-aarch64.sh +++ b/rpm/sysak-build-nodep-aarch64.sh @@ -48,6 +48,7 @@ mkdir -p \$RPM_BUILD_ROOT/usr/lib/systemd/system/ /bin/cp $SOURCE_DIR/rpm/sysak.service \$RPM_BUILD_ROOT/usr/lib/systemd/system/ /bin/cp $SOURCE_DIR/rpm/sysak_server.conf \$RPM_BUILD_ROOT/usr/local/sysak/ /bin/cp -rf $SOURCE_DIR/source/tools/bclinux/checkcommand/*.sh \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ +/bin/cp -rf $SOURCE_DIR/source/tools/bclinux/vm_monitor/vm_gauge.py \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ %preun diff --git a/rpm/sysak-build-nodep.sh b/rpm/sysak-build-nodep.sh index 48f19b81..ba23c1fa 100755 --- a/rpm/sysak-build-nodep.sh +++ b/rpm/sysak-build-nodep.sh @@ -51,6 +51,7 @@ mkdir -p \$RPM_BUILD_ROOT/usr/lib/systemd/system/ /bin/cp $SOURCE_DIR/rpm/sysak.service \$RPM_BUILD_ROOT/usr/lib/systemd/system/ /bin/cp $SOURCE_DIR/rpm/sysak_server.conf \$RPM_BUILD_ROOT/usr/local/sysak/ /bin/cp -rf $SOURCE_DIR/source/tools/bclinux/checkcommand/*.sh \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ +/bin/cp -rf $SOURCE_DIR/source/tools/bclinux/vm_monitor/vm_gauge.py \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ %preun systemctl stop sysak diff --git a/rpm/sysak-build.sh b/rpm/sysak-build.sh index 23806654..7abdc77c 100755 --- a/rpm/sysak-build.sh +++ b/rpm/sysak-build.sh @@ -46,6 +46,7 @@ mkdir -p \$RPM_BUILD_ROOT/usr/lib/systemd/system/ /bin/cp -f $BUILD_DIR/.sysak_components/tools/monitor/sysakmon.conf \$RPM_BUILD_ROOT/usr/local/sysak/ /bin/cp $SOURCE_DIR/rpm/sysak_server.conf \$RPM_BUILD_ROOT/usr/local/sysak/ /bin/cp -rf $SOURCE_DIR/source/tools/bclinux/checkcommand/*.sh \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ +/bin/cp -rf $SOURCE_DIR/source/tools/bclinux/vm_monitor/vm_gauge.py \$RPM_BUILD_ROOT/usr/local/sysak/.sysak_components/tools/ %preun diff --git a/source/tools/bclinux/vm_monitor/Makefile b/source/tools/bclinux/vm_monitor/Makefile new file mode 100644 index 00000000..910d5122 --- /dev/null +++ b/source/tools/bclinux/vm_monitor/Makefile @@ -0,0 +1,4 @@ +target := vm_monitor_detect + +include $(SRC)/mk/sh.mk + diff --git a/source/tools/bclinux/vm_monitor/README.md b/source/tools/bclinux/vm_monitor/README.md new file mode 100644 index 00000000..074c12e0 --- /dev/null +++ b/source/tools/bclinux/vm_monitor/README.md @@ -0,0 +1,51 @@ +# 功能说明 +虚机监控工具 + +日志 +虚机列表 +#virsh list --all | awk -F ' ' 'NR>2{if($0!=""){print $2}}' > /tmp/vm_all_list.txt +# cat /tmp/vm_all_list.txt + + +依赖包: +libvirt-devel numa* ncurses-devel kernel-devel python-bcc python2-daemon + +yum install -y python-vmtop-tools +# systemctl status python-vmtop.service +python-vmtop -r 5 --vm >> /var/log/python_vmtop.log& + +yum install -y vmtop_tools +# systemctl status vmtop_log +/usr/sbin/vmtop -b -d 30 >> /var/log/vmtop.log 2>&1 + + +# systemctl status vm-monitor +/usr/bin/python3 /usr/local/sysom/node/monitor/vm-monitor/vm_gauge.py + + +# 计划后期实现 +1)虚机资源情况 + - 记录了宿主机和节点上的多种资源使用情况,包括CPU使用率、磁盘I/O速率、网络I/O速率和虚拟机退出次数等 +# cat /var/log/python_vmtop.log +2024-10-31 07:42:55.316656 +('Host CPU: user: 4.20%,', 'nice: 0.00%,', 'system: 1.60%,', 'idle: 89.50%,', 'iowait: 0.00%,', 'irq: 0.60%,', 'guest: 0.00%') +Node 0: +name PID vcpu vcpu vhost vhost em em disk disk rx tx rx_drop tx_drop vmexit + util% steal% util% steal% util% steal% rd MB/s wr MB/s Mbps Mbps pkt/s pkt/s count + Node 0: vcpu util: 0.00%, vcpu steal: 0.00%, emulators util: 0.00%, emulators steal: 0.00% + Node 0: 0 VMs (0 vcpus, 0.00 GB mem allocated, 0.00 GB mem used) + + +2)虚机资源使用情况 + - 提供了详细的虚拟机资源使用情况,包括CPU、内存、KVM退出次数、EPT违规次数、KVM暂停次数、进程状态、物理CPU号、被抢占时间比率、虚拟机内部占用时间和hypervisor层占用时间 +# cat /var/log/vmtop.log +DID VM/task-name PID %CPU %Mem EXTsum EXTeptv EXTpau S P %ST %GUE %HYP +vmtop - 2024-10-31 07:50:06 - 1.1 +Domains: 1 running + + DID VM/task-name PID %CPU %Mem EXTsum EXTeptv EXTpau S P %ST %GUE %HYP + 1 myvm1 1234 10.0 2.5 1234 567 890 R 0 0.5 0.8 0.2 + + + + diff --git a/source/tools/bclinux/vm_monitor/clean.sh b/source/tools/bclinux/vm_monitor/clean.sh new file mode 100644 index 00000000..4f40a8d4 --- /dev/null +++ b/source/tools/bclinux/vm_monitor/clean.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# 定义文件路径 +FILE_PATH="/tmp/vm_all_list.txt" +VM_GAUGE="/usr/local/sysak/.sysak_components/tools/vm_gauge.py" + +# 检查文件是否存在 +if [ -f "$FILE_PATH" ]; then + # 文件存在,执行删除操作 + rm -rf $FILE_PATH +else + # 文件不存在,打印消息 + echo "File $FILE_PATH does not exist." +fi + +# 检查文件是否存在 +if [ -f "$VM_GAUGE" ]; then + # 文件存在,执行删除操作 + rm -rf $VM_GAUGE +else + # 文件不存在,打印消息 + echo "File $FILE_PATH does not exist." +fi + + +# 查找运行中的 vm_gauge.py 进程 +pid=$(pgrep -f vm_gauge.py) + +# 如果找到了进程,则杀掉它 +if [ ! -z "$pid" ]; then + echo "Killing vm_gauge.py process with PID: $pid" + kill $pid + # 等待进程被杀掉 + wait $pid 2>/dev/null + echo "vm_gauge.py process has been terminated." +else + echo "No vm_gauge.py process is running." +fi + diff --git a/source/tools/bclinux/vm_monitor/vm_gauge.py b/source/tools/bclinux/vm_monitor/vm_gauge.py new file mode 100644 index 00000000..80549a89 --- /dev/null +++ b/source/tools/bclinux/vm_monitor/vm_gauge.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +import subprocess + +# 定义命令 +cmd = "virsh list --all" + +# 使用 subprocess.run 执行命令并捕获输出 +try: + result = subprocess.run(cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + #print("Command executed successfully") + #print("Output:") + print(result.stdout) + + # 处理输出 + lines = result.stdout.strip().split('\n') + vm_names = [] + for line in lines[2:]: # 跳过标题行和分割线 + fields = line.split() + if len(fields) > 1: + vm_name = fields[1] + vm_names.append(vm_name) + #print(f"Appending VM name: {vm_name} ") # 添加调试信息 + #print(f"Appending VM name: {vm_name}") # 添加调试信息 + + # 写入文件 + with open('/tmp/vm_all_list.txt', 'w') as f: + for name in vm_names: + f.write(name + '\n') + #print(f"Appending VM name to file: {name}") # 添加调试信息 + #print(f"Writing VM name to file: {name}") # 添加调试信息 + + # 在终端显示虚拟机名称 + print("VM Names:") + for name in vm_names: + print(name) + +except subprocess.CalledProcessError as e: + #print(f"An error occurred while executing the command: {e}") + print("CalledProcessError.") diff --git a/source/tools/bclinux/vm_monitor/vm_monitor_detect.sh b/source/tools/bclinux/vm_monitor/vm_monitor_detect.sh new file mode 100644 index 00000000..c4101856 --- /dev/null +++ b/source/tools/bclinux/vm_monitor/vm_monitor_detect.sh @@ -0,0 +1,74 @@ +#!/bin/bash +FILE_PATH="/usr/local/sysak/.sysak_components/tools" + +# 当前只支持x86_64架构 +#basearch=$(uname -m) +basearch=x86_64 + +create_service_file() +{ + cat << EOF > vm-monitor.service +[Unit] +Description=BC-LinuxOM vm-monitor Monitor +Documentation=BC-LinuxOM vm-monitor Monitor +Wants=network-online.target +After=network-online.target + +[Service] +ExecStart=/bin/sh -c "/usr/bin/python3 ${FILE_PATH}/vm_gauge.py" +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +} + +package_install() { + # 定义要安装的包列表 + local packages=(libvirt-devel numa* ncurses-devel) + + # 遍历包列表,检查每个包是否已安装 + for pkg in "${packages[@]}"; do + # 使用 yum list installed 检查包是否已安装 + if ! yum list installed "$pkg" &> /dev/null; then + # 如果包未安装,执行安装 + echo "Installing $pkg..." + yum install -y "$pkg" &> /dev/null + else + echo "$pkg is already installed." + fi + done +} + + +start_service() +{ + chmod a+x $FILE_PATH/vm_gauge.py + mv vm-monitor.service /usr/lib/systemd/system/vm-monitor.service + chmod 644 /usr/lib/systemd/system/vm-monitor.service + systemctl daemon-reload + systemctl enable vm-monitor.service + systemctl start vm-monitor.service + + # 查找运行中的 vm_gauge.py 进程 + pid=$(pgrep -f vm_gauge.py) + if [ ! -z "$pid" ]; then + echo "vm-monitor.service is running, the virsh list is:" + else + echo "vm-monitor.service isnot running." + fi + sleep 2 + cat /tmp/vm_all_list.txt + exit 0 +} + +main() +{ + mkdir -p $FILE_PATH + package_install > /dev/null 2>&1 + create_service_file + start_service +} + +main -- Gitee