zoukankan      html  css  js  c++  java
  • 云计算与虚拟化

    (一)云计算概述

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

    1:云计算之前的使用模式

    • IDC 托管
    • IDC 租用
    • 虚拟主机(买空间)
    • VPS:虚拟专用主机

    2:传统数据中心面临的问题

    • 资源使用率低
    • 资源分配不均
    • 自动化能力差

    3:云计算的优势

    1. 云计算是一种使用模式,不是一种技术
    2. 云计算的使用方式:通过网络访问
    3. 云计算的优势:弹性计算、按需计费

    4:云计算的特点

    1. 资源池化
    2. 无处不在的网络访问
    3. 可随时调节的自助服务
    4. 可测量的服务量
    5. 快速的变化伸缩

    5:云计算的服务模式

    827552-20151228163141292-333601830

    A:支撑服务

        由支撑网络来提供,云计算模式实现的使用的方式。

    B:IaaS基础设施即服务

        消费者通过支撑网络可以从完善的计算机基础设施获得服务。这类服务称为基础设施即服务,基于 Internet 的服务(如存储和数据库)是 IaaS的一部分。

    C:PaaS平台即服务

        PaaS(Platform-as-a-Service:平台即服务)是指将软件研发的平台作为一种服务,以SaaS的模式提交给用户。因此,PaaS也是SaaS模式的一种应用。

    D:SaaS

         它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。

    6:云计算的类型

    A:公有云

        公有云通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:阿里云、腾讯云、青云、百度云、盛大云、迅达云、等等。

    B:私有云

         私有云(Private Clouds)是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。

    C:混合云

         混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的

    (二)虚拟化概述

          虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

          虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

    1:虚拟化的分类

    • 全虚拟化
    • 半虚拟化
    • 平台虚拟化
    • 硬件虚拟化(Inter vt-x/EPT) (AMD AMD-v /RVI)
    • 软件虚拟化
    • 桌面虚拟化
    • 应用虚拟化
    • 存储虚拟化
    • 网络虚拟化

    2:虚拟化的优势

    1. 虚拟化可以虚拟出不同的虚拟操作系统。
    2. 虚拟机之间是相互独立互不影响的。
    3. 支持异构。
    4. 支持快照、克隆、还原等操作

    (三)云计算与虚拟化的区别与联系

    1:虚拟化是一种技术,云计算是一种使用模式。

    2:虚拟化是指将物理的实体,通过软件模式,形成若干虚拟存在的系统,其实真是运作还是在实体上,只是划分了若干区域或者时域划分

    3:云计算的基础是虚拟化,但虚拟化只是云计算的一部分,云计算其实就是在虚拟化出若干资源池以后的应用,但虚拟化并不是只对应云计算的

    (四)KVM虚拟化

    • KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
    • 是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
    • 它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
    • KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
    • KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。

    1:KVM的优势

    1. 嵌入到Linux的Kernel中 (提高兼容性)
    2. 代码级资源调用(提高性能)
    3. 虚拟机就是一个进程
    4. 直接支持MUMA技术(NUMA(Non Uniform Memory Access Architecture)技术可以使众多服务器像单一系统那样运转,同时保留小系统便于编程和管理的优点。)

    2:KVM安装前提

         CPU要支持虚拟化,服务器上默认一般是开启的,虚拟机要自己启动VT-EPT技术

    [root@oldboy-node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo

         Inter处理器对应:VMX

         AMD处理器对应:SVM

    3:KVM虚拟机安装

    (1):查看系统版本

    [root@linux-node1~]# cat /etc/redhat-release 
    CentOSLinux release 7.1.1503 (Core)

    (2):安装KVM相关的组件

    [root@oldboy-node1 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install

          kvm:linux内核中的一个模块,不需要安装只要加载就行,通过用户态进程来管理。

          qemu:虚拟化软件,支持多种架构,可扩展,可移植

          qemu-kvm:用户态管理KVM,网卡、声卡、PCI设备等的管理

          libvirt:是一个虚拟化 API 和虚拟机(VMs)管理后台,支持远程或本地访问,支持多种虚拟化后端 (QEMU/KVMVirtualBoxXen,等等) 。

    (3)检查KVM是否加载

    [root@oldboy-node1 ~]# lsmod  | grep kvm
    kvm_intel             148081  0
    kvm                   461126  1 kvm_intel

    (4)启动并设置开机启动libvirt

    [root@linux-node1~]# systemctl enable libvirtd.service  
    [root@linux-node1~]# systemctl start libvirtd.service
    [root@oldboy-node1 ~]# systemctl status libvirtd.service

    (5)  创建虚拟机

        1:虚拟机的创建命令

            –virt-type:指定虚拟机类型(kvm、qemu、xen)

            –name:指定虚拟机的名称

            –raw:指定内存大小

            –cpu:指定cpu的核数(默认为1)

            –cdrom:指定镜像

            –disk:指定磁盘路径(即上文创建的虚拟磁盘)

            –network:指定网络类

       2:创建硬盘(创建虚拟磁盘,-f指定格式,路径/opt/CentOS-7.1-x86_64.raw,大小10G)

    [root@oldboy-node1 ~]# 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

       3:镜像的拷贝

    [root@oldboy-node1 ~]# dd if=/dev/cdrom of=/opt/CentOS-7.1.iso

       4:虚拟机的创建

    [root@oldboy-node1 ~]# virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.1.iso --disk path=/opt/CentOS-7.1-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

       5:使用VNC连接虚拟机

           使用VNC客户端连接虚拟机  物理机的地址:5900 默认是从5900开始,以此类推。也可以通过端口grep vnc查看。

       6:修改网卡的名称

           因为CentOS7以后,网卡的命名发生改变。可以在安装的时候就做出修改

    image

           按下Tab键,然后在quiet后面添加  net.ifnames=0 biosdevname=0

    至此,一台KVM虚拟机安装成功。

    (6)KVM的日常应用管理

         1:虚拟机的查看

    # 当前正在运行中的虚拟机
    [root@linux-node1 opt]# virsh list 
    Id    Name                           State
    —————————————————-
     1   CentOS-7-x86_64running
    # 当前物理机中的所有的虚拟机
    [root@linux-node1 opt]# virsh list --all

         也可以在物理机进程中查看,KVM虚拟机就是一个KVM进程在运行

         2:虚拟机的开关

    关闭虚拟机
    [root@oldboy-node1 ~]# virsh shudown CentOS-7.1-x86_64(主机名)
    [root@oldboy-node1 ~]# virsh destroy CentOS-7.1-x86_64(主机名)
    打开虚拟机
    [root@oldboy-node1 ~]# virsh start CentOS-7.1-x86_64
    删除虚拟机
    [root@oldboy-node1 ~]# virsh undefine CentOS-7.1-x86_64
    挂起
    [root@oldboy-node1 ~]# virsh suspended CentOS-7.1-x86_64
    恢复
    [root@oldboy-node1 ~]# virsh resume CentOS-7.1-x86_64

         3:虚拟机CPU的扩容

    编辑虚拟机
    virsh edit CentOS-7.1-x86_64
    # 为了实现CPU的热添加,就需要更改Cpu的最大值,当然热添加值不能超过最大值
    # 当前为1,自动扩容最大为4
    [root@linux-node1 opt]# virsh edit CentOS-7-x86_64 
    <vcpu placement=’auto’ current=”1″>4</vcpu>  
    # 热修改为2个cpu(不知减少),高版本自动激活
    [root@linux-node1 opt]# virsh setvcpus CentOS-7-x86_64 2 –live  
    # 通过vnc登录KVM虚拟机查看是否扩容成功
    [root@KVM]# grep processor /proc/cpuinfo |wc -l  
    # 在创建虚拟机时指定cpu
    [root@linux-node1 ~]# virt-install –help|grep vcpus
      –vcpus VCPUS         
    """
      为虚拟机配置的 vcpus 数。
      例如:
        –vcpus 5
        –vcpus 5,maxcpus=10,cpuset=1-4,6,8
        –vcpus sockets=2,cores=4,threads=2,
    """

         4:内存热膨胀和压缩

    # 查看当前KVM内存大小
    [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 –hmp –cmd info balloon  
    balloon: actual=1024
    # 热添加600M
    [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 –hmp –cmd balloon 600
    # 在配置文件中修改
    [root@linux-node1 network-scripts]# virsh  edit CentOS-7.1-1-x86_64
    最大内存<memory unit='KiB'>4048576</memory>
    当前内存<currentMemory unit='KiB'>1048576</currentMemory>

         5:硬盘的模式

            生产中不建议对线上的服务器的硬盘进行更改,因此直接不对此赘述。

            硬盘格式:

               RAW:全镜像格式:设置多大就是多大,写入速度快,可以随便转换成其他的格式。性能最优。但是占用空间大。

               QCOW2:稀疏格式:支持写时拷贝(Cow,copy-on-write)压缩,快照,镜像,更小的存储空间。(用多少给多少)可选择基于Zlib的压缩方式,可以选择AES加密

            创建qcow2和raw文件

    [root@linux-node1 ~]#  qemu-img create -f qcow2 test.qcow2 10G
    Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
    
    [root@linux-node1 ~]#  qemu-img create -f raw test.raw 10G
    Formatting 'test.raw', fmt=raw size=10737418240

            空间使用情况对比

    [root@linux-node1 ~]#   ll -sh test.*
    200K -rw-r--r-- 1 qiaoliyong qiaoliyong 193K 5 月   6 10:29 test.qcow2
       0 -rw-r--r-- 1 qiaoliyong qiaoliyong  10G 5 月   6 10:28 test.raw
    
    [root@linux-node1 ~]#  stat test.raw
      文件:"test.raw"
      大小:10737418240    块:0          IO 块:4096   普通文件
    
    [root@linux-node1 ~]#  stat test.qcow2
      文件:"test.qcow2"
      大小:197120        块:400        IO 块:4096   普通文件

    注:

         参考:http://www.ibm.com/developerworks/cn/linux/1409_qiaoly_qemuimgages/

        6:网卡的配置

    # 添加一个网卡
    [root@linux-node1~]# brctl addbr br0  
    # 查看网卡信息
    [root@linux-node1 ~]# brctl show  
    bridge
    name     bridge id               STP enabled     interfaces
    br0             8000.000000000000       no
    virbr0          8000.5254009f0311       yes             virbr0-nic
    # 把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
    [root@linux-node1 ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.56.111/24 && ifconfig br0 192.168.56.111/24 up && route add default gw192.168.56.2 && iptables -F  
    # 查看网桥的IP
    [root@linux-node1~]# ifconfig br0  
    br0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.56.111  netmask 255.255.255.0  broadcast 192.168.56.255
            inet6 fe80::20c:29ff:fe5d:cc27  prefixlen 64scopeid 0x20<link>
            ether 00:0c:29:5d:cc:27  txqueuelen 0(Ethernet)
            RX packets 4813  bytes 472527 (461.4 KiB)
            RX errors 0  dropped 0overruns 0  frame 0
            TX packets 2705  bytes 510369 (498.4 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0collisions 0
    # 编辑虚拟机的网络配置使用br0网桥模式
    [root@linux-node1 ~]# virsh edit CentOS-7-x86_64  
     <interface type=’bridge’>                                          # 虚拟机网络连接方式
      <mac address=’52:54:00:22:04:0f’/>                               #为虚拟机分配MAC地址,务必唯一,如果是dhcp获得同样IP会引起冲突
      <source bridge=’br0’/>                                           #当前主机网桥名称
    # 重启虚拟机
    # 关闭KVM虚拟机
    [root@linux-node1 opt]# virsh shutdown CentOS-7-x86_64  
    Domain CentOS-7-x86_64 is being shutdown
    # 启动KVM虚拟机
    [root@linux-node1 opt]# virsh start CentOS-7-x86_64  
    Domain CentOS-7-x86_64 started
    # 然后配置静态IP地址,重启网卡,即可以通过xshell连接上KVM虚拟机了。

    (7)KVM性能优化

      1:CPU的优化

         Inter的cpu运行级别,按权限级别高低Ring3->Ring1->Ring0(Ring2和Ring1暂时不使用)Ring3为用户态;Ring0为内核态

    Image

       Ring3的用户态是没有权限管理硬件的,需要切换到内核态Ring0,这样的切换(系统调用)称为上下文切换,物理机到虚拟机多次的上下文切换,势必会导致性能出现问题。对于全虚拟化,inter实现了技术VT-x,在CPU硬件上实现了加速转换,CentOS7默认是不需要开启的。

      2:CPU缓存绑定

    [root@linux-node1 ~]# lscpu|grep cache
    L1d cache: 32K
    L1i cache: 32K
    L2 cache: 256K
    L3 cache:  3072K

      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 125718(1指的是cpu1,也可以绑定到多个cpu上,25718是指的pid).

    cpu绑定的优点:提高性能,20%以上

    cpu绑定的缺点:不方便迁移,灵活性差

    3:内存优化

    原本实现方式:

        虚拟机的虚拟内存===>虚拟机的物理内存

        宿主机的虚拟内存===>宿主机的物理内存

    现在实现方式:EPT(inter)

         虚拟机的虚拟内存=====EPT=====宿主机的物理内存

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

    Image

    在此之际,Inter在最新的Core I7系列处理器上集成了EPT技术(对应AMD的为RVI技术),以硬件辅助的方式完成客户物理内存到机器物理内存的转换,完成内存虚拟化,并以有效的方式弥补了影子页表的缺陷,该技术默认是开启的,如下图1-2为EPT技术的原理。

    KSM内存合并

        宿主机上默认会开启ksmd进程,该进程作为内核中的守护进程存在,它定期执行页面扫描,识别副本页面并合并副本,释放这些页面以供它用,CentOS7默认是开启状态

    [root@linux-node1 ~]# ps aux |grep ksmd
    root        280  0.0  0.0      0     0 ?        SN   20:37   0:00 [ksmd]

    大页内存

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

    [root@linux-node1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
    [always] madvise never
    [root@linux-node1 ~]# ps aux|grep hugepage|grep -v grep
    root        2810.0  0.0      00 ?        SN   04:220:03 [khugepaged]

    4:磁盘IO优化

    IO调度算法,也叫电梯算法,详情请看赵班长博客:http://www.unixhot.com/article/4

    1、Noop Scheduler:简单的FIFO队列,最简单的调度算法,由于会产生读IO的阻塞,一般使用在SSD硬盘,此时不需要调度,IO效果非常好

    2、Anticipatory IO Scheduler(as
    scheduler)适合大数据顺序顺序存储的文件服务器,如ftp server和web server,不适合数据库环境,DB服务器不要使用这种算法。

    3、Deadline Schedler:按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,就不会产生饿死的状况,一般应用在数据库

    4、Complete Fair Queueing Schedule:完全公平的排队的IO调度算法,保证每个进程相对特别公平的使用IO

    # 查看本机Centos7默认所支持的调度算法
    [root@linux-node1 ~]# dmesg|grep -i “scheduler”   
    [    1.332147] io scheduler noop registered
    [    1.332151] io scheduler deadline registered (default)
    [    1.332190] io scheduler cfq registered
     
    # 临时更改某个磁盘的IO调度算法,将deadling模式改为cfq模式
    [root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler
    noop [deadline] cfq
    [root@linux-node1 ~]# echo cfq >/sys/block/sda/queue/scheduler            
    [root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler
    noop deadline [cfq]
    # 使更改的IO调度算法永久生效,需要更改内核参数
    [root@linux-node1 ~]# vim /boot/grub/menu.lst  
    kernel /boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet

     

  • 相关阅读:
    在路上(转)
    我,机器
    梧桐道上
    傅盛:如何快慢“炼”金山?(转)
    [JS]笔记15之客户端存储cookie
    [JS]笔记14之事件委托
    [JS]笔记13之Date对象
    将博客搬至CSDN
    [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
    [JS]笔记11之正则表达式
  • 原文地址:https://www.cnblogs.com/caoxiaojian/p/5083005.html
Copyright © 2011-2022 走看看