dushenda

李德胜大大粉丝

dushenda

概念区分

ISA:Instruction Set Architecture,ISA 是硬件和软件之间的抽象接口(或者说是一份“合同”)。它定义了程序员或编译器编写软件时必须了解的所有信息,而不涉及硬件的具体电路设计。涵盖指令集(如 ADD, JUMP)、寄存器结构(如 RAX, R0)、数据类型、寻址模式、内存模型、中断处理等

微架构:Microarchitecture,微架构(又称计算机组织)是 ISA 的具体逻辑实现。它决定了处理器内部如何布置流水线、缓存、执行单元等。涵盖流水线级数、分支预测器、高速缓存(L1/L2/L3)的大小、乱序执行逻辑、算术逻辑单元(ALU)的数量等。

特性 ISA (指令集架构) 微架构 (Microarchitecture)
定义层面 抽象层 / 规范 物理层 / 实现
关注点 What(处理器能做什么) How(处理器如何高效执行)
使用者 编译器作者、汇编程序员 芯片设计师、硬件工程师
兼容性 跨代兼容(保证程序能跑) 每一代都在变(追求性能提升)
组成部分 指令、寄存器、数据格式 缓存、流水线、执行单元

一个 ISA 可以有多种微架构实现。 例如,Intel 和 AMD 的处理器微架构完全不同,但因为它们都遵循 x86 ISA,所以你编写的 .exe 程序在两者的 CPU 上都能正常运行。这就是为什么你可以自由更换 CPU 而不需要重装所有软件。

x86-Intel ISA

寄存器

寄存器类型 64位名称 数量 主要用途
通用寄存器 RAX-R15 16 数据运算、暂存、地址计算
栈指针 RSP, RBP 2 管理函数调用栈
指令指针 RIP 1 存储下一条指令地址
状态标志 RFLAGS 1 存储运算结果的状态(如正负、零)
向量寄存器 XMM/YMM 16/32 高性能并行计算 (SIMD)

32位的主要寄存器如下:

通用寄存器

x86 最大的特点是向下兼容,即嵌套模式。一个 64 位的寄存器实际上包含了它的 32 位、16 位和 8 位版本。例如A寄存器在32、16、8位上的区分如下:

  • RAX: 64 位全长 (x86-64)
  • EAX: 低 32 位 (x86-32)
  • AX: 低 16 位 (8086)
  • AH / AL: AX 的高 8 位和低 8 位

8 个传统寄存器及其特殊用途如下:

  • RAX (Accumulator): 累加器。系统调用的编号以及函数的返回值通常放在这里。
  • RBX (Base): 基址寄存器。常用于内存寻址。
  • RCX (Count): 计数器。循环指令(如 LOOP)或位移操作会自动使用它。
  • RDX (Data): 数据寄存器。在乘除法运算中存放溢出数据或余数。
  • RSI / RDI (Source/Destination Index): 源/目的变址寄存器。在字符串拷贝等操作中分别指向来源和目标地址。
  • RBP (Base Pointer): 栈基址指针。指向当前函数栈帧的底部。
  • RSP (Stack Pointer): 栈顶指针。永远指向当前线程栈的最顶部。

x86-64 新增寄存器如下:在 64 位模式下,Intel 额外增加了 8 个通用寄存器,命名简单粗暴:

  • R8, R9, R10, R11, R12, R13, R14, R15
  • 它们同样可以访问低位,例如 R8D (32位), R8W (16位), R8B (8位)。

指令指针寄存器(Instruction Pointer)

RIP (64位) / EIP (32位): 这是 CPU 的“指针”。它存储了下一条将要执行的指令在内存中的地址。程序员不能直接用 MOV 修改它,只能通过 JMPCALLRET 等指令间接改变它的值。

标志寄存器 (Flags Register)

FLASG/RFLAGS (64位) / EFLAGS (32位): 它不是存放一个大数字,而是由许多个“位”(Bit)组成的开关,反映了上一次运算的状态,从

  • 8086 (16位):叫 FLAGS
  • 80386 (32位):叫 EFLAGS(Extended FLAGS)。低 16 位和 8086 的 FLAGS 完全一样,高 16 位增加了如 VM(虚拟 8086 模式)、AC(对齐检查)等功能。
  • x86-64 (64位):叫 RFLAGS。它将 EFLAGS 扩展到 64 位,但目前高 32 位全部保留(全为 0),没有定义新的功能。

从Intel架构手册的图来看,S代表状态位共有6位,C代表控制位共有1位,X代表系统位共有10位。具体看Intel® 64 and IA-32 Architectures Software Developer’s Manual Volumn1中的3.4.3 EFLAGS Register一节中有详细介绍。

IOPL:I/O Privilege Level

段寄存器 (Segment Registers)

在现代 64 位系统中,段寄存器的作用已经大大削弱(基本进入“平坦模型”),但在底层内核开发中依然存在:

  • CS: 代码段寄存器(Code Segment)
  • DS / SS / ES: 数据段、栈段、附加段
  • FS / GS: 在现代 Windows/Linux 中常用于存储线程本地存储 (TLS) 的基地址。

多媒体与向量寄存器 (SIMD)

为了加速图像处理、科学计算和 AI 运算,x86 引入了超大的专用寄存器:

  • MMX (64位): 已过时。
  • XMM (128位): 用于 SSE 指令集(共 16 个,XMM0-XMM15)。
  • YMM (256位): 用于 AVX 指令集。
  • ZMM (512位): 用于 AVX-512 指令集。

控制寄存器

在Intel SDM第 3 卷(Volume 3A):System Programming Guide, Part 1有介绍(Section 2.5 CONTROL REGISTERS)。

内存组织

CPU工作状态

特性 实模式 (Real Mode) 保护模式 (Protected Mode) SMM 模式
可见性 用户/系统可见 用户/系统可见 对操作系统透明 (隐藏)
地址空间 仅 1 MB 4 GB (32位) / 理论 16 EB 独立的 SMRAM 空间
进入方式 上电自检、复位 修改 CR0.PE 位 硬件中断 (SMI)
主要用途 引导系统、DOS 运行现代操作系统 电源管理、硬件安全、BIOS 修复
权限级别 无 (全公开) 严格的分级 (Ring 0-3) 最高级别 (超越 Ring 0)

实模式 (Real-Address Mode),这是 CPU 上电后的“初始状态”,为了兼容 1978 年的 8086 处理器。

  • 寻址方式:使用简单的  × 16 + 。只能访问 1MB 的内存。
  • 特权级:没有特权级概念,任何程序都可以改写任何内存或直接操作硬件。
  • 用途:系统引导(BIOS/UEFI 初期)、简单的操作系统(如 MS-DOS)。
  • 缺点:非常不安全,没有内存保护,一个程序崩溃会导致全机死机。

保护模式 (Protected Mode),这是现代操作系统的运行基石(32位系统的核心,64位系统的基础)。

  • 寻址方式:通过 段描述符表 (GDT/LDT)分页机制 (Paging)。支持 4GB 甚至更大的虚拟内存。
  • 特权级:引入了 Ring 0 - Ring 3 的保护机制。
  • 用途:运行 Windows、Linux 等现代操作系统。
  • 核心逻辑:硬件强制执行访问控制。如果用户程序(Ring 3)试图访问内核内存(Ring 0),CPU 会抛出异常。

SMM 模式 (System Management Mode),SMM 被称为 “Ring -2”,因为它比操作系统内核(Ring 0)拥有更高的优先级,且对操作系统完全透明

  • 进入方式:只能通过硬件产生的 SMI (System Management Interrupt) 进入。当你按下电源键、笔记本合盖、或系统温度过高时,硬件会发出 SMI。
  • 可见性:一旦进入 SMM,CPU 会暂停当前运行的操作系统(不论是 Windows 还是内核),转而执行一段存储在 BIOS 中的特殊代码。操作系统根本不知道自己被暂停过。
  • 内存空间:它拥有独立的内存区域,称为 SMRAM。正常模式下的程序(包括内核)无法访问这块内存。
  • 退出方式:执行 RSM (Resume) 指令,CPU 恢复到被中断前的状态(无论是实模式还是保护模式)。

特权级别

x86把CPU分为四个特权等级,权限从ring0~ring3依次下降。

厘清几个概念,段选择子(SS)是一个一个内容抽象,存在在段寄存器中(Visible Part),x86的段寄存器有CS、DS、…等。其中段选择子的RPL(Requested Privilege Level)就代表了当前的指令在访问该段时“声明”的权限级别。

前两天社群有个用户用top命令查看进程时,有一个进程100%,以为CPU占满了,其实不然,下面我们就详细聊一下这个top命令。

很多人用 top 用了几年,却一直在错误解读它

下面,我们就用一张真实的 top 截图,系统性讲清楚 top 的正确使用方式,以及最容易踩的认知坑

先看截图图

MySQL 为何CPU能跑到 1265% ?

截图中最“刺眼”的一行:

PID   USER   VIRT   RES   %CPU   %MEM   COMMAND 6308  mysql 220.7g 212.7g 1265   84.5   mysqld

很多人第一反应:

“CPU 都 1265% 了?服务器要炸了”

但这恰恰是对 top 的第一个误解。上面截图中,MySQL服务多少有点问题,但业务并没有受影响。

误区 1:%CPU 最大只能是 100%

错误理解:

%CPU 是“CPU 使用率”,最大 100%

正确理解:

top 中的 %CPU = 使用的 CPU 核心数 × 100%

我的机器是 16 核

  • 100% = 1 个核满载

  • 1265% ≈ 12.6 个核被 mysqld 占用,并没有达到上限

结论:这台机器的 MySQL 不是异常显示,而是在多核上疯狂并行执行

误区 2:load average很高 = CPU 已经打满

截图顶部:

load average: 12.17, 11.71, 10.50

很多人一看到 load > 10,立刻下结论:

“CPU负载太高 快扛不住了!”

但你要先清楚一个问题:

这台机器有多少核?

正确判断方式

CPU 核数 load ≈ 核数 含义
4 核 load ≈ 4 接近满载
16 核 load ≈ 12 完全可接受
32 核 load ≈ 12 偏空闲

load average ≠ CPU 使用率它表示的是:正在运行 + 等待 CPU 的进程数

误区 3:id 很低才说明 CPU 有问题

截图中的 CPU 行:

%Cpu(s): 39.9 us, 0.4 sy, 58.6 id

58.6% idle

这说明什么?

CPU 一半以上是空闲的

这时候再结合:

  • mysqld:1265%

  • idle:58%

唯一合理的解释是:

多核机器 + 单个进程高并发消耗

误区 4:VIRT 很大 = 内存要炸

VIRT 220.7g RES  212.7g

很多人看到 VIRT 直接慌了:

“虚拟内存 220G?是不是内存泄漏?”

正确理解

字段 含义
VIRT 进程可用的虚拟地址空间
RES 真正占用的物理内存
SHR 可共享内存

MySQL 的 VIRT 很大是正常现象

  • InnoDB buffer pool

  • 内存映射文件

  • malloc 预留

判断内存是否有问题,看 RES + 系统是否 OOM,而不是看 VIRT

误区 5:free 很小 = 内存不够

截图中:

KiB Mem: 263973326 total 8088860 free 28235512 buff/cache 30766036 avail Mem

很多人盯着:

free 只有 8GB,内存要满了!

但 Linux 的内存哲学是:

不用白不用,有些在缓存中

真正要看的字段是:

avail Mem

  • avail ≈ 30GB

  • 说明:系统仍然有足够内存可用

误区 6:top 能直接定位“根因”

这张图最多能得出结论:

MySQL 正在大量消耗 CPU

但你完全不知道为什么,这个就要进入MySQL数据库查看了,很大可能是慢SQL的问题。

正确使用 top

先确认 CPU 核数

lscpu

load 要和核数对比

load < CPU核数 ≠ 性能问题

%CPU > 100% 是常态

多核时代,不懂这个等于白用 top

内存优先看 avail,不是 free,不是 buff/cache

搬运

CPU占用达1265%,一点都不慌,90% 的人都误解了 top命令

qemu cheatsheet

一、基本虚拟机启动

1. 基本启动虚拟机

启动x86_64虚拟机加载镜像(基本用法)。

1
qemu-system-x86_64 -drive file=disk.img,if=virtio

2. 无图形界面启动

无头模式启动VM(-nographic)。

1
qemu-system-x86_64 -nographic -drive file=disk.img

3. 指定CPU核心数

指定4核CPU启动(-smp 4)。

1
qemu-system-x86_64 -smp 4 -drive file=disk.img

4. 指定内存大小

分配2GB内存启动(-m 2G)。

1
qemu-system-x86_64 -m 2G -drive file=disk.img

5. 启用KVM加速

启用KVM硬件加速(-enable-kvm)。

1
qemu-system-x86_64 -enable-kvm -drive file=disk.img

6. 指定机器类型

指定q35机器类型启动(-machine q35)。

1
qemu-system-x86_64 -machine q35 -drive file=disk.img

7. 引导顺序指定

指定从硬盘引导(-boot order=c)。

1
qemu-system-x86_64 -boot order=c -drive file=disk.img

8. CD-ROM镜像启动

附加CD-ROM镜像启动(-cdrom)。

1
qemu-system-x86_64 -cdrom iso.img -drive file=disk.img

9. USB设备模拟

模拟USB设备启动(-usb)。

1
qemu-system-x86_64 -usb -drive file=disk.img

10. 守护进程模式启动

后台守护进程启动VM(-daemonize)。

1
qemu-system-x86_64 -daemonize -drive file=disk.img

二、设备配置与直通

11. VirtIO磁盘配置

使用VirtIO SCSI磁盘(-drive if=virtio)。

1
qemu-system-x86_64 -drive file=disk.img,if=virtio,format=qcow2

12. PCI设备直通

直通主机PCI设备到VM(-device vfio-pci)。

1
qemu-system-x86_64 -device vfio-pci,host=0000:01:00.0 -drive file=disk.img

13. USB主机设备直通

直通USB设备(-usbdevice host)。

1
qemu-system-x86_64 -usb -device usb-host,vendorid=0x1234,productid=0x5678 -drive file=disk.img

14. 网络设备配置

配置用户模式网络(-netdev user)。

1
qemu-system-x86_64 -netdev user,id=mynet -device virtio-net,netdev=mynet -drive file=disk.img

15. 桥接网络配置

桥接主机网络接口(-netdev bridge)。

1
qemu-system-x86_64 -netdev bridge,id=mynet,br=br0 -device virtio-net,netdev=mynet -drive file=disk.img

16. TAP网络配置

使用TAP接口网络(-netdev tap)。

1
qemu-system-x86_64 -netdev tap,id=mynet,ifname=tap0 -device virtio-net,netdev=mynet -drive file=disk.img

17. VFIO GPU直通

直通GPU设备并配置VGA(-vfio-pci -vga none)。

1
qemu-system-x86_64 -device vfio-pci,host=0000:01:00.0 -vga none -drive file=disk.img

18. 多磁盘附加

附加多个磁盘设备(-drive 多行)。

1
qemu-system-x86_64 -drive file=disk1.img,if=virtio -drive file=disk2.img,if=virtio -drive file=disk.img

19. 串口设备配置

配置串口重定向到stdio(-serial stdio)。

1
qemu-system-x86_64 -serial stdio -drive file=disk.img

20. 块设备缓存模式

指定磁盘缓存模式为none(cache=none)。

1
qemu-system-x86_64 -drive file=disk.img,cache=none,if=virtio

三、网络与迁移

21. 多网卡配置

配置多个网卡接口(-netdev 多行)。

1
qemu-system-x86_64 -netdev user,id=net1 -device virtio-net,netdev=net1 -netdev user,id=net2 -device virtio-net,netdev=net2 -drive file=disk.img

22. VLAN网络隔离

使用VLAN隔离网卡(-net vlan=1)。

1
qemu-system-x86_64 -net user,vlan=1 -drive file=disk.img

23. 实时迁移VM

迁移VM到远程主机(-incoming tcp)。

1
# 源: qemu-system-x86_64 -drive file=disk.img -incoming tcp:0:4444 (目标先启动)# 目标: migrate -d tcp:remote-host:4444

24. 迁移压缩优化

启用迁移压缩加速(-comp xbzrle)。

1
qemu-system-x86_64 -drive file=disk.img -enable-kvm -comp xbzrle

25. 多线程迁移

启用多线程迁移(-thread multi)。

1
qemu-system-x86_64 -drive file=disk.img -thread multi

26. 网络端口转发

转发主机端口到VM(-net user,hostfwd)。

1
qemu-system-x86_64 -net user,hostfwd=tcp::8080-:80 -drive file=disk.img

27. SMB网络共享

配置SMB网络共享到VM(-net user,smb)。

1
qemu-system-x86_64 -net user,smb=/path/to/share -drive file=disk.img

28. VDE网络配置

使用VDE交换机网络(-net vde)。

1
qemu-system-x86_64 -net vde,sock=/tmp/vde.sock -drive file=disk.img

29. 网络限速配置

限制网络带宽(-net user,throttle)。

1
qemu-system-x86_64 -net user,throttle=100 -drive file=disk.img

30. 迁移快照链

迁移时处理快照链(-drive snapshot=on)。

1
qemu-system-x86_64 -drive file=disk.img,snapshot=on

四、图形与输入输出

31. VNC图形界面

启用VNC远程桌面(-vnc)。

1
qemu-system-x86_64 -vnc :0 -drive file=disk.img

32. SPICE图形加速

使用SPICE协议图形(-spice)。

1
qemu-system-x86_64 -spice port=5900,disable-ticketing=on -drive file=disk.img

33. SDL图形界面

使用SDL库图形输出(-sdl)。

1
qemu-system-x86_64 -sdl -drive file=disk.img

34. 键盘布局指定

指定键盘布局为en-us(-k en-us)。

1
qemu-system-x86_64 -k en-us -drive file=disk.img

35. 鼠标输入配置

配置绝对鼠标输入(-usbdevice tablet)。

1
qemu-system-x86_64 -usb -device usb-tablet -drive file=disk.img

36. 图形分辨率设置

设置VGA分辨率(-vga std -full-screen)。

1
qemu-system-x86_64 -vga std -full-screen -drive file=disk.img

37. 多监视器配置

配置多个图形输出(-device virtio-gpu)。

1
qemu-system-x86_64 -device virtio-gpu -drive file=disk.img

38. 音频设备模拟

模拟音频设备输出(-soundhw ac97)。

1
qemu-system-x86_64 -soundhw ac97 -drive file=disk.img

39. 剪贴板共享

启用SPICE剪贴板共享(-spice clipboard=on)。

1
qemu-system-x86_64 -spice port=5900,clipboard=on -drive file=disk.img

40. 图形加速Virgl

启用Virgl 3D加速(-device virtio-gpu-virgl)。

1
qemu-system-x86_64 -device virtio-gpu-virgl -drive file=disk.img

五、调试与监视

41. GDB调试连接

启用GDB调试服务器(-s -S)。

1
qemu-system-x86_64 -s -S -drive file=disk.img

42. 监视器控制台

启用QMP监视器(-monitor stdio)。

1
qemu-system-x86_64 -monitor stdio -drive file=disk.img

43. QMP套接字监视

使用UNIX套接字QMP监视(-qmp unix)。

1
qemu-system-x86_64 -qmp unix:/tmp/qmp.sock,server,nowait -drive file=disk.img

44. 性能跟踪

启用性能跟踪日志(-d cpu)。

1
qemu-system-x86_64 -d cpu -drive file=disk.img

45. 日志文件输出

输出日志到文件(-D logfile)。

1
qemu-system-x86_64 -D qemu.log -drive file=disk.img

46. 内核调试模式

调试Linux内核(-kernel -initrd -append)。

1
qemu-system-x86_64 -kernel bzImage -initrd initrd.img -append "console=ttyS0" -drive file=disk.img

47. 内存转储

转储VM内存到文件(-mem-path)。

1
qemu-system-x86_64 -mem-path /tmp/mem.dump -drive file=disk.img

48. 事件监视脚本

使用脚本监视事件(-trace events=events.txt)。

1
qemu-system-x86_64 -trace events=events.txt -drive file=disk.img

49. CPU热插拔监视

启用CPU热插拔并监视(-smp 1,maxcpus=4)。

1
qemu-system-x86_64 -smp 1,maxcpus=4 -drive file=disk.img

50. 调试符号加载

加载调试符号启动(-gdb tcp::1234)。

1
qemu-system-x86_64 -gdb tcp::1234 -drive file=disk.img

常见QEMU语句

Typing vagrant from the command line will display a list of all available commands.

Be sure that you are in the same directory as the Vagrantfile when running these commands!

Creating a VM

  • vagrant init – Initialize Vagrant with a Vagrantfile and ./.vagrant directory, using no specified base image. Before you can do vagrant up, you’ll need to specify a base image in the Vagrantfile.
  • vagrant init <boxpath> – Initialize Vagrant with a specific box. To find a box, go to the public Vagrant box catalog. When you find one you like, just replace it’s name with boxpath. For example, vagrant init ubuntu/trusty64.

Starting a VM

  • vagrant up – starts vagrant environment (also provisions only on the FIRST vagrant up)
  • vagrant resume – resume a suspended machine (vagrant up works just fine for this as well)
  • vagrant provision – forces reprovisioning of the vagrant machine
  • vagrant reload – restarts vagrant machine, loads new Vagrantfile configuration
  • vagrant reload --provision – restart the virtual machine and force provisioning

Getting into a VM

  • vagrant ssh – connects to machine via SSH
  • vagrant ssh <boxname> – If you give your box a name in your Vagrantfile, you can ssh into it with boxname. Works from any directory.

Stopping a VM

  • vagrant halt – stops the vagrant machine
  • vagrant suspend – suspends a virtual machine (remembers state)

Cleaning Up a VM

  • vagrant destroy – stops and deletes all traces of the vagrant machine
  • vagrant destroy -f – same as above, without confirmation

Boxes

  • vagrant box list – see a list of all installed boxes on your computer
  • vagrant box add <name> <url> – download a box image to your computer
  • vagrant box outdated – check for updates vagrant box update
  • vagrant box remove <name> – deletes a box from the machine
  • vagrant package – packages a running virtualbox env in a reusable box

Saving Progress

-vagrant snapshot save [options] [vm-name] <name> – vm-name is often default. Allows us to save so that we can rollback at a later time

Tips

  • vagrant -v – get the vagrant version
  • vagrant status – outputs status of the vagrant machine
  • vagrant global-status – outputs status of all vagrant machines
  • vagrant global-status --prune – same as above, but prunes invalid entries
  • vagrant provision --debug – use the debug flag to increase the verbosity of the output
  • vagrant push – yes, vagrant can be configured to deploy code!
  • vagrant up --provision | tee provision.log – Runs vagrant up, forces provisioning and logs all output to a file

Plugins

  • vagrant-hostsupdater : $ vagrant plugin install vagrant-hostsupdater to update your /etc/hosts file automatically each time you start/stop your vagrant box.

Notes

  • If you are using VVV, you can enable xdebug by running vagrant ssh and then xdebug_on from the virtual machine’s CLI.

常用命令

启动与关闭

操作 命令 说明
启动 virsh start <虚拟机名> 启动一个处于关闭状态的虚拟机
正常关机 virsh shutdown <虚拟机名> 模拟按下电源键,优雅关机(推荐)
强制关闭 virsh destroy <虚拟机名> 相当于直接拔掉电源,仅在卡死时使用
重启 virsh reboot <虚拟机名> 重启虚拟机
强制重置 virsh reset <虚拟机名> 强制硬重启

 挂起与恢复

操作 命令 说明
挂起 virsh suspend <虚拟机名> 暂停虚拟机,内存数据保留在主机
恢复 virsh resume <虚拟机名> 从挂起状态恢复运行

 自启动配置

  • 设置开机自启: virsh autostart <虚拟机名>
  • 取消开机自启: virsh autostart --disable <虚拟机名>
  • 查看自启列表: virsh autostart --list

虚拟机信息查询

 基本状态查询

1
2
3
4
5
6
7
8
# 列出所有虚拟机(运行中+已关闭)
virsh list --all

# 查看虚拟机详细信息(UUID、OS类型、最大内存等)
virsh dominfo <虚拟机名>

# 仅查看虚拟机当前状态(running/shut off/paused)
virsh domstate <虚拟机名>

配置与连接信息

1
2
3
4
5
6
7
8
# 导出完整的XML配置(非常重要!)
virsh dumpxml <虚拟机名>

# 搜索特定配置(例如查看磁盘路径)
virsh dumpxml <虚拟机名> | grep -A 5 "<source file"

# 查看VNC远程连接端口
virsh vncdisplay <虚拟机名>

资源监控

1
2
3
4
5
6
7
8
9
10
11
# 查看CPU使用统计
virsh cpu-stats <虚拟机名>

# 查看内存使用详情
virsh dommemstat <虚拟机名>

# 查看挂载的硬盘列表
virsh domblklist <虚拟机名>

# 查看虚拟网卡列表及MAC地址
virsh domiflist <虚拟机名>

虚拟机配置管理

XML配置编辑(核心)

KVM的所有配置都存储在XML文件中:

编辑配置(推荐)

1
virsh edit <虚拟机名>

使用此命令会自动检查XML语法,保存生效。不要直接去改 /etc/libvirt/qemu/ 下的文件,容易出错。

备份配置

1
virsh dumpxml <虚拟机名> > vm-config.xml

从XML恢复/定义

1
virsh define vm-config.xml   # 注册虚拟机(不启动)

删除与重命名

取消定义(删除配置)

1
virsh undefine <虚拟机名>
> 此命令只删除配置文件,不会删除虚拟磁盘文件! 彻底删除(配置+磁盘)
1
virsh undefine --remove-all-storage <虚拟机名>
> 高危操作: 请务必确认磁盘数据已不再需要,执行后不可恢复!

重命名虚拟机

1
virsh domrename <旧名称> <新名称>

状态检查与配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# IB设备的状态
ibstat

# IB设备的细节
ibv_devinfo

# 列出所有的IB设备
ibdevices

# 检查IB设备端口状态
iblinkinfo

# 查看IB地址配置
ibaddr

# 显示IB端口状态细节信息
ibportstate

# 显示IB端口统计信息
ibportinfo

配置和管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 配置IB设备,显示IB和以太设备的映射关系
ibdev2netdev
ibdev2netdev -v

# 设置IB设备到一个特定的驱动
ibdriver

# 更新IB设备固件
mstflint -d <device> qflash <firmware_file.bin>

# 列出IB设备所有可获取的路径
ibpathln

# 节点间所有的IB连接
ibnetdiscover

# 查询固件参数
mlxconfig -d ${PCI_ID} q

# 设置端1为以太模式,端口2为IB模式
mlxconfig -d ${PCI_ID} set LINK_TYPE_P1=2 LINK_TYPE_P2=1

# 配置设置的SRIOV开启和个数
mlxconfig -d ${PCI_ID} set SRIOV_EN=1 NUM_OF_VFS=8

# 配置链路聚合模式,队列亲和性
mlxconfig -d ${PCI_ID} s LAG_RESOURCE_ALLOCATION=0

# 允许压缩CQE(小包调优,其他可能性能劣化)
mlxconfig -d ${PCI_ID} s CQE_COMPRESSION=1

固件更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更新NIC卡固件(非OEM卡)
mlxfwmanager

# 常用的固件烧录命令(卡和包PSID要一致)
mstflint -d "${PCI_ID}" -i "${NEW_FIRMWARE_BIN}" burn
flint -d "${PCI_ID}" -i "${NEW_FIRMWARE_BIN}" burn

# 查询固件的全量信息
mstflint -d ${PCI_ID} query full

# 忽略PSID强制烧入固件
mstflint -d "${PCI_ID}" -i "${NEW_FIRMWARE_BIN}" -allow_psid_change burn


性能测试和监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试两设备见IB性能(时延和带宽)
ib_send_bw <device> <destination>

# 测试IB RDMA性能
ib_send_lat <device> <destination>

# 监控IB设备流量
ibstat -i <device> -s

# 监控IB设备错误
iberrdump

# mlnx调优
mlnx_tune -h
mlnx_tune -v
mlnx_tune -q
mlnx_tune -p HIGH_THROUGHPUT

配置RDMA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查RDMA配置
rdma link

# 设置IB设备RDMA用途
rdma_resolve_route

# 测试IB的RDMA性能
ib_send_lat -D <device> <destination>

# 检查RDMA安全和权限
rdma_sec

# 配置RDMA加密和安全
rdma_auth

定位问题

1
2
3
4
5
6
7
8
9
10
11
# 检查多节点的IB配置
ibnetdiscover

# dmesg显示ib 相关打印
dmesg | grep -i ib

# 查看IB日志
tail -f /var/log/ib_log

# 检查IB端口状态
ibportstate

配置和管理IB子网

1
2
3
4
5
6
7
8
# 显示IB网络信息
ibnetdiscover -v

# 设置IB网络管理
sm_profile

# 检查IB网口状态
ibstat -s

Mellanox管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 网卡状态查询
mst status -v

# 开启mst服务
mst start

# 配置RDMA的Mellanox设备
rdma_configure_device

# 安装配置Mellanox管理软件
mstflint -d <device> qflash <firmware_file.bin>

# 获取网卡qos配置
mlnx_qos -i eth2

# 设置网卡端口的0~7 PFC优先级
mlnx_qos -i eth2 -f 0,0,0,1,0,0,0,0

配置IB QoS

1
2
3
4
5
6
7
8
9
# Set quality of service policy for InfiniBand
# 设置IB qos
ib_qos_policy

# 配置IB流优先级
ib_flowcontrol

# 检查QoS配置和流优先级
ib_qos_show

参考