雲計算概述與KVM

1、雲計算概述css

   雲計算主要是一種按需付費的網絡模式,這種模式提供可用的、便捷的、按需的網絡訪問,進入可配置的計算資源共享池(資源包括網絡,服務器,存儲,應用軟件,服務),這些資源可以被快速提供,只需投入不多的管理工做,或與服務供應商進行不多的交互。分爲三大層:IaaS(基礎設施即服務,面向運維人員)、PaaS(平臺即服務,面向開發人員),SaaS(軟件即服務,面向終端用戶)。node

   虛擬化分類:服務器虛擬化、桌面虛擬化、應用虛擬化,私有云python

1.1 雲計算的特色和優點

1)雲計算是一種使用模式linux

2)雲計算必須經過網絡訪問ios

3)彈性計算,按需付費web

1.2 在雲計算以前的模式或技術

1)IDC託管算法

2)IDC租用docker

3)虛擬主機(賣空間的)數據庫

4)vps:虛擬專有主機,openvz超賣很坑人的,xen不支持超賣vim

1.3 相對於雲計算,傳統數據中心面臨的問題

1)資源利用率低(大部分機器cpu所佔比率低於15%)

2)資源分配不合理

舉例:因爲某個活動,上線各類服務器,可是並未達到實際效果,致使服務器資源浪費

3)很難實現真正的運維自動化

1.4圖解雲計算的三層服務

基礎設施:計算,存儲,網絡服務
平臺服務:對象存儲,身份認證,運行環境,消息隊列,數據庫服務
應用平臺:監控,內容,合做,通訊,財務

wKioL1g6RpehEbCHAADO5zfYUFk967.jpg-wh_50

2、雲計算與虛擬化

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

  • 公有云(Public Cloud
        一般指第三方提供商爲用戶提供的可以使用的雲,公有云通常可經過 Internet 使用,多是免費或成本低廉的,公有云的核心屬性是共享資源服務。這種雲有許多實例,可在當今整個開放的公有網絡中提供服務。例如:aws,阿里雲,×××,百度雲,騰訊雲。    
        優勢:價格低廉,使用方便

  • 私有云(Private     Clouds)
        是爲一個客戶單獨使用而構建的,於是提供對數據、安全性和服務質量的最有效控制。該公司擁有基礎設施,並能夠控制在此基礎設施上部署應用程序的方式。私有云可部署在企業數據中心的防火牆內,也能夠將它們部署在一個安全的主機託管場所,私有云的核心屬性是專有資源。
        優勢:可控,數據安全(銀行必然使用私有云

  • 混合雲(Hybrid Cloud
        混合雲融合了公有云和私有云,是近年來雲計算的主要模式和發展方向。咱們已經知道私企業主要是面向企業用戶,出於安全考慮,企業更願意將數據存放在私有云中,可是同時又但願能夠得到公有云的計算資源,在這種狀況下混合雲被愈來愈多的採用,它將公有云和私有云進行混合和匹配,以得到最佳的效果,這種個性化的解決方案,達到了既省錢又安全的目的,例如在一次活動中,只須要暫時幾臺機器,在私有云存在的狀況,考慮混合雲的使用,是最合理化的。
        優勢:集合的使用方式更完美,可擴展,更節省

2.2雲計算的層次

wKioL1g6RlzAtF6sAAFGfleMcHo250.jpg-wh_50

wKiom1g6Rl3SqeoiAABojKTfa_o768.gif-wh_50

  • SaaS
        提供給客戶的服務是運營商運行在雲計算基礎設施上的應用程序,用戶能夠在各類設備上經過客戶端界面訪問,如瀏覽器。消費者不須要管理或控制任何雲計算基礎設施,包括網絡、服務器、操做系統、存儲等等;平時使用的郵件服務器,即屬於SaaS服務。

  • PaaS
        提供給消費者的服務是把客戶採用提供的開發語言和工具(例如Javapython, .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、虛擬化的分類

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服務器虛擬化,桌面虛擬化,應用虛擬化

  • 服務器虛擬化
        數量少的狀況推薦使用ESXIXenServer
        數量大的狀況推薦使用KVMRHEV(並不開源),oVirtOpenstackVmvare vshpere

  • 桌面虛擬化
        桌面虛擬化依賴於服務器虛擬化,在數據中心的服務器上進行服務器虛擬化,生成大量的獨立的桌面操做系統(虛擬機或者虛擬桌面),同時根據專有的虛擬桌面協議發送給終端設備。用戶終端經過以太網登錄到虛擬主機上,只須要記住用戶名和密碼及網關信息,便可隨時隨地的經過網絡訪問本身的桌面系統,從而實現單機多用戶。多用於IP外包,呼叫中心,銀行辦公、移動桌面。

  • 應用虛擬化
        技術原理是基於應用/服務器計算A/S架構,採用相似虛擬終端的技術,把應用程序的人機交互邏輯(應用程序界面、鍵盤及鼠標的操做、音頻輸入輸出、讀卡器、打印輸出等)與計算邏輯隔離開來。在用戶訪問一個服務器虛擬化後的應用時,用戶計算機只須要把人機交互邏輯傳送到服務器端,服務器端爲用戶開設獨立的會話空間,應用程序的計算邏輯在這個會話空間中運行,把變化後的人機交互邏輯傳送給客戶端,而且在客戶端相應設備展現出來,從而使用戶得到如同運行本地應用程序同樣的訪問感覺。
        3)硬件虛擬化和軟件虛擬化
        參考:
        http://virtualization.ctocio.com.cn/38/11466538.shtm

4、虛擬化之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中能夠查看具體的支持虛擬化的信息

[root@localhost ~]# grep -E"svm|vmx" /proc/cpuinfo

flags           : fpu vme de pse tsc msr pae mce cx8apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscallnx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliablenonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apicpopcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dthermtpr_shadow vnmi ept vpid tsc_adjust

4.3 kvm安裝實戰

安裝kvm

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

kvm: linux內核的一個模塊,模塊不須要安裝,只須要加載
qemu:虛擬化軟件,能夠虛擬不一樣的CPU,支持異構(x86的架構能夠虛擬化出不是x86架構的)
qemu-kvm:用戶態管理kvm,網卡,聲卡,PCI設備等都是qemu來管理的

建立一個虛擬磁盤,-f 指定格式,路徑是/opt/CentOS-7.1-x86_64.raw,大小爲10G

[root@localhost ~]# qemu-

qemu-img qemu-io   qemu-nbd

[root@localhost ~]# qemu-img create -f raw/opt/CentOS-7-x86_64-Minimal-1511.raw 10G

Formatting'/opt/CentOS-7-x86_64-Minimal-1511.raw', fmt=raw size=10737418240

顯示內核中kvm的狀態

[root@localhost ~]# lsmod|grep kvm

kvm_intel             162153  0

kvm                   525259  1 kvm_intel

 

啓動libvirt,查看狀態,關鍵字:active

[root@localhost ~]# systemctl enablelibvirtd.service

[root@localhost ~]# systemctl startlibvirtd.service

[root@localhost ~]# systemctl statuslibvirtd.service

libvirtd.service - Virtualization daemon

  Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled;vendor preset: enabled)

  Active: active (running) since Sat 2016-11-19 07:39:58 CST; 4s ago

    Docs: man:libvirtd(8)

          http://libvirt.org

 MainPID: 3051 (libvirtd)

  CGroup: /system.slice/libvirtd.service

          ├─3051 /usr/sbin/libvirtd

          ├─3152 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default....

          └─3154 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default....

 

Nov 19 07:39:58 localhost.localdomainsystemd[1]: Started Virtualization daemon.

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: started, version 2.66 ca...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: compile time options: IP...

Nov 19 07:40:00 localhost.localdomaindnsmasq-dhcp[3152]: DHCP, IP range 192....

Nov 19 07:40:00 localhost.localdomain dnsmasq[3152]:reading /etc/resolv.conf

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: using nameserver 61.178....

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: using nameserver 202.100...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: read /etc/hosts - 2 addr...

Nov 19 07:40:00 localhost.localdomaindnsmasq[3152]: read /var/lib/libvirt/dn...

Nov 19 07:40:00 localhost.localdomaindnsmasq-dhcp[3152]: read /var/lib/libvi...

Hint: Some lines were ellipsized, use -l toshow in full.

 

4.4 開始裝一臺虛擬機

vmvare上掛載一個鏡像

wKioL1g6RhLj3oxFAAB4XL_484U773.png-wh_50

導入到宿主機中,固然時間可能較長

[root@localhost ~]# dd if=/dev/cdromof=/opt/CentOS-7-x86_64-Minimal-1511.iso

1234944+0 records in

1234944+0 records out

632291328 bytes (632 MB) copied, 39.0131 s,16.2 MB/s

[root@localhost ~]# ls /opt/

CentOS-7-x86_64-Minimal-1511.iso  CentOS-7-x86_64-Minimal-1511.raw

  • 使用命令建立一臺虛擬機    
        首先學virt-install命令,在這裏使用- -help查看,而且只學習重要的,其餘的稍後會有提供
        virt-install –help
        -n(Name):指定虛擬機的名稱
        –memory(–raw):指定內存大小
        –cpu:指定cpu的核數(默認爲1)
        –cdrom:指定鏡像
        –disk:指定磁盤路徑(即上文建立的虛擬磁盤)
        –virt-type:指定虛擬機類型(kvm,qemu,xen)
        –network:指定網絡類型

  • 執行建立虛擬機命令

[root@localhost ~]# virt-install --help

usage:virt-install --name NAME --ram RAM STORAGE INSTALL [options]

Createa new virtual machine from specified install media.

optionalarguments:

  -h, --help            show this help message and exit

  --version             show program's version number andexit

  --connect URI         Connect to hypervisor with libvirt URI

GeneralOptions:

  -n NAME, --name NAME  Name of the guest instance

  --memory MEMORY       Configure guest memory allocation. Ex:

                        --memory 1024 (in MiB)

                        --memory512,maxmemory=1024

  --vcpus VCPUS         Number of vcpus to configure for yourguest. Ex:

                        --vcpus 5

                        --vcpus5,maxcpus=10,cpuset=1-4,6,8

                        --vcpussockets=2,cores=4,threads=2,

  --cpu CPU             CPU model and features. Ex:

                        --cpu coreduo,+x2apic

                        --cpu host

  --metadata METADATA   Configure guest metadata. Ex:

                        --metadataname=foo,title="My pretty title",uuid=...

                        --metadatadescription="My nice long description"

 

InstallationMethod Options:

  --cdrom CDROM         CD-ROM installation media

  -l LOCATION, --location LOCATION

                        Installation source(eg, nfs:host:/path,

                        http://host/path,ftp://host/path)

  --pxe                 Boot from the network usingthe PXE protocol

  --import              Build guest around an existingdisk p_w_picpath

  --livecd              Treat the CD-ROM media as a LiveCD

  -x EXTRA_ARGS, --extra-args EXTRA_ARGS

                        Additional arguments topass to the install kernel

                        booted from --location

  --initrd-inject INITRD_INJECT

                        Add given file to rootof initrd from --location

  --os-variant DISTRO_VARIANT

                        The OS variant beinginstalled guests, e.g.

                        'fedora18', 'rhel6','winxp', etc.

  --boot BOOT           Configure guest boot settings. Ex:

                        --boot hd,cdrom,menu=on

                        --boot init=/sbin/init(for containers)

  --idmap IDMAP         Enable user namespace for LXCcontainer. Ex:

                        --idmapuid_start=0,uid_target=1000,uid_count=10

 

DeviceOptions:

  --disk DISK           Specify storage with variousoptions. Ex.

                        --disk size=10 (new10GiB p_w_picpath in default location)

                        --disk/my/existing/disk,cache=none

                        --diskdevice=cdrom,bus=scsi

                        --disk=?

  -w NETWORK, --network NETWORK

                        Configure a guestnetwork interface. Ex:

                        --network bridge=mybr0

                        --networknetwork=my_libvirt_virtual_net

                        --networknetwork=mynet,model=virtio,mac=00:11...

                        --network none

                        --network help

  --graphics GRAPHICS   Configure guest display settings. Ex:

                        --graphics vnc

                        --graphicsspice,port=5901,tlsport=5902

                        --graphics none

                        --graphicsvnc,password=foobar,port=5910,keymap=ja

  --controller CONTROLLER

                        Configure a guestcontroller device. Ex:

                        --controllertype=usb,model=ich9-ehci1

  --input INPUT         Configure a guest input device. Ex:

                        --input tablet

                        --inputkeyboard,bus=usb

  --serial SERIAL       Configure a guest serial device

  --parallel PARALLEL   Configure a guest parallel device

  --channel CHANNEL     Configure a guest communication channel

  --console CONSOLE     Configure a text console connectionbetween the guest

                        and host

  --hostdev HOSTDEV     Configure physical USB/PCI/etc hostdevices to be

                        shared with the guest

  --filesystem FILESYSTEM

                        Pass host directory tothe guest. Ex:

                        --filesystem/my/source/dir,/dir/in/guest

                        --filesystemtemplate_name,/,type=template

  --sound [SOUND]       Configure guest sound device emulation

  --watchdog WATCHDOG   Configure a guest watchdog device

  --video VIDEO         Configure guest video hardware.

  --smartcard SMARTCARD

                        Configure a guestsmartcard device. Ex:

                        --smartcardmode=passthrough

  --redirdev REDIRDEV   Configure a guest redirection device. Ex:

                        --redirdevusb,type=tcp,server=192.168.1.1:4000

  --memballoon MEMBALLOON

                        Configure a guestmemballoon device. Ex:

                        --memballoonmodel=virtio

  --tpm TPM             Configure a guest TPM device. Ex:

                        --tpm /dev/tpm

  --rng RNG             Configure a guest RNG device. Ex:

                        --rng /dev/random

  --panic PANIC         Configure a guest panic device. Ex:

                        --panic default

 

GuestConfiguration Options:

  --security SECURITY   Set domain security driver configuration.

  --numatune NUMATUNE   Tune NUMA policy for the domain process.

  --memtune MEMTUNE     Tune memory policy for the domain process.

  --blkiotune BLKIOTUNE

                        Tune blkio policy forthe domain process.

  --memorybacking MEMORYBACKING

                        Set memory backing policyfor the domain process. Ex:

                        --memorybackinghugepages=on

  --features FEATURES   Set domain <features> XML. Ex:

                        --features acpi=off

                        --featuresapic=on,eoi=on

  --clock CLOCK         Set domain <clock> XML. Ex:

                        --clockoffset=localtime,rtc_tickpolicy=catchup

  --pm PM               Configure VM power managementfeatures

  --events EVENTS       Configure VM lifecycle management policy

  --resource RESOURCE   Configure VM resource partitioning (cgroups)

 

VirtualizationPlatform Options:

  -v, --hvm             This guest should be a fullyvirtualized guest

  -p, --paravirt        This guest should be a paravirtualizedguest

  --container           This guest should be a containerguest

  --virt-type HV_TYPE   Hypervisor name to use (kvm, qemu, xen, ...)

  --arch ARCH           The CPU architecture to simulate

  --machine MACHINE     The machine type to emulate

 

MiscellaneousOptions:

  --autostart           Have domain autostart on host bootup.

  --wait WAIT           Minutes to wait for install tocomplete.

  --noautoconsole       Don't automatically try to connect tothe guest

                        console

  --noreboot            Don't boot guest after completinginstall.

  --print-xml [XMLONLY]

                        Print the generateddomain XML rather than create the

                        guest.

  --dry-run             Run through install process, butdo not create devices

                        or define the guest.

  --check CHECK         Enable or disable validation checks.Example:

                        --check path_in_use=off

                        --check all=off

  -q, --quiet           Suppress non-error output

[root@localhost ~]# virt

virt-clone          virtlockd           virt-what

virt-host-validate  virt-manager        virt-xml

virt-install        virt-pki-validate   virt-xml-validate

[root@localhost ~]# virt-install --nameCentOS-7-x86_64-Minimal-1511 --virt-type kvm --ram 1024--cdrom=/opt/CentOS-7-x86_64-Minimal-1511.iso --diskpath=/opt/CentOS-7-x86_64-Minimal-1511.raw --network network=default --graphicsvnc,listen=0.0.0.0 --noautoconsole

 

Starting install...

Creating domain...                                       |   0 B     00:01    

Domain installation still in progress. Youcan reconnect to

the console to complete the installationprocess.

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

啓動剛纔建立的虛擬機

[root@localhost ~]# virsh startCentOS-7-x86_64-Minimal-1511

[root@localhost ~]# ps -ef|grep kvm  //kvm就是一個進程

root        686     2  0 19:50 ?        00:00:00 [kvm-irqfd-clean]

qemu       2353     1 91 19:55 ?        00:24:08/usr/libexec/qemu-kvm -name CentOS-7-x86_64-Minimal-1511 -S -machinepc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu Nehalem -m 1024 -realtime mlock=off-smp 1,sockets=1,cores=1,threads=1 -uuid cf30a98a-143c-4bca-bf61-f27b8799061b-no-user-config -nodefaults -chardevsocket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-CentOS-7-x86_64-Minimal-1511/monitor.sock,server,nowait-mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew-global kvm-pit.lost_tick_policy=discard -no-hpet -no-reboot -globalPIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -deviceich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -deviceich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -drivefile=/opt/CentOS-7-x86_64-Minimal-1511.raw,if=none,id=drive-virtio-disk0,format=raw-devicevirtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2-drivefile=/opt/CentOS-7-x86_64-Minimal-1511.iso,if=none,id=drive-ide0-0-0,readonly=on,format=raw-device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1-netdev tap,fd=23,id=hostnet0,vhost=on,vhostfd=24 -devicevirtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:f0:c7:f8,bus=pci.0,addr=0x3-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0-chardevsocket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-CentOS-7-x86_64-Minimal-1511/org.qemu.guest_agent.0,server,nowait-devicevirtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0-device usb-tablet,id=input0 -vnc 0.0.0.0:0 -vga cirrus -devicevirtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on

root       2411     2  0 19:55 ?        00:00:00 [kvm-pit/2353]

root       2782  2265  0 20:21 pts/0    00:00:00 grep --color=auto kvm

4.6 編輯kvm的xml文件,更改虛擬機CPU配置

  • 配置虛擬機的cpu,兩種方式(啓動的時候指定核數,更改xml

  • 第一種方法:爲了實現cpu的熱添加,就須要更改cpu的最大值,固然熱添加的個數不能超過最大值

[root@localhost ~]# ll /etc/libvirt/qemu

total 8

-rw-------. 1 root root 3938 Nov 19 19:55CentOS-7-x86_64-Minimal-1511.xml  //kvm虛擬機配置文件

drwx------. 3 root root 4096 Nov 19 07:39networks

[root@localhost ~]# virsh edit CentOS-7-x86_64-Minimal-1511

 <vcpuplacement='auto'current="1">4</vcpu>  當前爲1,自動擴容,最大爲4

  • 重啓虛擬機

[root@localhost ~]# virsh shutdown CentOS-7-x86_64-Minimal-1511

DomainCentOS-7-x86_64-Minimal-1511 is being shutdown

[root@localhost ~]# virsh start CentOS-7-x86_64-Minimal-1511

DomainCentOS-7-x86_64-Minimal-1511 started
  • 登陸虛擬機上,查看cpu信息,確認cpu的個數,下面開始進行cpu熱添加
    wKiom1g6RdDg-_QSAAAoB1Djg1k459.png-wh_50 

  • cpu的熱添加(cpu只支持熱添加,不支持熱減小)

[root@localhost ~]# virsh setvcpus CentOS-7-x86_64-Minimal-1511 2 --live

再到虛擬機中查看cpu信息
wKiom1g6RayiMcZBAABci-fC6UY002.png-wh_50

  • kvm版本較高,並不須要echo 「1」到/sys/devices/system/cpu/cpu1/online 進行激活,自動能夠激活。

[root@chuck ~]# cat/sys/devices/system/cpu/cpu1/online

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)機制,能夠增大減小,可是也要設置一個最大值,默認並無設置最大值,也能夠在安裝的時候指定,這裏再也不重複此方法

[root@localhost ~]# virsh edit CentOS-7-x86_64-Minimal-1511

<memoryunit='KiB'>4194304</memory>  //把最大內存改成4G

<currentMemoryunit='KiB'>1048576</currentMemory>  //當前內存爲1G

重啓虛擬機並查看當前狀態的內存使用狀況

[root@localhost ~]# virsh qemu-monitor-command CentOS-7-x86_64-Minimal-1511--hmp --cmd info balloon

balloon: actual=1024

 

對內存進行熱添加並查看

[root@localhost ~]# virsh qemu-monitor-commandCentOS-7-x86_64-Minimal-1511 --hmp --cmd balloon 2000

[root@localhost ~]# virsh qemu-monitor-commandCentOS-7-x86_64-Minimal-1511 --hmp --cmd info balloon

balloon: actual=2260

 

更改虛擬機中存儲,硬盤設置(不建議在生產環境使用硬盤的擴大收縮模式,很容易產生故障)

[root@localhost ~]# qemu-img --help |grep -i "formats:"

Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd rawhost_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsigluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

  • 從結果看出,kvm支持不少種硬盤格式
        硬盤格式整體上分爲兩種:1爲全鏡像格式,2爲稀疏格式
        全鏡像格式(典型表明raw格式),其特色:設置多大就是多大,寫入速度快,方便的轉換爲其餘格式,性能最優,可是佔用空間大
        稀疏模式(典型表明qcow2格式),其特色:支持壓縮,快照,鏡像,更小的存儲空間(即用多少佔多少)
        硬盤格式均可以經過qemu-img管理,詳情qemu-img     –help

4.8 編輯kvm的xml文件,更改虛擬機網橋鏈接配置

  • 默認狀況是NAT狀況,可是在生產狀況,使用更多的是橋接模式,更改虛擬機爲網橋模式,原理圖以下,網橋的基本原理就是建立一個橋接接口br0,在物理網卡和虛擬網絡接口之間傳遞數據

wKiom1g6RXXDwILxAAB4cwJBKDc956.png-wh_50

  修改eth0(這裏Centos7的eth0在裝機的時候就指定,不須要特地指定了)

·  添加一個網橋並查看

[root@localhost ~]# brctl show //查看網橋            

bridge name     bridge id               STP enabled     interfaces

virbr0         8000.5254007c0675       yes             virbr0-nic

                                                       vnet0

[root@localhost ~]# brctl addbr br0 //添加網橋

[root@localhost ~]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0            8000.000000000000       no

virbr0         8000.5254007c0675       yes             virbr0-nic

                                                       vnet0

eth0加入網橋,使用橋接模式,給br設置ip,添加路由網關,關閉防火牆

[root@localhost ~]# ifconfig

eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.8.113  netmask255.255.255.0  broadcast 192.168.8.255

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20<link>

       ether 00:0c:29:3f:2a:6d txqueuelen 1000  (Ethernet)

       RX packets 25918  bytes 2063267(1.9 MiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 33036  bytes 5049008(4.8 MiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

       inet 127.0.0.1  netmask 255.0.0.0

       inet6 ::1  prefixlen 128  scopeid 0x10<host>

       loop  txqueuelen 0  (Local Loopback)

       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 overruns0  carrier 0  collisions 0

virbr0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.122.1  netmask255.255.255.0  broadcast 192.168.122.255

       ether 52:54:00:7c:06:75 txqueuelen 0  (Ethernet)

       RX packets 28  bytes 1204 (1.1KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

vnet0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet6 fe80::fc54:ff:fef0:c7f8 prefixlen 64  scopeid0x20<link>

       ether fe:54:00:f0:c7:f8 txqueuelen 500  (Ethernet)

       RX packets 28  bytes 1596 (1.5KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 1132  bytes 59096 (57.7KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

[root@localhost ~]# brctl addif bro eth0  //eth0加入網橋,注意!此時網絡會斷掉

[root@localhost ~]# brctl addif br0 eth0 && ip addr del deveth0 192.168.8.113/24 && ifconfig br0 192.168.8.113/24 up &&route add default gw 192.168.8.2 && iptables –F  //用此命令網絡不會終斷

 

編輯虛擬機的網絡配置使用br0網橋模式

[root@localhost ~]# virsh edit CentOS-7.1-x86_64

<interface type="bridge"><!--虛擬機網絡鏈接方式-->

 <source bridge="br0" /> <!-- 當前主機網橋的名稱-->

 <mac address="00:16:e4:9a:b3:6a" /> <!--爲虛擬機分配mac地址,務必惟一,若是是dhcp得到一樣ip,引發衝突-->

</interface>

  • 重啓虛擬機,網橋模式生效,此時使用crt即可以連接到所建立的虛擬機了,在vmvare機器上使用ifconfig查看詳情

[root@localhost ~]# ifconfig

br0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.8.113  netmask255.255.255.0  broadcast 192.168.8.255

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20<link>

       ether 00:0c:29:3f:2a:6d txqueuelen 0  (Ethernet)

       RX packets 44  bytes 5895 (5.7KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 47  bytes 5434 (5.3KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet6 fe80::20c:29ff:fe3f:2a6d prefixlen 64  scopeid0x20<link>

       ether 00:0c:29:3f:2a:6d txqueuelen 1000  (Ethernet)

       RX packets 26325  bytes 2108762(2.0 MiB)

        RX errors 0 dropped 0  overruns 0  frame 0

       TX packets 33358  bytes 5095692(4.8 MiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

       inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1 prefixlen 128  scopeid0x10<host>

       loop  txqueuelen 0  (Local Loopback)

       RX packets 8  bytes 800 (800.0 B)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 8  bytes 800 (800.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

virbr0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.122.1  netmask255.255.255.0  broadcast 192.168.122.255

       ether 52:54:00:7c:06:75 txqueuelen 0  (Ethernet)

       RX packets 28  bytes 1204 (1.1KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

vnet0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet6 fe80::fc54:ff:fef0:c7f8 prefixlen 64  scopeid0x20<link>

       ether fe:54:00:f0:c7:f8 txqueuelen 500  (Ethernet)

       RX packets 28  bytes 1596 (1.5KiB)

       RX errors 0  dropped 0  overruns 0 frame 0

       TX packets 1248  bytes 65128 (63.6KiB)

       TX errors 0  dropped 0 overruns0  carrier 0  collisions 0

刪除虛擬機,刪除前先關閉虛擬機,不要輕易的刪除,由於刪除後沒法恢復

[root@localhost ~]# virsh undefine CentOS-7-x86_64-Minimal-1511 //完全刪除虛擬機

若是想刪除後,再恢復所刪除的虛擬機,在刪除前能夠先備份虛擬機的.xml文件,而後再經過.xml文件重建虛擬機就能夠。

導出虛擬機(.xml)

[root@localhost ~]# virsh--help|grep dump

   dump                          dump the core of a domain to a file for analysis

   dumpxml                       domain information in XML

   save-p_w_picpath-dumpxml            saved state domain information in XML

   iface-dumpxml                 interface information in XML

   nwfilter-dumpxml              network filter information in XML

   net-dumpxml                   network information in XML

   nodedev-dumpxml               node device details in XML

   secret-dumpxml                secret attributes in XML

   snapshot-dumpxml              Dump XML for a domain snapshot

   pool-dumpxml                  pool information in XML

   vol-dumpxml                    volinformation in XML

關閉虛擬機: //也能夠用kill -9來關閉(至關於拔掉電源)

[root@localhost ~]# virsh --help|grepdestroy

   destroy                       destroy (stop) a domain

   iface-destroy                 destroy a physical host interface (disable it / "if-down")

   net-destroy                    destroy (stop) a network

   nodedev-destroy               destroy (stop) a device on the node

   pool-destroy                  destroy (stop) a pool

 

5、KVM的優化

5.1 cpu的優化

  • intercpu的運行級別,按權限級別高低Ring3->Ring2->Ring1->Ring0,Ring2Ring1暫時沒什麼卵用)Ring3爲用戶態,Ring0爲內核態

wKioL1g6RTzxTesOAADCZ7ufBU8947.png-wh_50

·  Ring3的用戶態是沒有權限管理硬件的,須要切換到內核態Ring0,這樣的切換(系統調用)稱之爲上下文切換,物理機到虛擬機屢次的上下文切換,勢必會致使性能出現問題。對於全虛擬化,inter實現了技術VT-x,在cpu硬件上實現了加速轉換,CentOS7默認是不須要開啓的。

·  cpu的緩存綁定cpu的優化

[root@localhost ~]# lscpu|grep cache

L1d cache:             32K

L1i cache:             32K

L2 cache:              256K

L3 cache:              3072K

L1 L2 L3 三級緩存和CPU綁定
L1是靜態緩存,造價高,L2L3是動態緩存,經過脈衝的方式寫入01,造價較低。cache解決了cpu處理快,內存處理慢的問題,相似於memcaced和數據庫。若是cpu調度器把進程隨便調度到其餘cpu上,而不是當前L1L2,L3的緩存cpu上,緩存就不生效了,就會產生miss,爲了減小cache miss,須要把KVM進程綁定到固定的cpu上,可使用taskset把某一個進程綁定(cpu親和力綁定,能夠提升20%的性能)在某一個cpu上,例如:taskset -cp 1 257181指的是cpu1,也能夠綁定到多個cpu上,25718是指的pid.
cpu綁定的優勢:提升性能,20%以上
cpu綁定的缺點:不方便遷移,靈活性差

5.2內存的優化

  • 內存尋址:宿主機虛擬內存     -> 宿主機物理內存
        虛擬機的虛擬內存 -> 虛擬機的物理內存
        之前VMM經過採用影子列表解決內存轉換的問題,影子頁表是一種比較成熟的純軟件的內存虛擬化方式,但影子頁表固有的侷限性,影響了VMM的性能,例如,客戶機中有多個CPU,多個虛擬CPU之間同步頁面數據將致使影子頁表更新次數幅度增長,測試頁表將帶來異常嚴重的性能損失。以下圖爲影子頁表的原理圖

wKioL1g6RQ2gylxGAAA-231nCHE334.png-wh_50

在此之際,Inter在最新的Core I7系列處理器上集成了EPT技術(對應AMD的爲RVI技術),以硬件輔助的方式完成客戶物理內存到機器物理內存的轉換,完成內存虛擬化,並以有效的方式彌補了影子頁表的缺陷,該技術默認是開啓的,以下圖爲EPT技術的原理

wKiom1g6RPSRsWU1AAAzUbrO9RA713.jpg-wh_50

KSM內存合併
宿主機上默認會開啓ksmd進程,該進程做爲內核中的守護進程存在,它按期執行頁面掃描,識別副本頁面併合並副本,釋放這些頁面以供它用,CentOS7默認是開啓的

[root@localhost ~]# ps aux|grep ksmd|grep -vgrep

root       297  0.0  0.0     0     0 ?        SN  21:45   0:00 [ksmd]

大頁內存,CentOS7默認開啓的

[root@localhost ~]# cat/sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

[root@localhost ~]# ps aux |grepkhugepage|grep -v grep

root       298  0.4  0.0     0     0 ?        SN  21:45   0:26 [khugepaged]

Linux平臺默認的內存頁面大小都是4KHugePage進程會將默認的的每一個內存頁面能夠調整爲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默認所支持的調度算法

[root@localhost ~]# dmesg|grep -i"scheduler"

[  16.298583] io scheduler noop registered

[  16.298587] io scheduler deadline registered (default)

[  16.298804] io scheduler cfq registered

臨時更改某個磁盤的IO調度算法,將deadling模式改成cfq模式

[root@localhost ~]# cat/sys/block/sda/queue/scheduler

noop [deadline] cfq

[root@localhost ~]# echo cfq>/sys/block/sda/queue/scheduler

[root@localhost ~]# cat/sys/block/sda/queue/scheduler

noop deadline [cfq]

使更改的IO調度算法永久生效,須要更改內核參數

5.4 cache的優化

關於write through和write back,默認write through便可

  • Write-back
        在這種策略下,當數據被寫到raid卡的cache中,控制器就向IO調度器返回了寫操做完成信號; 雙刃劍,它雖然帶來了IO性能的提高,可是隨之而來的風險:由於cacheROM,假設服務器忽然斷電,則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

wKiom1g6RJ7Qk9npAAETANrmyPE367.png-wh_50

 

Write through
只有當數據被寫到物理磁盤中,控制器才向IO調度器返回了寫操做完成信號;這種策略以犧牲IO性能,來保證數據安全性,淘寶這邊的策略:由於Write-Throughio性能沒法知足業務的需求,因此咱們這邊會採用另外一個模式:WB when bad bbu,即無論bbu狀態是否正常,咱們都會採用write-back,那數據安全怎麼辦?服務器異常斷電的狀況,在咱們這邊機率極低;即使很不幸的咱們IDC局部斷電了,咱們也有主備模式來保證數據的相對安全;咱們會監控BBU的狀態,一旦發生了BBU failed,咱們將會安排停機更換。

wKioL1g6RGigPFy_AAEfShwc84s517.png-wh_50

6、建立虛擬機鏡像

6.1 虛擬磁盤及鏡像

因爲在一開始建立了虛擬磁盤,並命名爲CentOS-7-x86_64-Minimal-1511.raw,這就是虛擬機的鏡像嘍。

[root@localhost ~]# ll /opt

total 1936076

-rw-r--r--. 1 qemu qemu  632291328 Nov 19 19:52CentOS-7-x86_64-Minimal-1511.iso

-rw-r--r--. 1 qemu qemu 5368709120 Nov 2000:19 CentOS-7-x86_64-Minimal-1511.raw

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

本文部份內容參考老男孩教育博客: http://blog.oldboyedu.com

相關文章
相關標籤/搜索