# 7. KVM 系统监控

2024年7月16日16分钟阅读

- FormalSciences/ComputerScience
- OperatingSystem/Virtualization
- KVM

## 监控概述

在 KVM（Kernel-based Virtual Machine）虚拟化环境中，监控是确保系统稳定性、性能优化和故障排查的重要手段。本文将探讨监控的必要性、基本原则以及常用的监控工具。

### 为什么需要监控？

- 确保系统稳定性：
  - 通过监控系统资源使用情况和性能指标，可以及时发现潜在的问题，防止系统崩溃或服务中断。
  - 实时监控有助于预防性维护，提前识别并解决硬件或软件故障。
- 优化性能：
  - 监控数据提供了关于资源使用的详细信息，帮助管理员优化虚拟机配置和资源分配，以提高整体系统性能。
  - 通过性能趋势分析，可以发现并消除系统瓶颈，提升用户体验。
- 故障排查：
  - 监控日志和性能指标记录了系统运行的详细信息，帮助管理员快速定位和解决故障。
  - 实时报警功能可以在问题发生时立即通知管理员，减少故障排除时间和系统停机时间。
- 容量规划：
  - 监控资源使用趋势和增长情况，有助于进行合理的容量规划，确保系统在未来增长中仍能稳定运行。
  - 提前规划资源扩展，避免资源不足导致的性能下降。

### 监控的基本原则

原则 | 详细内容
--- | ---
全面覆盖 | 监控系统应覆盖所有关键组件，包括 CPU、内存、磁盘、网络等资源，以及虚拟机和宿主机的状态。 监控范围还应包括应用层面的性能指标，以全面掌握系统运行状况。
实时性 | 监控系统应提供实时的数据采集和报警功能，确保在问题发生时能够立即响应。 实时监控有助于快速发现和解决突发问题，减少对业务的影响。
历史记录 | 监控系统应保存历史数据，便于进行趋势分析和性能基线建立。 历史记录有助于识别长期趋势和周期性问题，进行有效的容量规划和性能优化。
报警机制 | 监控系统应具备灵活的报警机制，根据预定义的阈值触发报警，通知管理员采取措施。 报警应支持多种通知方式（如邮件、短信、即时通讯工具），确保及时传达信息。
可视化展示 | 监控数据应通过可视化的方式展示，便于管理员直观了解系统状态和性能指标。 可视化工具（如仪表盘、图表）有助于快速识别问题和进行数据分析。

### 常用的监控工具

工具 | 概述 | 特点
--- | --- | ---
Prometheus | Prometheus 是一款开源的系统监控和报警工具，特别适用于云原生和容器化环境。 | 高效的数据采集和存储，强大的查询语言（PromQL），灵活的报警机制，丰富的可视化支持（如 Grafana）。
Grafana | Grafana 是一款开源的可视化和分析平台，用于展示和监控系统数据。 | 支持多种数据源（如 Prometheus、InfluxDB、Elasticsearch），强大的仪表盘和图表功能，灵活的报警和通知机制。
Zabbix | Zabbix 是一款开源的企业级监控解决方案，适用于大规模分布式系统的监控。 | 全面的监控功能，灵活的报警机制，强大的数据可视化和报告生成能力，广泛的社区支持。
Nagios | Nagios 是一款经典的开源监控工具，广泛应用于 IT 基础设施的监控。 | 灵活的插件机制，支持多种监控对象，可靠的报警和通知功能，丰富的社区插件。
Collectd | Collectd 是一款轻量级的系统统计收集工具，用于收集和传输系统性能数据。 | 高效的数据采集，多种插件支持，灵活的数据输出选项（如写入 InfluxDB、Graphite）。
Telegraf | Telegraf 是一个开源的服务器代理，用于收集和发送指标数据，作为 TICK（Telegraf, InfluxDB, Chronograf, Kapacitor）堆栈的一部分。 | 插件驱动的架构，支持多种输入和输出插件，易于集成和扩展。

## 使用内置工具监控

KVM（Kernel-based Virtual Machine）环境中，内置的监控工具如 `virsh` 和 `virt-top` 提供了便捷的虚拟机监控方法，帮助管理员实时了解虚拟机的运行状态和资源使用情况。本文将详细介绍如何使用 `virsh` 和 `virt-top` 进行监控。

### 使用 `virsh` 进行监控

`virsh` 是 libvirt 提供的命令行工具，用于管理和监控 KVM 虚拟机。通过 `virsh` 命令，可以查看虚拟机的信息和资源使用情况。

#### 查看虚拟机信息

使用 `virsh` 命令可以查看虚拟机的基本信息，包括状态、配置和资源分配情况：

1. 列出所有虚拟机：

       virsh list --all

   输出示例：

        Id    Name                           State
       ----------------------------------------------------
        1     myvm                           running
        -     testvm                         shut off

2. 查看虚拟机详细信息：

       virsh dominfo <VM名>

   输出示例：

       Id:             1
       Name:           myvm
       UUID:           2d4c3b1c-467d-4b88-8f0d-5b63a3c6e29d
       OS Type:        hvm
       State:          running
       CPU(s):         4
       Max memory:     2097152 KiB
       Used memory:    2097152 KiB
       Persistent:     yes
       Autostart:      disable
       Managed save:   no

#### 监控资源使用情况

通过 `virsh` 命令，可以监控虚拟机的实时资源使用情况，包括 CPU 和内存使用情况：

1. 查看虚拟机 CPU 和内存使用情况：

       virsh domstats <VM名>

   输出示例：

       Domain: 'myvm'
         state.state=1
         state.reason=1
         cpu.time=1234567890
         cpu.user=234567890
         cpu.system=34567890
         balloon.current=2097152
         balloon.maximum=2097152
         balloon.swap_in=0
         balloon.swap_out=0
         balloon.major_fault=0
         balloon.minor_fault=12345
         balloon.usable=1987654
         ...

2. 查看所有虚拟机的资源使用情况：

       virsh list --all --name | xargs -I{} virsh domstats {}

   该命令将列出所有虚拟机的资源使用统计信息，便于管理员进行整体监控。

### 使用 `virt-top` 监控

`virt-top` 是一个类似于 `top` 的命令行工具，用于实时监控 KVM 虚拟机的性能和资源使用情况。通过 `virt-top`，管理员可以直观地查看每个虚拟机的 CPU、内存、磁盘和网络使用情况。

#### 安装和配置 `virt-top`

1. 安装 `virt-top`：

       ## 在基于 Debian 的系统（如 Ubuntu）上
       sudo apt-get install virt-top

       ## 在基于 RHEL 的系统（如 CentOS）上
       sudo yum install virt-top

1. 配置 `virt-top`：

   安装完成后，运行 `virt-top` 命令启动监控：

       sudo virt-top

### 使用 `virt-top` 查看虚拟机性能

`virt-top` 提供了一个交互式界面，显示每个虚拟机的详细性能数据：

1. 启动 `virt-top`：

       sudo virt-top

   输出示例：

       virt-top 0.5.12                     x86_64 libvirt 6.0.0
       2 domains, 1 active, 1 running, 0 sleeping, 0 paused, 0 inactive D:0 O:0 X:0
       CPU: 2.0%  Mem: 2097152 kB (64.0%)  RSS: 512 MB
       Domains: 2     ID S RDRQ RDRS WRRQ WRRS RXBY TXBY %CPU %MEM
         1 myvm       1 R    0    0    0    0    0    0  2.0 64.0

2. 查看具体虚拟机的详细信息：

   - 在 `virt-top` 界面中，使用箭头键选择具体的虚拟机，然后按回车键查看详细信息。
   - 可以查看的性能指标包括：CPU 使用率、内存使用率、磁盘读写、网络接收和发送等。

3. 自定义视图和排序：

   - 按 `f` 键选择要显示的字段，可以选择 CPU、内存、磁盘、网络等不同的监控指标。
   - 按 `s` 键选择排序方式，可以按 CPU 使用率、内存使用率、磁盘 I/O 等进行排序，方便定位高负载的虚拟机。

通过使用 `virsh` 和 `virt-top` 工具，管理员可以方便地监控 KVM 虚拟化环境中虚拟机的运行状态和资源使用情况。这些工具提供了丰富的命令和参数，可以满足大部分日常监控和性能分析的需求。在实际应用中，应根据具体需求和环境特点，选择合适的监控工具和方法，以确保虚拟机和宿主机的稳定运行和高效性能。

## 使用系统监控工具

除了专门的虚拟化监控工具，系统自带的监控工具如 `top`、`htop`、`iotop` 和 `iftop` 也可以用来监控 KVM 虚拟化环境中的性能。本文将详细介绍这些工具的使用方法，包括查看系统整体性能、监控虚拟机的资源占用、监控磁盘 I/O 性能以及监控网络流量。

## 使用 `top` 和 `htop`

### 查看系统整体性能

`top` 和 `htop` 是常用的系统性能监控工具，提供了关于系统资源使用的实时信息：

1. 使用 `top` 查看系统性能：启动 `top`：

       top

   输出示例：

       top - 14:55:30 up 10 days,  2:48,  3 users,  load average: 0.00, 0.01, 0.05
       Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie
       %Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
       KiB Mem :  2048.0 total,   104.0 free,   512.0 used,  1432.0 buff/cache
       KiB Swap:  1024.0 total,  1024.0 free,     0.0 used.  1480.0 avail Mem

         PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
        1234 root      20   0  162180   7644   4388 S   0.3  0.4   0:00.03 qemu-kvm
        ...

   该命令显示系统的 CPU、内存使用情况，以及每个进程的资源占用。

2. 使用 `htop` 查看系统性能：启动 `htop`（如果未安装，可以通过 `sudo apt-get install htop` 或 `sudo yum install htop` 安装）：

       htop

   `htop` 提供了比 `top` 更友好的界面，支持鼠标操作和自定义视图。可以使用上下箭头键浏览进程，使用 F2 键进入设置界面。

### 监控虚拟机的资源占用

在 `top` 和 `htop` 中，可以通过筛选 KVM 相关进程来监控虚拟机的资源占用情况：

1. 使用 `top` 监控虚拟机资源占用：

   启动 `top` 后，按 `u` 键，然后输入虚拟机所属用户（通常是 qemu 或 libvirt），按回车键：

       top -u qemu

   该命令将只显示属于该用户的进程，包括 KVM 虚拟机进程。

2. 使用 `htop` 监控虚拟机资源占用：启动 `htop` 后，按 `F4` 键进入过滤模式，然后输入 `qemu` 或虚拟机进程名：

       htop

## 使用 `iotop`

`iotop` 是一个用于监控磁盘 I/O 性能的工具，可以帮助找出性能瓶颈。需要 root 权限运行。

### 监控磁盘 I/O 性能

1. 安装 `iotop`：

       # 在基于Debian的系统上
       sudo apt-get install iotop

       # 在基于RHEL的系统上
       sudo yum install iotop

2. 启动 `iotop`：

       sudo iotop

   输出示例：

       less复制代码Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
       Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
        TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
       1234 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 %  [kworker/0:1]
       ...

   `iotop` 显示每个进程的实时磁盘读写速度，帮助管理员识别高 I/O 负载进程。

### 找出性能瓶颈

1. 通过排序和过滤找出 I/O 瓶颈：
   - 在 `iotop` 界面中，按 `O` 键只显示正在进行 I/O 操作的进程。
   - 按 `P` 键根据 I/O 优先级排序，或按 `T` 键根据线程排序，快速定位高 I/O 负载进程。
2. 查看具体进程的 I/O 使用情况：
   - 使用上下箭头键选择具体进程，查看详细的 I/O 读写情况。可以通过进程 ID（PID）进一步分析相关进程的具体操作和配置。

## 使用 `iftop`

`iftop` 是一个实时网络流量监控工具，可以帮助分析网络性能问题。

### 监控网络流量

1. 安装 `iftop`：

       ## 在基于 Debian 的系统上
       sudo apt-get install iftop

       ## 在基于 RHEL 的系统上
       sudo yum install iftop

2. 启动 `iftop`：

       sudo iftop

   输出示例：

       interface: eth0
       IP address is: 192.168.1.10
       MAC address is: 00:1a:4b:16:01:59
       Listening on port 0000
       ---------------------------------------------------
       192.168.1.10                => 192.168.1.1            123KB  456KB  789KB
                                    <=                        23KB   56KB   89KB
       ...

   `iftop` 显示网络接口的实时流量情况，包括发送和接收数据的速率。

### 分析网络性能问题

1. 通过排序和过滤分析流量：
   - 在 `iftop` 界面中，按 `P` 键切换端口显示模式，按 `N` 键切换主机名显示模式，按 `S` 键切换源地址和目的地址显示顺序。
   - 使用 `l` 键限制显示特定网络接口的流量，帮助聚焦分析特定接口的网络性能。
2. 查看具体连接的流量使用情况：
   - 使用上下箭头键选择具体连接，查看详细的流量使用情况。可以进一步分析哪些主机或服务占用了过多的网络带宽。

通过使用系统监控工具如 `top`、`htop`、`iotop` 和 `iftop`，管理员可以实时了解 KVM 虚拟化环境中系统资源的使用情况，快速识别并解决性能问题，确保虚拟机和宿主机的稳定运行和高效性能。在实际应用中，应结合具体需求和环境特点，灵活使用这些工具进行系统监控和性能优化。