資源使用和交付模式,並非技術,分爲公有云,私有云,混合雲,依賴虛擬化技術,從而實現彈性擴展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便可看到頁面