硬件辅助虚拟化的情况下,CPU提供了根模式和非根模式,VMM 运行在根模式下,拥有最高的特权级别,可以直接访问物理硬件资源。Guest OS 运行在非根模式(VMX)下,当它执行敏感指令时,处理器会自动切换到根模式,由 VMM 进行处理。
QEMU会为每个vcpu创建一个线程,这个线程会通过ioctl给KVM发送KVM_RUN
指令让CPU进入VMX模式并切换成VM的上下文。
VMCB(VM控制块)可以被两种模式(root, vmx)访问,所以可以用来存储:
敏感指令包括:
特权指令包括:
do_IRQ()
下半部执行的三种方式:
Virtio 是一种 I/O 半虚拟化解决方案,主要用于提高虚拟机与宿主机之间的 I/O 性能.
基本架构
register_virtio_driver
来注册。它定义了上层的设备驱动以及所支持的设备ID,设备的feature table,以及一系列的回调函数。virtio使用流程:
register_virtio_driver
来注册virtio驱动virtio_find_vqs
来申请所需要的virtqueueadd_buffer
函数来添加数据,添加完成后调用kick
通知Hypervisorget_buffer
函数来获取数据,也可以睡眠,等待被callback唤醒NUMA(Non - Uniform Memory Access,非一致内存访问)是一种计算机内存设计架构,以下是它的相关介绍:
基本概念
numactl --membind=0 <command>
numactl --interleave=all <command>
numactl --membind=0 --cpunodebind=0 -p 1234
numactl --interleave=all <command>
自定义资源定义(CRD)
网络管理
存储管理
SR - IOV(Single Root I/O Virtualization)即单根 I/O 虚拟化,以下是关于它的详细介绍:
基本概念
物理功能(PF)和虚拟功能(VF)
工作原理
技术优势
thread_info
结构体,内核可以通过它找到在slab分配器中动态分配的task_struct创建过程:
dup_task_struct
为子进程创建一个内核栈、thread_info和task_struct,值与当前进程相同线程的创建通常是通过clone系统调用来做的,和进程的创建过程类似。只不过是标志位设置成了CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND
以共享进程的地址空间、文件系统信息、文件描述符、信号处理程序。
内核线程与普通进程的区别在于没有自己的地址空间,即task_struct中的mm被设置为NULL。
销毁过程:
TASK_ZOMBIE
,仅保留了内核栈、thread_info、task_struct给父进程提供信息调度类 | 调度策略 | 调度对象 |
---|---|---|
stop_sched_class(停机调度类) | 无 | 停机的进程 |
dl_sched_class(限期调度类) | SCHED_DEADLINE | dl进程 |
rt_sched_class(实时调度类) | SCHED_RR 或者 SCHED_FIFO | 实时进程 |
fair_sched_class(公平调度类) | SCHED_NORMAL 或者 SCHED_BATCH | 普通进程 |
idle_sched_class(空闲调度类) | SCHED_IDLE | idle进程 |
stop_sched_class > dl_sched_class > rt_sched_class > fair_sched_class > idle_shced_class
sched_latency_ns
,目标是让每个进程在这个周期内至少有机会运行一次,换一种说法就是每个进程等待CPU的时间最长不超过这个调度周期;然后根据进程的数量,大家平分这个调度周期内的CPU使用权,由于进程的优先级即nice值不同,分割调度周期的时候要加权;每个进程的累计运行时间保存在自己的vruntime
字段里,哪个进程的vruntime
最小就获得本轮运行的权利。进程的运行时间 = (调度周期时间 * 进程的weight) / CFS运行队列的总weight
SCHED_FIFO
和SCHED_RR
用来调度实时进程,SCHED_FIFO
会一直占用CPU直到自己退出或者被优先级更高的实时进程抢占,SCHED_RR
是同样优先级的实时进程按照时间片轮转调度vruntime
,选择vruntime
最小的进程进行调度task_struct
中的sched_entity
记录了虚拟运行时间vruntime
,内核用自平衡二叉搜索树红黑树来组织可运行进程队列vruntime += 实际运行时间 * (NICE_0_LOAD/NICE_LOAD)
NICE_0_LOAD为nice值为0时的权重,NICE_LOAD为当前进程nice值的权重schedule()
会调用context_switch()
来:switch_mm()
:切换新进程的虚拟地址空间switch_to()
:切换新进程的处理器状态need_resched
标志,如果被设置则重新调度,抢占用户程序的执行threed_info
中的preempt_count
记录了持有锁的数量,如果为0
表明可以被抢占top/htop
free
作用:显示系统内存(包括物理内存和交换空间)的使用情况。例如,free -m以 MB 为单位显示内存的总量、已使用量、空闲量、共享内存量以及缓冲和缓存占用量等信息。
故障场景示例:如果虚拟机出现内存不足相关的错误(如应用程序因内存耗尽而崩溃),可以使用free命令查看内存的使用情况,确定是否需要增加虚拟机的内存分配或者优化内存使用。
total:表示系统总的可用物理内存大小,计算公式为total = used + free + buff/cache。
used:已被使用的物理内存大小。
free:未被使用的物理内存大小,这部分内存是完全没有被占用的。
shared:多个进程共享的内存大小,通常在某些特殊的进程间通信或者共享内存场景下会有数据。
buff/cache:这是内核缓冲区(buffer)和页面缓存(cache)的大小总和。缓冲区用于存储块设备(如磁盘)的读写缓冲数据;页面缓存用于缓存文件系统中文件的页面数据,以提高文件读写的效率。
available:这是一个估计值,表示新的应用程序还可以使用的物理内存大小。它考虑了系统中未被使用的内存、可回收的缓存等因素,是一个对应用程序可分配内存更准确的评估。
iostat
netstat
TCP段中的标志位有:
TCP建立连接的步骤如下:
x+1
、应答号为随机数y的数据段表示接受连接,并进入SYNC-RCVD状态x+1
、应答号为y+1
的数据段,并进入ESTABLISHED状态TCP关闭连接的步骤如下:
FIN_WAIT_1
状态CLOSE_WAIT
状态LAST_ACK
状态TIME_WAIT
状态,服务器收到后进入CLOSED
状态2*MSL
的时间后进入CLOSED
状态TCP 关闭连接时客户端在TIME_WAIT
状态下会等待 2 倍的最大报文段生存时间(2MSL),主要原因如下:
… …