资源使用和交付模式,并非技术,分为公有云,私有云,混合云,依赖虚拟化技术,从而实现弹性扩展node
云计算 iaas pass saas图层python
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。linux
是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。ios
它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。算法
KVM还须要一个通过修改的QEMU软件(qemu-kvm),做为虚拟机上层控制和界面。shell
KVM能在不改变linux或windows镜像的状况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。数据库
在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心macos
1.是否支持虚拟化编程
因特尔 vmx amd svm [root@localhost ~]# grep -E '(vmx|svm)' /proc/cpuinfo
若是是vmware虚拟机,请在配置cpu选择intel VT-X/EPT或 AMD-V/RVIwindows
若是输出的信息中有vmx,说明intel处理器支持彻底虚拟化。若是显示svm,说明是AMD的处理器支持虚拟化。
2.安装kvm和其余虚拟化所需管理软件包
[root@localhost ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y
软件包名称介绍:
Kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
Libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机。
Bridge-utils:设置网络网卡桥接。
Virt-*:建立、克隆虚拟机命令,以及图形化管理工具virt-manager
Qemu-img:安装qemu组件,使用qemu命令来建立磁盘等
3.加载kvm模块,查看kvm模块是否被加载
[root@localhost ~]# lsmod | grep kvm kvm_intel 170181 0 kvm 554609 1 kvm_intel 这里最好reboot,在查看一下,是否随着系统重启也是支持的
4.启动libvirtd,管理虚拟机和其余虚拟化功能
包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh),libvirt的主要目标是为各类虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不一样的虚拟化提供方式
[root@localhost ~]# systemctl enable libvirtd.service [root@localhost ~]# systemctl start libvirtd.service
5.准备想要虚拟出的操做系统,iso镜像文件
[root@localhost ~]# dd if=/dev/cdrom of=/opt/CentOS-7.3.iso
6.建立镜像文件,虚拟机使用的磁盘镜像文件,实际是个空间
[root@localhost ~]# qemu-img create -f raw /opt/CentOS-7.3-x86_64.raw 8G Formatting '/opt/CentOS-7.3-x86_64.raw', fmt=raw size=8589934592 [root@localhost ~]# ls -lh /opt/CentOS-7.3-x86_64.raw -rw-r--r--. 1 root root 8.0G Dec 16 08:02 /opt/CentOS-7.3-x86_64.raw 建立磁盘 -f 文件格式 路径 磁盘大小
7.建立虚拟机,cpu默认是一个
[root@localhost ~]# virt-install --name CentOS-7.3-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.3.iso --disk path=/opt/CentOS-7.3-x86_64.raw
--network=default --graphics vnc,listen=0.0.0.0 --noautoconsole Starting install... Domain installation still in progress. You can reconnect to the console to complete the installation process.
8.查看是否监听5900端口
[root@localhost opt]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 20009/qemu-kvm
9.vnc 下载客户端,利用vnc连接,你就会看到安装centos7.3的界面
https://www.realvnc.com/en/connect/download/viewer/macos/
10.若是按tab键,输入net.ifnames=0 biosdevname=0 ,网卡就会是eth0
1.宿主机网络状态
[root@localhost ~]# ps aux|grep kvm 就是一个进程 [root@localhost ~]# cat /etc/libvirt/qemu/CentOS-7.3-x86_64-2.xml <!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit CentOS-7.3-x86_64-2 or other application using the libvirt API. --> 这个文件时自动生成的,若是你非要修改它,请virsh edit CentOS-7.3-x86_64-2 [root@localhost ~]# virsh edit CentOS-7.3-x86_64-2 与进程参数是同样的,这是配置里面的网络,默认会多出一个叫virbr0:虚拟网卡 <interface type='network'> <mac address='52:54:00:89:e2:81'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> [root@localhost ~]# ifconfig virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:25:22:31 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 默认是nat网络,咱们在下边会说到如何改为桥接 [root@localhost ~]# iptables -t nat -vnL
2.虚拟机网络状态
1.启动虚拟机 [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64 shut off - CentOS-7.3-x86_64-2 shut off [root@localhost ~]# virsh start CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 started 2.vnc继续连接,咱们看下虚拟机的网卡 [root@localhost ~]# ifconfig virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
3.上面的网卡virbr0都是192.168.122.1,为何会这样,是默认dnsmasq起了个dhcp
[root@localhost ~]# ps aux|grep dns nobody 10384 0.0 0.0 53884 1112 ? S 07:37 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 10385 0.0 0.0 53856 564 ? S 07:37 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 31126 0.0 0.0 112708 976 pts/2 R+ 08:40 0:00 grep --color=auto dns [root@localhost ~]# cat /var/lib/libvirt/dnsmasq/default.conf ##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE ##OVERWRITTEN AND LOST. Changes to this configuration should be made using: ## virsh net-edit default ## or other application using the libvirt API. ## ## dnsmasq conf file created by libvirt strict-order pid-file=/var/run/libvirt/network/default.pid except-interface=lo bind-dynamic interface=virbr0 dhcp-range=192.168.122.2,192.168.122.254 dhcp-no-override dhcp-authoritative dhcp-lease-max=253 dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
配置cpu的2种方法 1. 经过启动时候命令行指定 2. 经过xml指定,能够热修改 经过xml文件更改 1.将cpu调成最大四个,当前一个 [root@localhost ~]# virsh edit CentOS-7.3-x86_64-2 <vcpu placement='auto' current='1'>4</vcpu> 2.重启生效 [root@localhost ~]# virsh shutdown CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 is being shutdown [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64-2 shut off [root@localhost ~]# virsh start CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 started 3.登陆到虚拟机,查看cpu个数 4.热修改将cpu设置成2个 [root@localhost ~]# virsh setvcpus CentOS-7.3-x86_64-2 2 --live 5.再次登录到虚拟机,查看cpu个数 centos7是自动激活了cpu,若是不是的话须要echo 1 > [root@localhost ~]# cat /sys/devices/system/cpu/cpu0/online 1 注意热修改,只能加不能减,也不能超过设置的最大数 [root@localhost ~]# virsh setvcpus CentOS-7.3-x86_64-2 1 --live error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count
1.修改xml [root@localhost ~]# virsh edit CentOS-7.3-x86_64-2 <memory unit='KiB'>1048576</memory> 最大内存 <currentMemory unit='KiB'>1048576</currentMemory> 现内存 2.重启生效 [root@localhost ~]# virsh shutdown CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 is being shutdown [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64-2 shut off [root@localhost ~]# virsh start CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 started 3.显示虚拟机当前内存 [root@localhost ~]# virsh qemu-monitor-command CentOS-7.3-x86_64-2 --hmp --cmd info balloon balloon: actual=1024 4.修改虚拟机内存,减小 [root@localhost ~]# virsh qemu-monitor-command CentOS-7.3-x86_64-2 --hmp --cmd balloon 600 显示虚拟机当前内存 [root@localhost ~]# virsh qemu-monitor-command CentOS-7.3-x86_64-2 --hmp --cmd info balloon balloon: actual=600 5.修改虚拟机内存,添加 [root@localhost ~]# virsh qemu-monitor-command CentOS-7.3-x86_64-2 --hmp --cmd balloon 1024 显示虚拟机当前内存 [root@localhost ~]# virsh qemu-monitor-command CentOS-7.3-x86_64-2 --hmp --cmd info balloon balloon: actual=1024 6.登陆到虚拟机查看 注意,内存也不能超过最大内存
[root@localhost ~]# qemu-img --help 支持以下硬盘格式 Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug 1.全镜像模式 raw,设置多大,就是多大。写入块,方便转换成其余格式,性能最优 2.稀疏模式 qcow2,功能全,压缩,快照,镜像,更小存储空间,设置多大,它也只是用多大 全部磁盘管理,可使用qemu -img管理
1.默认nat,生产最多的是网桥 [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400252231 yes virbr0-nic vnet0 2.若是没有这个命令请安装,默认有 [root@localhost ~]# yum install bridge-utils 3.添加一个网桥 [root@localhost ~]# brctl addbr br0 [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no virbr0 8000.525400252231 yes virbr0-nic vnet0 4.将eth0添加到br0网桥里,网络会断,这个时候xshell,vnc都会断 [root@localhost ~]# brctl addif br0 eth0 5.登陆到宿主机,不能经过xshell登陆了,本地去 [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29672760 no enth0 virbr0 8000.525400252231 yes virbr0-nic vnet0 bro 和 eth0关联,eth0有ip,br0没有 6.咱们给br0设置一个ip [root@localhost ~]# ip addr del dev eth0 192.168.1.110/24 [root@localhost ~]# ifconfig br0 192.168.1.11/24 up 注意,排错 尝试xshell连接宿主机,若是连接不上,在宿主机上排查问题 [root@localhost ~]# ip ro li [root@localhost ~]#route add default gw 192.168.1.1 网关 [root@localhost ~]#iptables -F 由于断网的缘故,咱们须要一条命令去执行,这样的话避免去宿主机 [root@localhost ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.1.11/24 && ifconfig br0 192.168.1.11/24 up && route add default gw 192.168.1.1 && iptables -F
查看运行的虚拟机 [root@localhost ~]# virsh list Id Name State ---------------------------------------------------- 查看全部状态的虚拟机 [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64 shut off - CentOS-7.3-x86_64-2 shut off 中止虚拟机 [root@localhost ~]# virsh shutdown CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 is being shutdown [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64 shut off - CentOS-7.3-x86_64-2 shut off 启动虚拟机 [root@localhost ~]# virsh start CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 started [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- 2 CentOS-7.3-x86_64-2 running - CentOS-7.3-x86_64 shut off 拔电源中止虚拟机,不会考虑友好的退出 [root@localhost ~]# virsh destroy CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 destroyed [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7.3-x86_64 shut off - CentOS-7.3-x86_64-2 shut off 终止挂起状态,可恢复 [root@localhost ~]# virsh suspend CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 suspended [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- 3 CentOS-7.3-x86_64-2 paused - CentOS-7.3-x86_64 shut off 恢复挂机状态 [root@localhost ~]# virsh resume CentOS-7.3-x86_64-2 Domain CentOS-7.3-x86_64-2 resumed [root@localhost ~]# virsh list --all Id Name State ---------------------------------------------------- 3 CentOS-7.3-x86_64-2 running - CentOS-7.3-x86_64 shut off 黑名单,禁止操做 virsh undefine 永久删除 可是若是你提早备份一个xml文件,能够在建起来
不建议去作,不少centos7已经优化好了,了解便可
cpu有四个形态,用户态r3到内核态r0就是上下文切换,而kvm是全虚拟化,也就是虚拟机里面也有内核态到用户态转化,再到宿主机。而cpu有3级缓存,会存在miss现象,因此咱们能够将kvm进程绑定在一个cpu上
1.xml文件 2.taskset cpu亲和力绑定进程到固定的cpu,减小cache miss taskset -cp 1,2 pid,
缺陷无法动态迁移了
Intel vt-x/EPT AMD-v/RVI技术 cpu替你上下文硬件加速,默认开启
内存寻址
虚拟机的虚拟内存 -> 虚拟机的物理内存 -> 宿主机虚拟内存 -> 宿主机物理内存
1.影子页表
转化过程也是须要开辟内存空间
2.EPT技术
因特尔经过cpu寄存器,默认打开的
3.进程ksm,内存合并,相同的合并起来,默认开启的
[root@localhost ~]# ps -aux|grep ksm root 36 0.0 0.0 0 0 ? SN 06:25 0:00 [ksmd]
4.大页内存也是开启的
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never khugepaged扫描内存地址连续的合并到一块儿,将4k合并2M的 [root@localhost ~]# ps -aux|grep kh root 20 0.0 0.0 0 0 ? S 07:36 0:00 [khungtaskd] root 38 0.0 0.0 0 0 ? SN 07:36 0:00 [khugepaged]
io调度算法
[root@localhost ~]# dmesg | grep -i scheduler [ 2.196112] io scheduler noop registered [ 2.196115] io scheduler deadline registered (default) [ 2.196178] io scheduler cfq registered [ 2.196181] io scheduler mq-deadline registered [ 2.196184] io scheduler kyber registered [root@localhost ~]# cat /sys/block/sda/queue/scheduler noop [deadline] cfq [root@localhost ~]# echo cfg > /sys/block/sda/queue/scheduler ^C [root@localhost ~]# elevator = cfg 永久修改
Noop调度算法是内核中最简单的IO调度算法。Noop调度算法也叫做电梯调度算法,它将IO请求放入到一个FIFO队列中,而后逐个执行这些IO请求,固然对于一些在磁盘上连续的IO请求,Noop算法会适当作一些合并。这个调度算法特别适合那些不但愿调度器从新组织IO请求顺序的应用。
这种调度算法在如下场景中优点比较明显:
1)在IO调度器下方有更加智能的IO调度设备。若是您的Block Device Drivers是Raid,或者SAN,NAS等存储设备,这些设备会更好地组织IO请求,不用IO调度器去作额外的调度工做;
2)上层的应用程序比IO调度器更懂底层设备。或者说上层应用程序到达IO调度器的IO请求已是它通过精心优化的,那么IO调度器就不须要多此一举,只须要按序执行上层传达下来的IO请求便可。
3)对于一些非旋转磁头氏的存储设备,使用Noop的效果更好。由于对于旋转磁头式的磁盘来讲,IO调度器的请求重组要花费必定的CPU时间,可是对于SSD磁盘来讲,这些重组IO请求的CPU时间能够节省下来,由于SSD提供了更智能的请求调度算法,不须要内核去多此一举。这篇文章说起了SSD中使用Noop效果会更好。
Deadline算法的核心在于保证每一个IO请求在必定的时间内必定要被服务到,以此来避免某个请求饥饿。
Deadline算法中引入了四个队列,这四个队列能够分为两类,每一类都由读和写两类队列组成,一类队列用来对请求按起始扇区序号进行排序,经过红黑树来组织,称为sort_list;另外一类对请求按它们的生成时间进行排序,由链表来组织,称为fifo_list。每当肯定了一个传输方向(读或写),那么将会从相应的sort_list中将一批连续请求dispatch到requst_queue的请求队列里,具体的数目由fifo_batch来肯定。只有下面三种状况才会致使一次批量传输的结束:
1)对应的sort_list中已经没有请求了
2)下一个请求的扇区不知足递增的要求
3)上一个请求已是批量传输的最后一个请求了。
全部的请求在生成时都会被赋上一个期限值(根据jiffies),并定期限值排序在fifo_list中,读请求的期限时长默认为为500ms,写请求的期限时长默认为5s,能够看出内核对读请求是十分偏爱的,其实不只如此,在deadline调度器中,还定义了一个starved和writes_starved,writes_starved默认为2,能够理解为写请求的饥饿线,内核老是优先处理读请求,starved代表当前处理的读请求批数,只有starved超过了writes_starved后,才会去考虑写请求。所以,假如一个写请求的期限已经超过,该请求也不必定会被马上响应,由于读请求的batch还没处理完,即便处理完,也必须等到starved超过writes_starved才有机会被响应。为何内核会偏袒读请求?这是从总体性能上进行考虑的。读请求和应用程序的关系是同步的,由于应用程序要等待读取的内容完毕,才能进行下一步工做,所以读请求会阻塞进程,而写请求则不同,应用程序发出写请求后,内存的内容什么时候写入块设备对程序的影响并不大,因此调度器会优先处理读请求。
默认状况下,读请求的超时时间是500ms,写请求的超时时间是5s。
这篇文章说在一些多线程应用下,Deadline算法比CFQ算法好。这篇文章说在一些数据库应用下,Deadline算法比CFQ算法好。
Anticipatory算法的核心是局部性原理,它指望一个进程昨晚一次IO请求后还会继续在此处作IO请求。在IO操做中,有一种现象叫“假空闲”(Deceptive idleness),它的意思是一个进程在刚刚作完一波读操做后,看似是空闲了,不读了,可是实际上它是在处理这些数据,处理完这些数据以后,它还会接着读,这个时候若是IO调度器去处理另一个进程的请求,那么当原来的假空闲进程的下一个请求来的时候,磁头又得seek到刚才的位置,这样大大增长了寻道时间和磁头旋转时间。因此,Anticipatory算法会在一个读请求作完后,再等待必定时间t(一般是6ms),若是6ms内,这个进程上还有读请求过来,那么我继续服务,不然,处理下一个进程的读写请求。
在一些场景下,Antocipatory算法会有很是有效的性能提高。这篇文章有说,这篇文章也有一份评测。
值得一提的是,Anticipatory算法从Linux 2.6.33版本后,就被移除了,由于CFQ经过配置也能达到Anticipatory算法的效果。
CFQ(Completely Fair Queuing)算法,顾名思义,绝对公平算法。它试图为竞争块设备使用权的全部进程分配一个请求队列和一个时间片,在调度器分配给进程的时间片内,进程能够将其读写请求发送给底层块设备,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。 每一个进程的时间片和每一个进程的队列长度取决于进程的IO优先级,每一个进程都会有一个IO优先级,CFQ调度器将会将其做为考虑的因素之一,来肯定该进程的请求队列什么时候能够获取块设备的使用权。IO优先级从高到低能够分为三大类:RT(real time),BE(best try),IDLE(idle),其中RT和BE又能够再划分为8个子优先级。实际上,咱们已经知道CFQ调度器的公平是针对于进程而言的,而只有同步请求(read或syn write)才是针对进程而存在的,他们会放入进程自身的请求队列,而全部同优先级的异步请求,不管来自于哪一个进程,都会被放入公共的队列,异步请求的队列总共有8(RT)+8(BE)+1(IDLE)=17个。
从Linux 2.6.18起,CFQ做为默认的IO调度算法。
对于通用的服务器来讲,CFQ是较好的选择。
越外层越安全,可是效率低
OpenStack
CloudStack cloud.com公司-Ctrix-Apache基金会
OpenNebula
oVirt RHEV的开源版本
管理端+客户端组成 oVirt Engine oVirt 主机/节点
对应vm vCenter ESXi
https://www.ovirt.org/尝试安装管理平台查看
http://www.ovirt.org/Download [root@localhost ~]# yum localinstall http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm [root@localhost ~]# ovirt-engine [root@localhost ~]# yum install -y ovirt-engine-setup-plugin-allinone 注意域名解析,设置好后,注意防火墙,url访问本机ip便可看到页面