带你走进虚拟化世界之KVM

带你走进虚拟化世界之KVM

一、走进云计算

云计算:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。

1.1 云计算的特点和优势

1)云计算是一种使用模式

2)云计算必须通过网络访问

3)弹性计算,按需付费

1.2 在云计算之前的模式或技术

1)IDC托管

2)IDC租用

3)虚拟主机(卖空间的)

4)vps:虚拟专有主机,openvz超卖很坑人的,xen不支持超卖

1.3 相对于云计算,传统数据中心面临的问题

1)资源利用率低(大部分机器cpu所占比率低于15%)

2)资源分配不合理

举例:由于某个活动,上线各种服务器,但是并未达到实际效果,导致服务器资源浪费

3)很难实现真正的运维自动化

1.4图解云计算的三层服务

基础设施:计算,存储,网络服务
平台服务:对象存储,身份认证,运行环境,消息队列,数据库服务
应用平台:监控,内容,合作,通信,财务

二、云计算与虚拟化

2.1 公有云、私有云和混合云

  • 公有云(Public Cloud)
    通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:aws,阿里云,青云,百度云,腾讯云。
    优点:价格低廉,使用方便
  • 私有云(Private Clouds)
    是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。
    优点:可控,数据安全(银行必然使用私有云
  • 混合云(Hybrid Cloud)
    混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的,例如在一次活动中,只需要暂时几台机器,在私有云存在的情况,考虑混合云的使用,是最合理化的。
    优点:集合的使用方式更完美,可扩展,更节省

2.2云计算的层次


  • SaaS
    提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器。消费者不需要管理或控制任何云计算基础设施,包括网络、服务器、操作系统、存储等等;平时使用的邮件服务器,即属于SaaS服务。
  • PaaS
    提供给消费者的服务是把客户采用提供的开发语言和工具(例如Java,python, .Net等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不需要管理或控制底层的云基础设施,包括网络、服务器、操作系统、存储等,但客户能控制部署的应用程序,也可能控制运行应用程序的托管环境配置;更适合提供给开发人员使用,在这里也可以使用docker容器技术实现
  • IaaS
    提供给消费者的服务是对所有计算基础设施的利用,包括处理CPU、内存、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。消费者不管理或控制任何云计算基础设施,但能控制操作系统的选择、存储空间、部署的应用,也有可能获得有限制的网络组件(例如路由器,防火墙、负载均衡器等)的控制。更适合提供给运维人员使用

2.3 虚拟化的优势

虚拟化可以虚拟出来多个操作系统:每个操作系统之间是相互独立的,所以每个操作系统上所跑的应用自然是相互不影响的。在这里用一个经典的例子说明,一台物理机跑8个tomcat和8个虚拟机上各跑一个tomcat,跑8个tomcat的物理机,如果其中一个tomcat出问题(内存有问题,jvm有问题等),势必会影响到其他7个tomcat,但是在8个虚拟机上跑分别各跑一个tomcat,他们之间是互不影响的,由于虚拟化一层原因占用了一些资源,效果并没有直接一台物理机跑8个tomcat效果好,但是虚拟机的互相独立互不影响是更重要的,而且便于管理,每个tomcat实例都会起3个端口(8080:对外服务端口,8009:AJP端口,8005:关闭端口),使用虚拟机之后,就不会担心多个tomcat端口冲突的情况。
支持异构 :linux系统可以虚拟化windows系统,方便不同场景系统的使用
支持快照功能和克隆等功能:快照功能在某个物理机不知运行什么,是否正在运行的情况下,如果是一台虚拟机就好办了,直接停了该虚拟机,只不过是占了一些磁盘空间而已。

2.4 虚拟化和云计算的简单总结

虚拟化是一种技术,云计算是通过虚拟化技术实现的一种通过网络访问获取资源,流量,交付的使用模式,两者并不能相互比较,虚拟化相当于实干家,而云计算是思想家。

三、虚拟化的分类

3.1 全虚拟化与半虚拟化

  • 全虚拟化
    又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层–Hypervisor,或者叫做虚拟机管理程序(VMM)。hypervisor 可以划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它本身是一个基于操作系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。因为运行在虚拟机上的操作系统通过Hypervisor来最终分享硬件,所以虚拟机发出的指令需经过Hypervisor捕获并处理。为此每个客户操作系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操作系统即是运行的虚拟机,所以Hypervisor的工作负荷会很大,因此会占用一定的资源,所以在性能方面不如裸机。但是运行速度要快于硬件模拟。全虚拟化最大的优点就是运行在虚拟机上的操作系统没有经过任何修改,唯一的限制就是操作系统必须能够支持底层的硬件,不过目前的操作系统一般都能支持底层硬件,所以这个限制就变得微不足道了。
  • 半虚拟化
    半虚拟化技术是后来才出现的技术,半虚拟化技术英文是paravirtualization,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不行能用这种方法,Xen就是一个典型的半虚拟化的技术。

3.2服务器虚拟化,桌面虚拟化,应用虚拟化

  • 服务器虚拟化
    数量少的情况推荐使用ESXI,XenServer
    数量大的情况推荐使用KVM,RHEV(并不开源),oVirt,Openstack,Vmvare vshpere
  • 桌面虚拟化
    桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操作系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端通过以太网登陆到虚拟主机上,只需要记住用户名和密码及网关信息,即可随时随地的通过网络访问自己的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。
  • 应用虚拟化
    技术原理是基于应用/服务器计算A/S架构,采用类似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操作、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只需要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,并且在客户端相应设备展示出来,从而使用户获得如同运行本地应用程序一样的访问感受。
    3)硬件虚拟化和软件虚拟化
    参考:
    http://virtualization.ctocio.com.cn/38/11466538.shtm

四、虚拟化之KVM

4.1kvm的虚拟化特性

1)嵌入到linxu正式kernel(提高了兼容性)
2)代码级资源调用(提高性能)
3)虚拟机就是一个进程(内存易于管理)
4)直接支持NUMA技术(提高扩展性)
5)虽然被Redhat收购了,但是依然保持着开源发展模式,社区活跃
6)更好的商业支持及服务保障
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的

4.2 支持虚拟化的条件

inter的cpu:vmx
AMD的cpu:svm
本文使用的是vmvare,需要开启如下两个条件即可,如果是物理机,需要在bios里面设置,默认都是开启状态。

在cpuinfo中可以查看具体的支持虚拟化的信息

  1. [[email protected]~]``# grep -E "svm|vmx" /proc/cpuinfo `
  2. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust
  3. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave a* vx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust`

4.3 kvm安装实战

  • 安装kvm
  1. [[email protected]~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y

kvm: linux内核的一个模块,模块不需要安装,只需要加载
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的)
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

  • 创建一个虚拟磁盘,-f 指定格式,路径是/opt/CentOS-7.1-x86_64.raw,大小为10G
  1. [[email protected] opt]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G Formatting /opt/CentOS-7.1-x86_64.raw‘, fmt =raw size=10737418240
  • 显示内核中kvm的状态
  1. [[email protected] opt]``# lsmod|grep kvm
  2. kvm_intel 148081 0
  3. kvm 461126 1 kvm_intel
  • 启动libvirt,查看状态,关键字:active

4.4 开始装一台虚拟机

  • 在vmvare上挂载一个镜像

    导入到宿主机中,当然时间可能较长
  1. [[email protected] opt]# dd if=/dev/cdrom of=/opt/CentOS-7.1-x86_64.iso
  2. 8419328+0 records in
  3. 8419328+0 records out
  4. 4310695936 bytes (4.3 GB) copied, 229.618 s, 18.8 MB/s
  5. [[email protected] opt]``# ls /opt/
  6. CentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw rh
  • 使用命令创建一台虚拟机
    首先学virt-install命令,在这里使用–help查看,并且只学习重要的,其他的稍后会有提供
    virt-install –help
    -n(Name):指定虚拟机的名称
    –memory(–raw):指定内存大小
    –cpu:指定cpu的核数(默认为1)
    –cdrom:指定镜像
    –disk:指定磁盘路径(即上文创建的虚拟磁盘)
    –virt-type:指定虚拟机类型(kvm,qemu,xen)
    –network:指定网络类型
  • 执行创建虚拟机命令
  1. [[email protected] ~]# virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.1-x86 --cdrom=/opt/CentOS-7.1-x86_64.iso --disk path=/opt/CentOS-7.1-x86_64.raw --nehics vnc,listen=0.0.0.0 --notwork network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
  2. Starting install...
  3. Creating domain... | 0 B 00:03
  4. Domain installation still in progress. You can reconnect to
  5. the console to complete the installation process

4.5 虚拟机基本操作学习

生成kvm虚拟机:virt-install
查看在运行的虚拟机:virsh list
查看所有虚拟机:virsh list –all
查看kvm虚拟机配置文件:virsh dumpxml name
启动kvm虚拟机:virsh start name
正常关机:virsh shutdown name
非正常关机(相当于物理机直接拔掉电源):virsh destroy name
删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)
根据配置文件定义虚拟机:virsh define file-name.xml
挂起,终止:virsh suspend name
恢复挂起状态:virsh resumed name

  • 启动刚才创建的虚拟机
  1. [[email protected] ~]# virsh start CentOS-7.1-x86_64
  2. Domain CentOS-7.1-x86_64 started

4.6 编辑kvm的xml文件,更改虚拟机CPU配置

  • 配置虚拟机的cpu,两种方式(启动的时候指定核数,更改xml)
  • 第一种方法:为了实现cpu的热添加,就需要更改cpu的最大值,当然热添加的个数不能超过最大值
  1. [[email protected] ~]# virsh edit CentOS-7.1-x86_64
  2. <vcpu placement=‘auto‘current="1">4</vcpu> 当前为1,自动扩容,最大为4
  • 重启虚拟机
  1. [[email protected] ~]# virsh shutdown CentOS-7.1-x86_64
  2. Domain CentOS-7.1-x86_64 is being shutdown
  3. [[email protected] ~]# virsh start CentOS-7.1-x86_64
  4. Domain CentOS-7.1-x86_64 started
  • 登录虚拟机上,查看cpu信息,确认cpu的个数,下面开始进行cpu热添加
  • cpu的热添加(cpu只支持热添加,不支持热减少)
  1. [[email protected] ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live
  • 再到虚拟机中查看cpu信息
  • kvm版本较高,并不需要echo “1”到/sys/devices/system/cpu/cpu1/online 进行激活,自动可以激活。
  1. [[email protected] ~]# cat /sys/devices/system/cpu/cpu1/online
  2. 1
  • 第二种方法:安装的时候指定
    virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus sockets=2,cores=4,thread=2

4.7 编辑kvm的xml文件,更改虚拟机内存配置

  • 内存的设置拥有一个“气球(balloon)机制”,可以增大减少,但是也要设置一个最大值,默认并没有设置最大值,也可以在安装的时候指定,这里不再重复此方法
  1. [[email protected] ~]# virsh edit CentOS-7.1-x86_64
  2. <memory unit=‘KiB‘>4194304</memory>把最大内存改为4G
  3. <currentMemory unit=‘KiB‘>1048576</currentMemory>当前内存为1G
  • 重启虚拟机并查看当前状态的内存使用情况
  1. [[email protected] ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
  2. balloon: actual=1024
  • 对内存进行热添加并查看
  1. [[email protected] ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd balloon
  2. unexpected end of expression
  3. [[email protected] ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
  4. balloon: actual=2000
  • 更改虚拟机中存储,硬盘设置(不建议在生产环境使用硬盘的扩大收缩模式,很容易产生故障)
  1. [[email protected] ~]# qemu-img --help |grep -i "formats:"
  2. Supported formats: vvfat vpc vmdk vhdx vdi sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg cloop bochs blkverify blkdebug
  • 从结果看出,kvm支持很多种硬盘格式
    硬盘格式总体上分为两种:1为全镜像格式,2为稀疏格式
    全镜像格式(典型代表raw格式),其特点:设置多大就是多大,写入速度快,方便的转换为其他格式,性能最优,但是占用空间大
    稀疏模式(典型代表qcow2格式),其特点:支持压缩,快照,镜像,更小的存储空间(即用多少占多少)
    硬盘格式都可以通过qemu-img管理,详情qemu-img –help

4.8 编辑kvm的xml文件,更改虚拟机网桥连接配置

  • 默认情况是NAT情况,但是在生产情况,使用更多的是桥接模式,更改虚拟机为网桥模式,原理图如下,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据

    修改eth0(这里Centos7的eth0在装机的时候就指定,不需要特意指定了)
  • 添加一个网桥并查看
  1. [[email protected] ~]# brctl addbr br0
  • 把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
  1. [[email protected] ~]# brctl addif br0 eth0 && ip addr del dev eth0 10.0.0.123/24 && ifconfig br0 10.0.0.123/24 up &&route add default gw 10.0.0.2 && iptables -F
  • 编辑虚拟机的网络配置使用br0网桥模式
  1. [[email protected] ~]# virsh edit CentOS-7.1-x86_64
  2. <interface type="bridge"> <!--虚拟机网络连接方式-->
  3. <source bridge="br0" /> <!-- 当前主机网桥的名称-->
  4. <mac address="00:16:e4:9a:b3:6a" /> <!--为虚拟机分配mac地址,务必唯一,如果是dhcp获得同样ip,引起冲突-->
  5. </interface>
  • 重启虚拟机,网桥模式生效,此时使用crt便可以链接到所创建的虚拟机了,在vmvare机器上使用ifconfig查看详情
  1. [[email protected] ~]# ifconfig
  2. br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  3. inet 10.0.0.123 netmask 255.255.255.0 broadcast 10.0.0.255
  4. inet6 fe80::20c:29ff:fe67:5a43 prefixlen 64 scopeid 0x20<link>
  5. ether 00:0c:29:67:5a:43 txqueuelen 0 (Ethernet)
  6. RX packets 5178 bytes 278872 (272.3 KiB)
  7. RX errors 0 dropped 0 overruns 0 frame 0
  8. TX packets 7599 bytes 862371 (842.1 KiB)
  9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  10. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  11. inet6 fe80::20c:29ff:fe67:5a43 prefixlen 64 scopeid 0x20<link>
  12. ether 00:0c:29:67:5a:43 txqueuelen 1000 (Ethernet)
  13. RX packets 13641 bytes 973732 (950.9 KiB)
  14. RX errors 0 dropped 0 overruns 0 frame 0
  15. TX packets 21843 bytes 2417546 (2.3 MiB)
  16. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  17. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  18. inet 127.0.0.1 netmask 255.0.0.0
  19. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  20. loop txqueuelen 0 (Local Loopback)
  21. RX packets 10 bytes 1044 (1.0 KiB)
  22. RX errors 0 dropped 0 overruns 0 frame 0
  23. TX packets 10 bytes 1044 (1.0 KiB)
  24. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  25. virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  26. inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
  27. ether 52:54:00:fc:d1:d1 txqueuelen 0 (Ethernet)
  28. RX packets 97 bytes 8122 (7.9 KiB)
  29. RX errors 0 dropped 0 overruns 0 frame 0
  30. TX packets 36 bytes 5157 (5.0 KiB)
  31. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  32. vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  33. inet6 fe80::fc54:ff:fe99:1b4e prefixlen 64 scopeid 0x20<link>
  34. ether fe:54:00:99:1b:4e txqueuelen 500 (Ethernet)
  35. RX packets 42 bytes 7295 (7.1 KiB)
  36. RX errors 0 dropped 0 overruns 0 frame 0
  37. TX packets 45 bytes 4919 (4.8 KiB)
  38. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

五、KVM的优化

5.1 cpu的优化

  • inter的cpu的运行级别,按权限级别高低Ring3->Ring2->Ring1->Ring0,(Ring2和Ring1暂时没什么卵用)Ring3为用户态,Ring0为内核态
  • Ring3的用户态是没有权限管理硬件的,需要切换到内核态Ring0,这样的切换(系统调用)称之为上下文切换,物理机到虚拟机多次的上下文切换,势必会导致性能出现问题。对于全虚拟化,inter实现了技术VT-x,在cpu硬件上实现了加速转换,CentOS7默认是不需要开启的。
  • cpu的缓存绑定cpu的优化
  1. [[email protected] ~]# lscpu|grep cache
  2. L1d cache: 32K
  3. L1i cache: 32K
  4. L2 cache: 256K
  5. L3 cache: 3072K
  • L1 L2 L3 三级缓存和CPU绑定
    L1是静态缓存,造价高,L2,L3是动态缓存,通过脉冲的方式写入0和1,造价较低。cache解决了cpu处理快,内存处理慢的问题,类似于memcaced和数据库。如果cpu调度器把进程随便调度到其他cpu上,而不是当前L1,L2,L3的缓存cpu上,缓存就不生效了,就会产生miss,为了减少cache miss,需要把KVM进程绑定到固定的cpu上,可以使用taskset把某一个进程绑定(cpu亲和力绑定,可以提高20%的性能)在某一个cpu上,例如:taskset -cp 1 25718(1指的是cpu1,也可以绑定到多个cpu上,25718是指的pid).
    cpu绑定的优点:提高性能,20%以上
    cpu绑定的缺点:不方便迁移,灵活性差

5.2内存的优化

  • 内存寻址:宿主机虚拟内存 -> 宿主机物理内存
    虚拟机的虚拟内存 -> 虚拟机的物理内存
    以前VMM通过采用影子列表解决内存转换的问题,影子页表是一种比较成熟的纯软件的内存虚拟化方式,但影子页表固有的局限性,影响了VMM的性能,例如,客户机中有多个CPU,多个虚拟CPU之间同步页面数据将导致影子页表更新次数幅度增加,测试页表将带来异常严重的性能损失。如下图为影子页表的原理图

    在此之际,Inter在最新的Core I7系列处理器上集成了EPT技术(对应AMD的为RVI技术),以硬件辅助的方式完成客户物理内存到机器物理内存的转换,完成内存虚拟化,并以有效的方式弥补了影子页表的缺陷,该技术默认是开启的,如下图为EPT技术的原理
  • KSM内存合并
    宿主机上默认会开启ksmd进程,该进程作为内核中的守护进程存在,它定期执行页面扫描,识别副本页面并合并副本,释放这些页面以供它用,CentOS7默认是开启的
  1. [[email protected] ~]# ps aux|grep ksmd|grep -v grep
  2. root 286 0.0 0.0 0 0 ? SN 12:32 0:00 [ksmd]
  • 大页内存,CentOS7默认开启的
  1. [[email protected] ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
  2. [always] madvise never
  3. [[email protected] ~]# ps aux |grep khugepage|grep -v grep
  4. root 287 0.2 0.0 0 0 ? SN 12:32 0:21 [khugepaged]

Linux平台默认的内存页面大小都是4K,HugePage进程会将默认的的每个内存页面可以调整为2M。

5.3 磁盘IO的优化

  • IO调度算法,也叫电梯算法,详情请看http://www.unixhot.com/article/4
    ① Noop Scheduler:简单的FIFO队列,最简单的调度算法,由于会产生读IO的阻塞,一般使用在SSD硬盘,此时不需要调度,IO效果非常好
    ② Anticipatory IO Scheduler(as scheduler)适合大数据顺序顺序存储的文件服务器,如ftp server和web server,不适合数据库环境,DB服务器不要使用这种算法。
    ③ Deadline Schedler:按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,就不会产生饿死的状况,一般应用在数据库
    ④ Complete Fair Queueing Schedule:完全公平的排队的IO调度算法,保证每个进程相对特别公平的使用IO
  • 查看本机Centos7默认所支持的调度算法
  1. [[email protected] ~]# dmesg|grep -i "scheduler"
  2. [ 11.312549] io scheduler noop registered
  3. [ 11.312555] io scheduler deadline registered (default)
  4. [ 11.312606] io scheduler cfq registered
  • 临时更改某个磁盘的IO调度算法,将deadling模式改为cfq模式
  1. [[email protected] ~]# cat /sys/block/sda/queue/scheduler
  2. noop [deadline] cfq
  3. [[email protected] ~]# echo cfq >/sys/block/sda/queue/scheduler
  4. [[email protected] ~]# cat /sys/block/sda/queue/scheduler
  5. noop deadline [cfq]
  • 使更改的IO调度算法永久生效,需要更改内核参数
  1. [[email protected] ~]# vim /boot/grub/menu.lst
  2. kernel /boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet

5.4 cache的优化

关于write through和write back,默认write through即可

  • Write-back
    在这种策略下,当数据被写到raid卡的cache中,控制器就向IO调度器返回了写操作完成信号; 双刃剑,它虽然带来了IO性能的提升,但是随之而来的风险:因为cache是ROM,假设服务器突然断电,则cache中的数据可能丢失; 为了解决这个问题,raid卡加加装一块锂电池(BBU),即当服务器断电时,能把cache中的数据刷到磁盘上;同样的道理,BBU又成为一个风险点,因为锂电池需要保证始终有足够的电量来保证能将cache中的数据写到磁盘上,raid卡会加入一个BBU的管理策略,learn cycle(充放电周期,一般有30/90天,让电池充放电一次,持续约6小时),那么这6小时又称为一个风险点;所以raid卡又会增加一个策略:No WB when bad bbu,即当BBU坏掉,或者BBU正在充放电时,禁用write-back,此时Write policy就会变成:write-through。
  • Write through
    只有当数据被写到物理磁盘中,控制器才向IO调度器返回了写操作完成信号; 这种策略以牺牲IO性能,来保证数据安全性,淘宝这边的策略:因为Write-Through的io性能无法满足业务的需求,所以我们这边会采用另一个模式:WB when bad bbu,即不管bbu状态是否正常,我们都会采用write-back,那数据安全怎么办?服务器异常断电的情况,在我们这边概率极低;即便很不幸的我们IDC局部断电了,我们也有主备模式来保证数据的相对安全;我们会监控BBU的状态,一旦发生了BBU failed,我们会将安排停机更换

六、创建虚拟机镜像

6.1 虚拟磁盘及镜像

由于在一开始创建了虚拟磁盘,并命名为CentOS-7.1-x86_64.raw,这就是虚拟机的镜像喽。

  1. [[email protected] ~]# cd /opt/
  2. [[email protected] opt]# ls
  3. CentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw rh

6.2 镜像制作原则

  • 分区的时候,只分一个/根分区,并不需要swap分区,由于虚拟机的磁盘性能就不好,如果设置了swap分区,当swap工作的时候,性能会更差。例如阿里云主机,就没有交换分区。
  • 镜像制作需要删除网卡(eth0)中的UUID,如果有udev(/etc/udev/rules.d/70-persistent-ipoib.rules)的规则也要删除
  • 关闭selinux,关闭iptables
  • 安装基础软件的包:net-tools lrzsz screen tree vim wget

     

来自为知笔记(Wiz)

时间: 2024-08-03 00:31:53

带你走进虚拟化世界之KVM的相关文章

带你走进虚拟化世界之kvm(转载)

http://chuck.blog.51cto.com/10232880/1720953 带你走进虚拟化世界之kvm 2015-12-08 23:10:46 标签:云计算 虚拟化 kvm 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chuck.blog.51cto.com/10232880/1720953 一.走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算

小心公共wifi 之小白客带你走进黑客世界:kali linux下的无线攻击技术

本文标签: 黑客世界 wifi安全 无线攻击技术 公共wifi不安全 kali+linux 原文地址:http://whosmall.com/?post=460 我们常说公共wifi不安全,那么到底不安全在哪些地方呢?当不怀好意者和你同在一个wifi下,你的手机或者笔记本会被监听吗?除了上网被监视以外,还会产生什么不好的后果?介于小伙伴们对于wifi这一块比较感兴趣,在这篇文章里,就先为大家普及一下在公共wifi下究竟有多危险. 实验环境 一台装有kali linux的笔记本(模拟攻击者)ip地

凌辰:移动互联网营时代,钱脉通创客带你走进创客世界!

前言:当下,除了空气.水电是人类必需的元素,还有一个必不可少的就是互联网.互联网赋予人类无限的可能,让个人力量增强.个人价值释放.而如今我们每个人都身处移动互联网时代.伴随着移动通信的发展.微信微博等社交软件的深入人心,移动网民呈现爆发趋势,其中微信.微博创造的经济神话层出不穷,移动互联网营销被越来越多人重视. 今天,广东广播电视台栏目组来到深圳,采访了深圳市互联网创客促进会会长单位--钱脉通集团创始人凌辰. 作为21世纪移动互联网营销的年轻杰出代表,凌辰的钱脉通集团和凌辰本人都对中国移动互联网

小丁带你走进git世界五-远程仓库

一.文件,指令讲解 首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库里面新建了version.txt内容也是一样的v1.0: 图一 图二 图一为本地仓库,图二为克隆的远程仓库,首先我们应该看一下config里面的区别: 图三 图四 很容易看到了区别就是图四为远程仓库内容. 从这个文件中我们可以了解到: 1,本地库的当前分支为master,其关联的远程库名称为orig

阿里的27个项目资源带你走进Github世界

招式 1.设计语言 & 前端框架 Ant Design ★ 14889 Ant Design 是蚂蚁金服开发和正在使用的一套企业级的前端设计语言和基于 React 的前端框架实现.它企业级金融产品的交互语言和视觉体系:丰富实用的 React UI 组件:基于 React 的组件化开发模式:背靠 npm 生态圈:基于 webpack 的调试构建方案,支持 ES6. https://github.com/ant-design/ant-design 招式 2.构建移动跨平台 UI 的框架 weex ★

《手牵手带你走进python世界》系列五

import requests from bs4 import BeautifulSoup import datetime import pandas as pd import matplotlib.pyplot as plt import re import jieba import numpy as np from wordcloud import WordCloud, ImageColorGenerator url = "https://comment.bilibili.com/92542

小丁带你走进git的世界三-撤销修改(转)

一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 git revert 撤销本次提交. 二.指令讲解 Git checkout 首先我们对文件的一个修改,对master.txt进行了修改 修改结果我们利用上面的知识来进行查看. 新增加了Test这么一段话,如果我们想要将工作区的内容添加到暂存区会使用git  add这个命令,如果我们想要还原工作区内容

【密码学】一万字带您走进密码学的世界(下)

引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 在<一万字带您走进密码学的世界(上)>的文章中我们探讨了对称密码体系,哈希函数等技术,本文继续探讨密码学剩余的部分,本文的主要内容包括,非对称密码体系,签名算法等,因为本部分是区块链技术的基石,所以我会讲的更加详细一点,虽然我已经尽最大努力使思想简化,但是其中的数学理论对于很多人还是很晦涩,建议读者开始之前先读下数论的有关

GDI+入门——带你走进Windows图形的世界

一.GDI+基础 1.GDI+简介 GDI+是微软的新一代二维图形系统,它完全面向对象,要在Windows窗体中显示字体或绘制图形必须要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象,此外还包括一些新的绘图功能,比如渐变.除锯齿.纹理等. GDI+包括三部分:二维矢量图形的绘制.图像处理和文字显示.GDI+使用的各种类大都包含在命名空间system::Drawing中. 2.常用的数据结构 在使用GDI+显示文字和绘制图形时,需要用到一些数据结构,例如Size.Point.Recta