context switching
进程是程序运行的一次实例,进程是资源分配的最小单位
pid
进程描述符
内存
io等
线程是CPU调度的最小单位
User space 是用户程序的运行空间。
Kernel space 是 Linux 内核的运行空间
top
us
CPU 消耗在 User space 的时间百分比
sy
消耗在 Kernel space 的时间百分比
ni
niceness 的缩写,CPU 消耗在 nice 进程(低优先级)的时间百分比
id
idle 的缩写,CPU 消耗在闲置进程的时间百分比,这个值越低,表示 CPU 越忙
wa
wait 的缩写,CPU 等待外部 I/O 的时间百分比,这段时间 CPU 不能干其他事,但是也没有执行运算,这个值太高就说明外部设备有问题
hi
hardware interrupt 的缩写,CPU 响应硬件中断请求的时间百分比
si
software interrupt 的缩写,CPU 响应软件中断请求的时间百分比
st
stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比
time命令:查看命令运行时间
real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其他任务的时间。
user:程序在 User space 执行的时间
sys:程序在 Kernel space 执行的时间
进程CPU时间=user+sys
在多cpu情况,可能出现user+sys>real
虚拟化技术(Virtualization)是一种资源管理(优化)技术,将计算机的各种物理资源(e.g. CPU、内存以及磁盘空间、网络适配器等 I/O 设备)予以抽象、转换,然后呈现出来的一个可供分割并任意组合为一个或多个(虚拟)计算机的配置环境。
根据对象类型不同
硬件&软件虚拟化
Virtual Machine Monitor,虚拟机监视器,又称Hypervisor
虚拟化系统结构的三个基本条件
type2
VMM 运行在传统的操作系统上,就像其他计算机程序那样运行。
真奢侈!!!
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。
半虚拟化是一种通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给 Guest OS,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。
Intel-VT(Intel Virtualization Technology)和 AMD-V 是目前 x86 平台上可用的两种硬件辅助虚拟化技术。
进BIOS打开
Kernel-Based Virtual Machine
先关机,在虚拟机设置上找到处理器,选择第二个
[root@localhost tmp]# egrep -c 'vmx|svm' /proc/cpuinfo
1
[root@localhost tmp]# ls -l /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Mar 21 05:06 /dev/kvm
[root@localhost tmp]# modinfo kvm
[root@localhost tmp]# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
安装
[root@localhost tmp]# yum install libvirt qemu-kvm qemu-kvm-tools
管理启动libvirtd
[root@localhost tmp]# systemctl start libvirtd.service
[root@localhost tmp]# systemctl enable libvirtd.service
通过 ifconfig 可以看到一个 virbr0 桥接网卡
[root@localhost tmp]# ifconfig
通过 ps aux | grep dns 看到自动启动了 dnsmasq(dns 和 dhcp 功能)
[root@localhost tmp]# ps aux | grep dns
准备工作
关闭 selinux 并设置防火墙
[root@localhost tmp]# vim /etc/selinux/config
SELINUX=disabled
用于 vnc 远程
[root@localhost tmp]# firewall-cmd --zone=public --add-port=5900/tcp --permanent
success
1.创建一个虚拟磁盘
[root@localhost ~]# qemu-img create -f raw /data/virt/centos-7.raw 10G
Formatting '/data/virt/centos-7.raw', fmt=raw size=10737418240
记得先创建/data/virt文件夹
2.使用 virt-install 安装虚拟机
[root@localhost tmp]# yum install virt-install
3.开启libvirtd服务
[root@localhost ~]# systemctl enable libvirtd.service
[root@localhost ~]# systemctl start libvirtd.service
[root@localhost ~]# systemctl status libvirtd.service
4.下载镜像文件
[root@localhost virt]# wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
创建默认网络虚拟机
virt-install --virt-type kvm --name Centos7 --ram 2048 --cdrom /data/virt/CentOS-7-x86_64-Minimal-1908.iso --disk path=/data/virt/centos-7.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
在创建完虚拟机后会在/run/libvirt/qemu/
目录下生成一个xml
文件,是自动生成的,通过编辑此xml文件可对虚拟机内存、cpu颗数等信息进行修改,下文会详细介绍如何管理及优化kvm虚拟机
5900端口是否被监听,kvm虚拟机监听端口会从5900开始逐渐递增
[root@localhost virt]# netstat -lntup | grep kvm
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 41733/qemu-kvm
5.通过 virsh 管理虚拟机
有关命令
• domain 虚拟机
• virsh list --all
[root@localhost virt]# virsh list --all
Id Name State
----------------------------------------------------
2 Centos7 running
• virsh domstats NAME
• virsh start NAME
• virsh suspend NAME
• virsh resume NAME
• virsh dumpxml NAME > x.xml 备份
[root@localhost qemu]# virsh dumpxml Centos7 > x.xml
[root@localhost qemu]# ls
Centos7.pid Centos7.xml x.xml
• virsh edit NAME
• virsh define x.xml
• virsh undefine NAME 删除
• virsh destroy NAME 关闭
6.修改.xml文件
修改虚拟机 xml 文件
[root@localhost virt]# vim /run/libvirt/qemu/Centos7.xml
修改一下参数
4
重启虚拟机
[root@localhost virt]# virsh shutdown Centos7
[root@localhost virt]# virsh start Centos7
7.动态调整 vcpus
[root@localhost virt]# virsh setvcpus Centos7 2 --live
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 2 > 1
当然前提是需要有足够的CPU,这里不够
8.内存动态调整
[root@localhost virt]# virsh qemu-monitor-command Centos7 --hmp --cmd balloon 1024
9.磁盘管理
查看虚拟机的磁盘信息
[root@localhost qemu]# qemu-img info Centos7.xml
image: Centos7.xml
file format: raw
virtual size: 10K (10240 bytes)
disk size: 12K
raw 镜像格式可以转换成其他的格式,相反不行
[root@localhost qemu]# qemu-img convert -f raw -O qcow2 /data/virt/centos-7.raw /data/virt/centos-7.qcow2
10.网络管理
将虚拟机设为桥接模式
1.查看
[root@localhost qemu]# brctl show
2.添加br0
[root@localhost qemu]# brctl addbr br0
[root@localhost qemu]# brctl show
删除delbr
3.将ens33 桥接到 br0
# 将ens33端口加入网桥br0
brctl addif br0 ens33
# 从网桥br0中删除ens33端口
brctl delif br0 ens33
inet 192.168.184.100 netmask 255.255.255.0 broadcast 0.0.0.0
硬件虚拟化
支持虚拟化的硬件有:
软件虚拟化
软件虚拟化就是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持,如:QEMU;而有些软件虚拟化技术,则依赖硬件支持,如:VMware、KVM。
对软件虚拟化进行细分,又可以分为以下几类:
硬件&软件虚拟化
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。
半虚拟化是一种通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给 Guest OS,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。
内核,是指的操作系统内核。
所有的操作系统都有内核,无论是Windows还是Linux,都管理着三个重要的资源:计算,网络,存储。
计算指CPU和内存,网络即网络设备,存储即硬盘之类的。
内核是个大管家,想象你的机器上跑着很多的程序,有word,有excel,看着视频,听着音乐,每个程序都要使用CPU和内存,都要上网,都要存硬盘,如果没有一个大管家管着,大家随便用,就乱了。所以需要管家来协调调度整个资源,谁先用,谁后用,谁用多少,谁放在这里,谁放在那里,都需要管家操心。
所以在这个计算机大家庭里面,管家有着比普通的程序更高的权限,运行在内核态,而其他的普通程序运行在用户态,用户态的程序一旦要申请公共的资源,就需要向管家申请,管家帮它分配好,它才能用。
为了区分内核态和用户态,CPU专门设置四个特权等级0,1,2,3 来做这个事情。
当时写Linux内核的时候,估计大牛们还不知道将来虚拟机会大放异彩,大牛们想,一共两级特权,一个内核态,一个用户态,却有四个等级,好奢侈,好富裕,就敞开了用,内核态运行在第0等级,用户态运行在第3等级,占了两头,太不会过日子了。
大牛们在写Linux内核的时候,如果用户态程序做事情,就将扳手掰到第3等级,一旦要申请使用更多的资源,就需要申请将扳手掰到第0等级,内核才能在高权限访问这些资源,申请完资源,返回到用户态,扳手再掰回去。
这个程序一直非常顺利的运行着,直到虚拟机的出现。
如果大家用过Vmware桌面版,或者Virtualbox桌面版,你可以用这个虚拟化软件创建虚拟机,在虚拟机里面安装一个Linux或者windows,外面的操作系统也可以是Linux或者Windows。
当你使用虚拟机软件的时候,和你的excel一样,都是在你的任务栏里面并排的放着,是一个普通的应用。
当你进入虚拟机的时候,虚拟机里面的excel也是一个普通的应用。
但是当你设身处地的站在虚拟机里面的内核的角度思考一下人生,你就困惑了,我到底个啥?
在硬件上的操作系统来看,我是一个普通的应用,只能运行在用户态。可是大牛们生我的时候,我的每一行代码,都告诉我,我是个内核啊,应该运行在内核态,当虚拟机里面的excel要访问网络的时候,向我请求,我的代码就要努力的去操作网络资源,我努力,但是我做不到,我没有权限!
我分裂了。
虚拟化层,也就是Vmware或者Virtualbox需要帮我解决这个问题。
第一种方式,完全虚拟化,其实就是骗我。虚拟化软件模拟假的CPU,内存,网络,硬盘给我,让我自我感觉良好,终于又像个内核了。
真正的工作模式是这样的。
虚拟机内核:我要在CPU上跑一个指令!
虚拟化软件:没问题,你是内核嘛,可以跑
虚拟化软件转过头去找物理机内核:报告管家,我管理的虚拟机里面的一个要执行一个CPU指令,帮忙来一小段时间空闲的CPU时间,让我代他跑个指令。
物理机内核:你等着,另一个跑着呢。好嘞,他终于跑完了,该你了。
虚拟化软件:我代他跑,终于跑完了,出来结果了
虚拟化软件转头给虚拟机内核:哥们,跑完了,结果是这个,我说你是内核吧,绝对有权限,没问题,下次跑指令找我啊。
虚拟机内核:看来我真的是内核呢。可是哥,好像这点指令跑的有点慢啊。
虚拟化软件:这就不错啦,好几个排着队跑呢。
内存的申请模式如下。
虚拟机内核:我启动需要4G内存,我好分给我上面的应用。
虚拟化软件:没问题,才4G,你是内核嘛,马上申请好。
虚拟化软件转头给物理机内核:报告,管家,我启动了一个虚拟机,需要4G内存,给我4个房间呗。
物理机内核:怎么又一个虚拟机啊,好吧,给你90,91,92,93四个房间。
虚拟化软件转头给虚拟机内核:哥们,内存有了,0,1,2,3这个四个房间都是你的,你看,你是内核嘛,独占资源,从0编号的就是你的。
虚拟机内核:看来我真的是内核啊,能从头开始用。那好,我就在房间2的第三个柜子里面放个东西吧。
虚拟化软件:要放东西啊,没问题。心里想:我查查看,这个虚拟机是90号房间开头的,他要在房间2放东西,那就相当于在房间92放东西。
虚拟化软件转头给物理机内核:报告,管家,我上面的虚拟机要在92号房间的第三个柜子里面放个东西。
好了,说完了CPU和内存的例子,不细说网络和硬盘了,也是类似,都是虚拟化软件模拟一个给虚拟机内核看的,其实啥事儿都需要虚拟化软件转一遍。
这种方式一个坏处,就是慢,往往慢到不能忍受。
于是虚拟化软件想,我能不能不当传话筒,还是要让虚拟机内核正视自己的身份,别说你是内核,你还真喘上了,你不是物理机,你是虚拟机。
但是怎么解决权限等级的问题呢?于是Intel的VT-x和AMD的AMD-V从硬件层面帮上了忙。当初谁让你们这些写内核的大牛用等级这么奢侈,用完了0,就是3,也不省着点用,没办法,只好另起炉灶弄一个新的标志位,表示当前是在虚拟机状态下,还是真正的物理机内核下。
对于虚拟机内核来讲,只要将标志位设为虚拟机状态,则可以直接在CPU上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。
所以安装虚拟机的时候,务必要将物理CPU的这个标志位打开,是否打开对于Intel可以查看grep “vmx” /proc/cpuinfo,对于AMD可以查看grep “svm” /proc/cpuinfo
这叫做硬件辅助虚拟化。
另外就是访问网络或者硬盘的时候,为了取得更高的性能,也需要让虚拟机内核加载特殊的驱动,也是让虚拟机内核从代码层面就重新定位自己的身份,不能像访问物理机一样访问网络或者硬盘,而是用一种特殊的方式:我知道我不是物理机内核,我知道我是虚拟机,我没那么高的权限,我很可能和很多虚拟机共享物理资源,所以我要学会排队,我写硬盘其实写的是一个物理机上的文件,那我的写文件的缓存方式是不是可以变一下,我发送网络包,根本就不是发给真正的网络设备,而是给虚拟的设备,我可不可以直接在内存里面拷贝给他,等等等等。
一旦我知道我不是物理机内核,痛定思痛,只好重新认识自己,反而能找出很多方式来优化我的资源访问。
这叫做类虚拟化或者半虚拟化。
xen
vmware
微软hyperV
kvm
KVM是指基于Linux内核(Kernel-based)的虚拟机(Virtual Machine)。KVM最大的好处就在于它是与Linux内核集成的,所以速度很快。KVM的宿主操作系统必须是Linux,支持的客户机操作系统包括Linux、Windows、Solaris和BSD,运行在支持虚拟化扩展的x86和x86_64硬件架构上,cpu支持VT技术。
Xen是一个开放源代码虚拟机监视器,由剑桥大学开发。Xen的缺点是操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性),所以比较麻烦。使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。Linux的官方内核在较早之前已经去掉了对Xen的支持。
VMWare (Virtual Machine ware)是一个“虚拟PC”虚拟机管理管理软件。它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。
Hyper-V 是微软提出的一种系统管理程序虚拟化技术,采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V 底层的 Hypervisor 运行在最高的特权级别下,微软将其称为 ring -1(而 Intel 则将其称为 root mode),而虚机的 OS 内核和驱动运行在 ring 0,应用程序运行在 ring 3 下,这种架构就不需要采用复杂的 BT(二进制特权指令翻译)技术,可以进一步提高安全性。从架构上讲 Hyper-V 只有“硬件-Hyper-V-虚拟机”三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。
Hyper-V 支持分区层面的隔离。分区是逻辑隔离单位,受虚拟机监控程序支持,并且操作系统在其中执行。Microsoft 虚拟机监控程序必须至少有一个父 / 根分区,用于运行 64 位版本的 Windows Server 2008 操作系统。虚拟化堆栈在父分区中运行,并且可以直接访问硬件设备。随后,根分区会创建子分区用于承载来宾操作系统。根分区使用虚拟化调用应用程序编程接口 (API) 来创建子分区。
分区对物理处理器没有访问权限,也不能处理处理器中断。相反,它们具有处理器的虚拟视图,并运行于每个来宾分区专用的虚拟内存地址区域。虚拟机监控程序负责处理处理器中断,并将其重定向到相应的分区。Hyper-V 还可以通过输入输出内存管理单元 (IOMMU) 利用硬件加速来加快各个来宾虚拟地址空间相互之间的地址转换。IOMMU 独立于 CPU 使用的内存管理硬件运行,并用于将物理内存地址重新映射到子分区使用的地址。从系统的结构图,我们可以看出来 Hyper-V 与 Xen 的架构很相似。
虚拟化技术 | 服务器虚拟化 | 桌面虚拟化 | 应用程序虚拟化 | 存储虚拟化 | 网络虚拟化 | 云管理平台 |
---|---|---|---|---|---|---|
VMWare | vSphere | Horizon | ThinApp | vSAN | NSX | vRealize Suit |
Microsoft | Hyper-V | RDS | APP-V | Storage Space Direct | Network Controller | System Center |
Citrix | XenServer | XenDesktop | XenApp | PVS | SD-WAN | Citrix Cloud Services |
HuaWei | FusionCompute | FusionAccess | FusionAccess | FusionStorage | FusionNetwork | ManageOne |
OpenStack:开源管理项目
OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它不是一个软件,而是由几个主要的组件组合起来完成一些具体的工作。OpenStack由以下五个相对独立的组件构成:
lOpenStack Compute(Nova)是一套控制器,用于虚拟机计算或使用群组启动虚拟机实例;
lOpenStack镜像服务(Glance)是一套虚拟机镜像查找及检索系统,实现虚拟机镜像管理;
lOpenStack对象存储(Swift)是一套用于在大规模可扩展系统中通过内置冗余及容错机制,以对象为单位的存储系统,类似于Amazon S3;
lOpenStack Keystone,用于用户身份服务与资源管理
lOpenStack Horizon,基于Django的仪表板接口,是个图形化管理前端。
这个起初由美国国家航空航天局和Rackspace在2010年末合作研发的开源项目,旨在打造易于部署、功能丰富且易于扩展的云计算平台。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性,企图成为数据中心的操作系统,即云操作系统。
KVM:开放虚拟化技术
KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,它需要硬件支持,如Intel VT技术或者AMD V技术,是基于硬件的完全虚拟化,完全内置于Linux。
2008年,红帽收购Qumranet获得了KVM技术,并将其作为虚拟化战略的一部分大力推广,在2011年发布RHEL6时支持KVM作为唯一的hypervisor。KVM主打的就是高性能、扩展性、高安全,以及低成本。
一个被某些热心支持者成为云时代的Linux,是公有云与私有云的开源操作系统。一个则是Linux内核的一部分,将Linux转换成一个Type-1 hypervisor,无需任何变更就能享受现有的Linux内核进程调度、内存管理和设备支持。
OpenStack炙手可热,它如同Linux一样,旨在构建一个内核,所有的软件厂商都围绕着它进行工作。OpenStack的许多子项目,对云计算平台中的各种资源(如计算能力、存储、网络)提供敏捷管理。此外,OpenStack也提供对虚拟化技术的支持。
KVM集成在Linux的各个主要发行版本中,使用Linux自身的调度器进行管理。KVM专注于成为最好的虚拟机监控器,是使用Linux企业的不二选择,加上它还支持Windows平台,所以也是异构环境的最佳选择。
OpenStack几乎支持所有的虚拟化管理程序,不论是开源的(Xen与KVM)还是厂商的(Hyper-V与VMware)。但在以前,OpenStack是基于KVM开发的,KVM常常成为默认的虚拟机管理程序。两者都使用相同的开放源理念与开发方法。
轻量级虚拟机,轻量体现在什么地方
相比于传统虚拟化技术用有什么优势
docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor与内层的虚拟化。
docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离。
1.一种资源交付模式
2.必须通过网络来使用
3.弹性计算,按需付费,快速扩展
IAAS
PAAS
SAAS
1.IAAS
2.PAAS
3.SAAS