【N版】openstack——走進雲計算(一)

【N版】openstack——走進雲計算

一.雲計算

雲計算是一種按使用量付費的模式,這種模式提供可用的、便捷的、按需的網絡訪問,進入可配置的計算資源共享池(資源包括:網絡、服務器、存儲、應用軟件、服務),這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的交互。

 

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圖解雲計算的三層服務

基礎設施:計算,存儲,網絡服務

平臺服務:對象存儲,身份認證,運行環境,消息隊列,數據庫服務

應用平臺:監控,內容,合作,通信,財務

wKioL1hk0JWzfKDgAANZD-qP0PA327.png-wh_50

 








二.雲計算與虛擬化

2.1公有云,私有云,混合雲

l  公有云(publiccloud):

通常指第三方提供商爲用戶提供的能夠使用的雲,公有云一般通過Internet使用,可能是免費或成本低廉的,公有云的核心屬性是共享資源服務。這種雲有許多實例,可在當今整個開房的共有網絡中提供服務。例如:aws,阿里雲,青雲,百度雲,騰訊雲。

優點:價格低廉,使用方便

 

l  私有云(privatecloud):

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

優點:可控,數據安全(銀行必然使用私有云)

  

l  混合雲(hybirdcloud):

混合雲融合了公有云和私有云,是近年來雲計算的主要模式和發展方向。我們已經知道私企業主要是面向企業用戶,出於安全考慮,企業更願意將數據存放在私有云中,但是同時又希望可以獲得公有云的計算資源,在這種情況下混合雲唄越來越多的採用,他將公有云和私有云進行混合和匹配,以獲得最佳的效果,這種個性化的解決方案,達到了既省錢又安全的目的,例如在一次活動中,只需要暫時幾臺機器,在私有云存在的情況,考慮混合雲的使用,是最合理化的。

優點:集合的使用方式更完美,可擴展,更節省

 

2.2雲計算的層次

wKiom1hk0OHToeHOAAHCz2l8z-Y513.png-wh_50

l  SaaS

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

 

l  PaaS

提供給消費者的服務是把客戶採用提供的開發語言和工具(例如:JAVA,python,.net)開發的或收購的應用程序部署到供應商的雲計算基礎設施上去,客戶不需要管理或控制底層的雲基礎設施,包括網絡、服務器、操作系統、存儲等,但客戶能控制部署的應用程序,也可能控制運行應用程序的託管環境配置,更適合提供給開發人員使用,在這裏也可以使用docker容器技術實現。

 

l  IaaS

提供給消費者的服務是對所有云計算基礎設施的利用,包括處理CPU、內存、存儲、網絡和其它基本的計算資源,用戶能夠部署和運行任意軟件,包括操作系統和應用程序。消費者不管理或控制任何雲計算基礎設施,但能控制操作系統的選擇、存儲空間、部署的應用,也有可能獲得有限制的網絡組件(例如:路由器,防火牆,負載均衡器等)的控制。更適合提供給運維人員使用。

 

2.3虛擬化的趨勢

虛擬化可以虛擬出來多個操作系統:每個操作系統之間是相互獨立的,所以每個操作系統上所跑的應用自然是相互不影響的。在這裏用一個經典例子說明,一臺物理機跑8個tomcat,和8個虛擬機上各跑1個tomcat,跑8個tomcat的物理機,如果其中一個tomcat出了問題(內存問題,jvm問題等),勢必會影響到其它7個tomcat,但是在8個虛擬機上分別各跑一個tomcat,他們之間是互不影響的,由於虛擬化一層原因佔用了一些資源,效果並沒有直接一臺物理機跑8個tomcat效果好,但是虛擬機的互相獨立互不影響是更重要的,而且便於管理,每個tomcat實例都會起3個端口(8080:對外服務端口,8009AJP端口,8005關閉端口),使用虛擬機之後,就不會擔心多個tomcat端口衝突的情況。

 

支持異構:linux系統可以虛擬化Windows系統,方便不同場景系統的使用。

支持快照功能和克隆功能:快照功能在某個物理機不知運行什麼,是否正在運行的情況下,如果是一臺虛擬機就好辦了,直接聽了該虛擬機,只不過是佔了一些磁盤空間而已。

 

2.4虛擬化和雲計算的簡單總結

虛擬化是一種技術,雲計算是通過虛擬化技術實現的一種通過網絡訪問獲取資源,流量,交付的使用模式,兩者並不能互相比較,虛擬化相當於實幹家,而云計算是思想家。

 

三.虛擬化的分類

3.1半虛擬化,全虛擬化

l  全虛擬化

又叫硬件輔助虛擬化技術,最初所使用的虛擬化技術就是全虛擬化(full virtualization)技術,它在虛擬機VM和硬件之間加了一個軟件層 Hypervisor 或者叫做虛擬機管理程序(VMM)。Hypervisor 可以劃分爲兩大類,首先是類型1.直接運行在物理硬件之上的。其次是類型2.運行在另一個操作系統(運行在另一個物理硬件之上)中。類型1的一個例子是基於內核的虛擬機,(KVM它本身是一個基於操作系統的hypervsior)類型2包括QEMU和WINE。因爲運行在虛擬機上的操作系統通過Hypervisor來最終分享硬件,所以虛擬機發出的指令需經過Hypervisor補貨並處理,爲此每個客戶操作系統所發出的指令都要唄翻譯成CPU能識別的指令格式,這裏的客戶操作系統即是運行的虛擬機,所以hypervsior的工作負荷會很大,因此會佔用一定的資源,所以在性能方面不如裸機。但是運行速度要快於硬件模擬。全虛擬化最大的有點就是運行在虛擬機上的操作系統沒有聽過任何修改,唯一的限制就是操作系統必須能夠支持底層的硬件,不過目前的操作系統一般都能支持底層硬件,所以這個限制就變得微不足道了。

 

l  半虛擬化

半虛擬化技術是後來纔出現的技術,半虛擬化技術英文是paravirtualization,也叫作準虛擬化技術,現在比較熱門,它就是在全虛擬化的基礎上,把客戶操作系統進行了修改,增加了一個專門的API,這個API可以將客戶操作系統發出的指令進行最優化,即不需要htpervisor好肥一定的資源進行翻譯操作,但對於某些不含該API的操作系統(主要是Windows)來說,就不能用這種方法,xen就是一個典型的半虛擬化的技術。

3.2服務器虛擬化,桌面虛擬化,應用虛擬化

l  服務器虛擬化

數量少的情況推薦使用ESXIXenServer

數量大的情況推薦使用KVMRHEV(不開源),oVirtOpenstackVmvarevshpere

l  桌面虛擬化

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

l  應用虛擬化

技術原理是基於應用/服務器計算A/S架構,採用類似虛擬終端的技術,把應用程序的人機交互邏輯(應用程序界面,鍵盤及鼠標的操作,音頻的輸入輸出,讀卡器,打印輸出等)與計算邏輯隔離開來。在用戶訪問一個服務器虛擬化後的應用時,用戶計算機只需要把人機交互邏輯傳送到服務器端,服務器端爲用戶開設獨立的繪畫空間,應用程序的計算邏輯在這個會話空間中運行,把變化後的人機交互邏輯傳送給客戶端,並且咋客戶端相應設備展示出來,從而使用戶獲得如同運行本地應用程序一樣的訪問感受。

四.虛擬化之KVM

4.1kvm的虛擬化特性

1)嵌入到linux正式kernel(提高了兼容性)

2)代碼級資源調用(提高性能)

3)虛擬機就是一個進程(內存易於管理)

4)直接支持NUMA技術(提高擴展性)

5)雖然被RedHat收購了,但是依然保持開源發展模式,社區活躍

6)更好的商業支持及服務保障

7)CentOS7較CentOS6默認支持cpu熱添加,內存熱添加,大頁內存默認都是開啓的。

4.2支持虛擬化的條件

Inter的cpu:VMX

AMD的cpu:SVM

 

VMware需要開啓如下兩個條件即可,如果是物理機,需要在bios裏面設置,默認都是開啓的。

 

在cpuinfo中可以查看具體的支持虛擬化信息

[root@linux-node1~]# 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 eagerfpu pni pclmulqdq vmxssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrandhypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpidfsgsbase smep xsaveopt

 

flags           : fpu vme de pse tsc msr pae mce cx8apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss htsyscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopologytsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmxssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave a* vxhypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust

4.3 KVM安裝實踐

l  安裝kvm

[root@linux-node1~]# yum install -y qemu-kvm libvirt     <- 安裝管理工具 ->

[root@linux-node1~]# yum install -y virt-install       <- 安裝virt命令 ->

 

Kvm:linux內核的一個模塊,模塊不需要安裝,只需要加載

Qemu:虛擬化軟件,可以虛擬不同的cpu,支持異構(x86架構可虛擬化出不是x86的架構)

Qemu-kvm:用戶態管理kvm,網卡,聲卡,PCI設備等都是qemu來管理的

 

l  創建虛擬磁盤

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

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

[root@linux-node1opt]# qemu-img create -f qcow2 /opt/CentOS-7-x86_64.qcow2 10G

            <- 創建qcow2磁盤->

[root@linux-node1~]# qemu-img convert -c -f raw -O qcow2 CentOS-7-x86_64.rawCentOS-7-x86_64.qcow2     <- 轉換磁盤格式->

<- 創建虛擬磁盤:-f指定格式,路徑是/opt/CentOS-7-x86_64.raw 大小爲10G ->

<- 格式:1.raw    創建多大佔用多大磁盤空間

     2.qcow2  佔用磁盤大小根據使用量來決定 ->

 

l  顯示內核中kvm狀態

[root@linux-node1~]# lsmod |grep kvm

kvm_intel             162153  0

kvm                   525409  1 kvm_intel

 

l  啓動服務

[root@linux-node1~]# systemctl enable libvirtd           <- 開機自啓 ->

[root@linux-node1~]# systemctl start libvirtd           <- 啓動libvirt ->

[root@linux-node1~]# systemctl status libvirtd           <- libvirt狀態 ->

   libvirtd.service - Virtualization daemon

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

   Active: active(running) since Wed 2016-12-14 03:36:51 CST; 21min ago

     Docs: man:libvirtd(8)

           http://libvirt.org

 Main PID: 3371 (libvirtd)

<- libvirt狀態:主要查看active關鍵字,證明開啓 ->

 

l  上傳鏡像

法一:

[root@linux-node1~]# cd /opt/

[root@linux-node1opt]#

wget http://mirrors.aliyun.com/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso                                                 <- 將鏡像下載到/opt下 ->

 

法二:

利用CRT的SFTP上傳

CRT==> File ==> Connect SFTP Session (英文版CRT)

CRT==> 文件 ==> 連接到SFTP       (中文版CRT)

sftp>cd /opt

sftp>put D:/ISO/CentOS-7-x86_64-DVD-1511.iso       <- 將鏡像上傳到/opt下 ->

 

法三:

[root@linux-node1~]# cd /opt/

[root@linux-node1opt]# dd if=/dev/cdrom of=/opt/CentOS-7.1-x86_64.iso

                             <- 將鏡像從cdrom掛載到/opt下 ->

 

4.4 創建虛擬機

Virt-install重要命令介紹:

virt-install –help
-n(Name):           指定虛擬機的名稱
–memory(–raw):   指定內存大小
–cpu:               指定cpu的核數(默認爲1)
–cdrom:             指定鏡像
–disk:              指定磁盤路徑(即上文創建的虛擬磁盤)
–virt-type:         指定虛擬機類型(kvm,qemu,xen)
–network:           指定網絡類型

 

[root@linux-node1opt]# virt-install \

--virt-typekvm \                      <- 虛擬機類型:kvm ->

--nameCentOS-7-x86_64 \                  <- 虛擬機名字 ->

--ram1024 \                        <- 虛擬機內存:1024M ->

--cdrom=/tmp/CentOS-7-x86_64-DVD-1511.iso\         <-虛擬機光驅路徑 ->

--diskpath=/opt/CentOS-7-x86_64.raw \           <- 虛擬機磁盤路徑 raw ->

--disk/tmp/CentOS-7-x86_64.qcow2,format=qcow2 \      <- 虛擬機磁盤路徑 qcow2 ->

--networknetwork=default \                <- 虛擬機網絡類型:默認 ->

--networkbridge=br0 \                   <- 虛擬機網絡類型:橋接 ->

--graphicsvnc,listen=0.0.0.0 \              <- 指定控制檯:VNC ->

--noautoconsole                   <- 指定不自動試圖連接到客戶機控制檯 ->

 

4.5 虛擬機基本操作

生成kvm虛擬機:virt-install

查看再運行的虛擬機:virsh list

查看kvm虛擬機配置文件:virsh dumpxml name

啓動kvm虛擬機:virsh start name

正常關機:virsh shutdown name

非正常關機:virsh destroy name

刪除:virsh undefine name  (徹底刪除,無法找回,除非備份xml文件)

根據配置文件定義虛擬機:virsh define file-name.xml

掛起,終止:virsh suspend name

回覆掛起狀態:virsh resumed name

 

以上內容均可進入virsh控制檯使用,進入後命令可以Tab自動補全如下:

[root@linux-node1opt]# virsh                    <- 進入控制檯 ->

Welcometo virsh, the virtualization interactive terminal.

Type:  'help' for help with commands

       'quit' to quit

virsh#                                                                            <- 控制檯提示符 ->

virsh# list --all                         <- 查看所有虛擬機 ->

 Id   Name                          State

----------------------------------------------------

 -    CentOS-7-x86_64               shut off  <- 虛擬機列表 ->

 

virsh# start CentOS-7-x86_64                    <- 啓動虛擬機 ->

DomainCentOS-7-x86_64 started

 

virsh# list                                              <- 查看運行的虛擬機 ->

 Id   Name                          State

----------------------------------------------------

 1    CentOS-7-x86_64               running  <- 虛擬機狀態:運行 ->

 

virsh# shutdown CentOS-7-x86_64                    <- 正常關閉虛擬機 ->

DomainCentOS-7-x86_64 is being shutdown

 

virsh# destroy CentOS-7-x86_64                   <- 非正常關閉虛擬機 ->

DomainCentOS-7-x86_64 destroyed

virsh# quit                             <-退出控制檯 ->

4.6 熱添加CPU

[root@linux-node1opt]# cd /etc/libvirt/qemu/            <- 虛擬機xml路徑 ->

[root@linux-node1qemu]# ll

total4

-rw-------1 root root 3887 Dec 11 11:19 CentOS-7-x86_64.xml    <-虛擬機xml文件->

 

注:修改虛擬機xml文件不直接修改上文所述文件,要在用virsh管理命令修改

virsh# edit CentOS-7-x86_64                    <- 控制檯內修改 ->

[root@linux-node1qemu]# virsh edit CentOS-7-x86_64        <- 控制檯外修改 ->

 

注:熱添加的CPU數不能超過最大值

[root@linux-node1qemu]# virsh edit CentOS-7-x86_64        <- 編輯配置文件 ->

<vcpuplacement='static'>1</vcpu>                 <- 修改此行內容 ->

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

[root@linux-node1~]# virsh shutdown CentOS-7-x86_64        <- 關閉虛擬機 ->

DomainCentOS-7-x86_64 is being shutdown

[root@linux-node1~]# virsh start CentOS-7-x86_64         <- 開啓虛擬機 ->

DomainCentOS-7-x86_64 started

沒有熱添加cpu之前先查看cpu的個數


[root@linux-node1~]# virsh setvcpus CentOS-7-x86_64 2 --live  <- 熱添加CPU ->

添加完cpu後,查看cpu個數:



 

l  激活cpu

[root@linux-node1~]# echo "1" > /sys/devices/system/cpu/cpu1/online

高版本的kvm不需要這樣做,直接可以激活

[root@linux-node1~]# cat /sys/devices/system/cpu/cpu0/online

1

[root@linux-node1~]# cat /sys/devices/system/cpu/cpu1/online

1

 

第二種添加cpu的方法:安裝時指定

[root@linux-node1~]# virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpussockets=2,cores=4,thread=2

 

4.7 更改kvm內存配置

內存的設置擁有一個“氣球(balloon)機制”,可以增大減少,但是也要設置一個最大值,默認並沒有設置最大值,也可以在安裝的時候指定

[root@linux-node1~]# virsh edit CentOS-7-x86_64            <- 編輯配置文件 ->

<memoryunit='KiB'>4194304</memory>                   <- 最大內存:4G ->

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

[root@linux-node1~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd info balloon                                 <- 查看當前內存 ->

[root@linux-node1~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 512                                   <- 修改內存:512 ->

 

4.8 更改虛擬機網橋連接設置

默認情況下是NAT,但是在生產環境,使用的更多的是橋接模式,更改虛擬機爲網橋模式

網橋的基本原理就是創建一個橋接接口br0,在屋裏網卡和虛擬網絡接口之間傳遞數據。

[root@linux-node1~]# brctl addbr br0                 <- 添加網橋br0 ->

[root@linux-node1~]# brctl addif br0 eth0               <- 橋接br0和eth0 ->

注:此時會斷網如果是遠程操作服務器不在身邊,建議寫成腳本來執行

[root@linux-node1 ~]# ip addr del dev eth0192.168.56.11/24   <- 刪除eth0的IP ->

[root@linux-node1 ~]# ifconfig br0192.168.56.11/24 up     <- 給br0設置IP ->

[root@linux-node1 ~]# route add default gw192.168.56.2     <- 給br0設置網關 ->

 

爲了避免斷網,直接寫成腳本即可:

#!/bin/bash

brctl addbr br0

brctl addif br0 eth0

ip addr del dev eth0192.168.56.11/24

ifconfig br0192.168.56.11/24 up

route add default gw192.168.56.2

 

[root@linux-node1 ~]#virsh edit CentOS-7-x86_64     <- 修改虛擬機配置 ->

將:

<interfacetype='network'                 <- 虛擬機網絡連接方式->

  <mac address='52:54:00:0b:f8:a5'/>

  <source network='default'/>              <- 當前主機網絡名稱 ->

 

修改爲:

<interfacetype='bridge'>

  <mac address='52:54:00:0b:f8:a5'/>

  <source bridge='br0'/>

[root@linux-node1 ~]#virsh shutdown CentOS-7-x86_64  <- 關閉虛擬機 ->

Domain CentOS-7-x86_64 isbeing shutdown

[root@linux-node1 ~]#virsh start CentOS-7-x86_64    <- 啓動虛擬機 ->

Domain CentOS-7-x86_64started

 

[root@linux-node1~]# ifconfig              <- 查看網卡信息 ->

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

        inet 192.168.56.11  netmask 255.255.255.0  broadcast 192.168.56.255

        inet6 fe80::20c:29ff:fefe:1620  prefixlen 64 scopeid 0x20<link>

        ether 00:0c:29:fe:16:20  txqueuelen 0 (Ethernet)

        RX packets 74  bytes 8909 (8.7 KiB)

        RX errors 0  dropped 0 overruns 0  frame 0

        TX packets 63  bytes 11462 (11.1 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0 collisions 0

 

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

        inet6 fe80::20c:29ff:fefe:1620  prefixlen 64 scopeid 0x20<link>

        ether 00:0c:29:fe:16:20  txqueuelen 1000  (Ethernet)

        RX packets 26401  bytes 26066467 (24.8 MiB)

        RX errors 0  dropped 0 overruns 0  frame 0

        TX packets 8582  bytes 1939240 (1.8 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0 collisions 0

 

lo:flags=73<UP,LOOPBACK,RUNNING>  mtu65536

        inet 127.0.0.1  netmask 255.0.0.0

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

        loop txqueuelen 0  (Local Loopback)

        RX packets 4  bytes 216 (216.0 B)

        RX errors 0  dropped 0 overruns 0  frame 0

        TX packets 4  bytes 216 (216.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0 collisions 0

 

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

        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

        ether 00:00:00:00:00:00  txqueuelen 0 (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0 overruns 0  frame 0

        TX packets 2  bytes 84 (84.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0 collisions 0

 

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

        ether fe:54:00:0b:f8:a5  txqueuelen 500  (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

五.KVM的優化

5.1 cpu的優化

l  Inter的cpi的運行級別,按權限級別高低Ring3 -> Ring2 -> Ring0,(Ring1和Ring2暫時沒什麼用)Ring3位用戶態,Ring0爲內核態。

wKioL1hk0kagdPejAAICSb4aCNU010.png-wh_50

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

l  Cpu的緩存綁定cpu的優化

[root@linux-node1~]# lscpu|grep cache

L1dcache:             32K

L1icache:             32K

L2cache:              256K

L3cache:              3072K

 

l  L1、L2、L3三級緩存和cpu綁定

L1是靜態緩存,造價高,L2,L3是動態緩存,通過脈衝的方式寫入0和1,造價較低。Cache解決了cpu處理快,內存處理慢的問題,類似於memcache和數據庫,如果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內存的優化

l  內存尋址:宿主機虛擬內存 -> 宿主機物理內存

虛擬機的虛擬內存 -> 虛擬機的物理內存

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

wKioL1hk0nPBvUzkAAHbq3M4CWI669.png-wh_50


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

 

l  KMS內存合併

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

[root@chuck~]# ps aux|grep ksmd|grep -v grep

root        286 0.0  0.0      0    0 ?        SN   12:32  0:00 [ksmd]

 

  • 大頁內存CentOS7默認開啓

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

[always]madvise never

[root@chuck~]# ps aux |grep khugepage|grep -v grep

root        287 0.2  0.0      0    0 ?        SN   12:32  0:21 [khugepaged]

Linux平臺默認的內存頁面大小都是4KHugePage進程會將默認的的每個內存頁面可以調整爲2M

5.3磁盤IO的優化

  • IO調度算法,也叫電梯算法

① 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@chuck~]# dmesg|grep -i "scheduler"

[   11.312549] io scheduler noop registered

[   11.312555] io scheduler deadline registered(default)

[   11.312606] io scheduler cfq registered

 

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

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

noop[deadline] cfq

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

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

noopdeadline [cfq]

 

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

[root@chuck~]# vim /boot/grub/menu.lst

kernel/boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet

5.4cache的優化

關於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-x86_64.raw,這就是虛擬機的鏡像嘍。

[root@chuck~]# cd /opt/

[root@chuckopt]# ls

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章