虚拟化相关
?
操作系統與虛擬化
操作系統與虛擬化計算機的發展計算機基礎CPUCPU總線類型I/OOS系統調優概述調優工具CPU優化CPU親和型調度策略中斷請求內存調優虛擬內存管理文件系統相關調優網絡相關調優IO磁盤調度器工具查看虛擬化技術CPU虛擬化:硬件虛擬化CPU半虛擬化 (para-virtulization)Memory虛擬化I/O虛擬化兩種實現方式虛擬化網絡:XenXen的工作模式Xen的使用方式:Xen Grub配置xen虛擬狀態:xm常用命令創建xen pv模式虛擬機xm的配置文件關聯loop設備文件移動安裝虛擬機Xen快速安裝Xen 總結:磁盤映像管理工具qemu-img鏡像格式libvirt磁盤和網絡熱插拔Xen實時遷移KVMqemu-kvm其他常用選項KVM虛擬網絡模型qemu-imgCirrOS虛擬機遷移virtioLibvirtvirshvirt-installRHEL 虛擬化包組ESXI補充:
12:26:50 13:10:30
http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html
計算機的發展
電子電路, 邏輯電路,數字電路柔和起來的芯片. 讓硬件工作起來是極其困難的. 軟件. 于是有了操作系統, 可以提供通用接口跟硬件打交道.
公共功能被抽取出來叫做庫, 這些向上的接口, application program interface. 只要是被開發為應用程序, 不是在內核空間所運行的程序稱為, 用戶態. 比如計算1+1=2的運算, 無需經過內核處理, 可以直接在CPU上面執行.
用戶態; 內核態
我們需要一個用戶態的接口可以通知并且與內核交互. 于是我們有shell.
第一代:真空管,I/O穿孔卡片, 穿孔紙帶(耗電量驚人) 1945-1955
第二代:晶體管,批處理系統, 在磁帶機上工作, 串行執行$$job1$$job2$$job. 1955-1965
? Mainframe大型計算機
? Fortran:古老的編程語言(高級語言)
第三代:集成電路芯片,多道程序設計, 引入的監控程序, 在硬件上同時執行多個程序, 多個程序彼此之間互相隔離, 有個進程級的概念。(65年~80年)
? 進程是程序的副本, 從程序入口開始, 到程序運行結束, 期間調度都是通過監控程序來實現.
? 引入了監控程序,time-sharing, 分時設計系統。將CPU的運算分成了時間片
第四代:PC機。
? LSI:大規模集成電路。在每平方厘米的芯片上可以繼承數千個晶體管. 目前,22nm技術。
? CP/M: 微機上出現的第一個操作系統. 微型計算機的控制程序,control program for micro-computer (1974)
? 77年: digital research(數據研究所), 重寫的CP/M使得CP/M可以運行在早期intel的8080芯片上.
? IBM和比爾蓋茨的故事.
計算機基礎
計算機五大部件
馮諾依曼
- 存儲器
- 控制器
- 運算器
- Input
- Output
HD controller: 硬盤控制器. 并不是直接連接到主機上. 一般通過控制機或者適配器連接到主機上.
I/O設備之間為了彼此通信, 要通過總線的方式連接在一起.
如果使用星型模型, 設備之間的連接將會變得非常麻煩. CPU要給每設備提供一根線, 拓撲十分復雜.
總線的工作頻率通常比較高, 數據交換能力比較強. 早期的計算機架構中, 總線并不是CPU使用的瓶頸.
CPU
至今國人無法生產CPU, 指令集丑陋不堪
MMU: X86架構下內存管理單元,Memory Management Unit。主要作用是實現內存分頁
CPU執行的過程:取指,解碼,確定其類型和操作樹并執行 (每個時鐘周期). 必要時會取數據.
- 取指單元:負責從內存中獲取指令
- 解碼單元:負責將指令解碼
- 執行單元:將指令執行
如此一來, 任何一個指令的執行都需要三個時鐘周期.
? 第一個時鐘周期取來數據, 從內存單元獲取數據的時候可能還比較慢. (理想狀態) .
? 為了保證其流暢性, 使用多級流水線的方式來工作. 取指單元取完第一個指令之后, 就去取第二個指令.
取指單元-->解碼單元-->執行單元
? 取指單元-->
CPU訪問內存的時候會先發送請求指令給內存控制器, 發送請求地址進行定址. 內存控制器在內部, 通過虛擬電路, 使CPU和訪問內存地址建立起關聯關系.
FSB: 前段總線的速度稱為CPU和內存之間的瓶頸. (10GB/s)
AMD研發的HT技術和Intel研發的QPI技術, 將CPU和內存直接相連. 速率提升在一倍以上
CPU總線類型
- 地址總線
- 控制總線
- 數據總線
CPU內部都有一些保存臨時關鍵變量和臨時數據的存儲器, 這些存儲器叫做CPU的寄存器.
CPU的寄存器:程序計數器和堆棧指針,程序狀態字。
? 程序計數器記錄程序的指令, 并通過堆棧指針指向下一條指令
? 寄存器保持跟CPU時鐘同步的存儲單元, 在CPU內部總線上完成通信.
上下文切換時,CPU要將寄存器中的內容保存至內存中, 保存現場. 現場保存到內存中.即寄存器會被清空.
task struct: 一種內核使用的數據結構, 記錄了當前進程的各種狀態信息,其中就包括上下文現場的信息
多核心,超線程都可以提高運算能力。
進程的CPU親原型, CPU affinity.
摩爾定律: CPU中晶體管的數量每二十四個月翻一番
? 超線程可以使CPU在兩個線程之間進行切換,在cpu中引入一個獨特的類似于寄存器之類的設備來實現的.
任務管理器中看到的核心數是邏輯核心數.
3Ghz=3 * 1024^3
不論有多少顆核心, 一個進程在運行時只能使用一顆核心. 核心越多, 可以分配給更多的進程使用. 為了利用多核系統, 并行編程變得非常重要. 理想狀態, 比如將400條指令分配給4個核心, 每個核心執行100條指令. 但是很容易出現的情況就是一個執行流結束后要等待其他執行流的執行結果. 如果一個線程正在打開一個文件, 并且另一個線程也要打開此文件, 那么另一個線程只能處于等待狀態. 由于線程之間是共享進程的文件描述符, 防止資源征用, 一般都要施加以鎖機制.
? 資源證用的地方稱之為臨界區
? 對于linux而言,內核調用線程的時候將其看作進程
一個CPU管理兩個隊列, 運行隊列沒有完成的操作會放到過期隊列中.
- 運行隊列
- 過期隊列
二者可以互置,減少了復制的操作.
內核rebalance 來重新優化Core的work load (每一秒鐘). rebalance可能導致緩存無法命中.
將一個進程綁定在一個CPU核心上是為了提高其緩存命中率的
SMP:對稱多處理器, 多CPU.(在多核心無法滿足橫向擴展的前提)
CPU Socket: CPU插槽
CPU通過總線與內存相連,用于存儲.
1600MHZ是目前內存主流頻率, 1866MHZ.
I/O橋. 南橋慢(ISA橋), 打印機鍵盤鼠標,北橋快(PCI橋)
一些高端的CPU已經直接使用專門的內存總線讓CPU和內存連接通信.
程序局部性原理
? 空間局部性:程序是由指令+數據組成, 一個數據被訪問到, 離這個數據很近的數據也可能被訪問到.
? 時間局部性:一個指令執行完成之后, 很快還會再次被訪問到.
由于局部性原理的存在, 不論是空間還是時間上, 我們都要對其做緩存.
引入內存, 是一種拿時間換空間的方式.
加上緩存, 是一種用空間換時間的方式.
而對于CPU自身而言, 他所能操作的存儲器只有寄存器. 本地存儲單元.
磁帶-->機械式硬盤-->固態硬盤-->內存-->三級緩存-->二級緩存-->一級緩存-->寄存器
緩存的n-way associate n路關聯
1ns-->2ns-->4ns-->8ns-->10ns-->1ms--->10ms
二八法則,百分之二十的緩存存放于上級存儲設備中
緩存的造價非常高,主頻,一二級緩存大小
? 一級二級緩存是各物理核心專用的, 三級緩存是各物理核心共享的.
多核心共享使用CPU和三級緩存會產生資源爭用的問題. 需要內存訪問仲裁控制器
NUMA: null uniformed memory access. 非一致性內存訪問。每顆CPU(Socket)都有獨立的外部內存空間
? 這樣一來不當緊, 如果程序從core1 復用到core3, 就會產生core3所對應的內存低智商上并沒有該程序的數據. 于是需要將數據從core1的內存空間復制一份到core3上.
? 這種機制對CPU綁定進程的方式更加迫切
緩存中的寫機制
? write through: 通寫,從一級緩存到寫入內存,才釋放CPU資源
? write back: 回寫,寫到一級緩存就通知CPU,寫完成
硬盤的緩存機制同理.
I/O
每個IO設備通常有兩部分組成:
-
設備控制器(Controller):集成在主板上的一塊芯片或一組芯片。負責從操作系統獲得命令并執行
- IDE:Integrated Drive Electronics, 集成驅動器電子設備
- SATA
-
設備本身
控制器是置于I/O設備本身的或者系統的主印制電路板(通常成為主板)上的芯片組,而適配器則是一塊插在主板插槽上的卡。無論如何,它們的功能都是在I/O總線和I/O設備之間傳遞信息
對于操作系統而言, 在驅動程序之上, 所有的硬件操作都被抽象成文件的操作. 驅動程序控制控制器轉換命令操作.
真正的硬件操作是由驅動程序來完成的,而并不是內核. 將操作系統的請求轉換成電氣信號.
驅動程序:通常應由設備生產商;位于內核中
每個控制器都有少量的用于實現通信的寄存器。直接集成在控制器內部
比如一個磁盤的控制器, 可能會有指定磁盤地址, 內存地址, 扇區計數, 方向(數據存儲方向)等相關的寄存器. 操作系統發起的請求通過驅動轉換成相應指令并放置于控制器的寄存器中, 才能完成操作.
I/O端口空間: 每個寄存器表現為一個I/O端口(由成百上千個控制器的寄存器組成)
? 所有的寄存器組合成設備的I/O地址空間
? I/O端口空間,16bit, 65535. 或32bit
? 在開機時,向主機注冊申請,根據申請順序,依次給與IO端口
I/O請求需要CPU將數據放置到內存中給某程序處理, 進程未必處于運行狀態.
實現輸入輸出:
中斷控制器一般與CPU通過某個引腳直連, 在中斷到來時通知CPU. 獲得通知后的CPU可以直接根據IO端口, 并激活內核并做進程切換, 這種切換稱為中斷切換(不同于進程切換). 內核將正在運行的進程切換出去, 并將kernel本身運行在CPU上, kernel指揮著到響應的I/O設備上獲取其中斷請求, 并判定是否能完成其請求.
中斷處理通常分為兩部分:
- 中斷上半部:把數據從網卡的接受緩沖放到內存中. (此時可能需要把原先的中斷前的進程執行完畢)
- 中斷下半部:處理請求
理論上每個網卡報文到達網卡都會引起CPU中斷.
? 3 . DMA設備,Direct Memory Access.直接內存訪問。硬盤網卡都具有DMA設備。是I/O設備上自帶的一個具有智能型的控制芯片. CPU通知DMA設備, 可以獲得總線的使用權限. (此權限同一時間只能由一個設備具有), 并通知DMA設備可以使用的內存地址空間(起始地址和結束地址), 負責將設備緩沖區的內容讀到內核緩沖區(完成中斷的上半部). 提供出一大段連續的內存空間用于存儲緩沖數據. DMA設備具有控制總線的權限, 通過CPU來協調使用. 當數據復制完成, DMA通知CPU中斷上半部完成.
網卡設備都有其緩沖區, 發送緩沖, 和接受緩沖. 網卡發起中斷, 通知CPU, CPU根據IO端口, 激活內核做中斷切換, 內核將數據從網卡緩沖區復制到內核緩沖區(內存中的讀緩沖區), 如果目標IP是自己則拆報文封裝. 并根據服務端口發送給用戶程序.
OS
進程是資源分配的最小單元
CPU: 時間片,time slice. 不考慮優先級的情況下, 每個進程在分配時間片的時候是等長的.
Memory:
內存是編指的. 變量是命名的內存空間.
CPU有尋址/編指單元, CPU字長 32位/64位, 實際上是地址總線的編指.
通常硬件(X86、ARM這類架構的機器)中斷向量是放在高地址空間的,所以內核也就放在高地址空間。另外,通常情況下,低地址空間0~64MB的范圍是不用的,為了捕獲null異常。
OS在RAM中,處于高地址空間.
OS在ROM中,處于高地址空間. 比如Andord操作系統. 其中ROM的地址空間也會被編指
OS在RAM中,ROM存放驅動.
虛擬地址空間出現的原因, 如果CPU有4G的編指能力, 但是實際的物理內存只有2G怎么辦. 如果有多個進程同時運行, 也會產生內存地址的征用.
虛擬地址空間:實現內存地址的使用
I/O: 抽象成文件
進程:資源集合
- CPU時間
- Memory,抽象虛擬地址空間(32bits:4G) 固定是上層3G內存,內核固定使用低端1G內存.根據程序的局部性原理, 內存地址的分配也是局部的, 只分配當前使用的一部分地址就可以.
- I/O, 打開的多個文件,fd(文件描述符 file descriptor) 輸入:0 標準輸出:1 錯誤輸出:2
- 正常文件
- 設備文件: 塊設備, 字符設備
- 管道文件:一個進程的輸出作為另一個進程的輸入所產生的文件, 由內核創建出一個虛擬文件
- 套接字文件:
- Task Struct:作業地址結構,內核在內核的地址空間內為每一個進程所維護的數據結構。通過鏈表的形式保存各種資源占用信息。維護進程的資源集.
Page Frame:頁框,通常每4k為一個單位。內存使用頁框作為存儲單元.
地址空間: 低 ---> 高
代碼段-->數據段(靜態變量)-->堆(數據流 由malloc創建) -->映射的共享庫-->棧(變量)
通常CPU上有一個特殊的稱之為堆指針的寄存器 (stack pointer) 。在程序初始化時,該指針指向棧頂,棧頂的地址最大。CPU有特殊的指令可以將值Push到線程堆上,以及將值Pop出堆棧
Stack最經典的使用方式就是算數運算.
在現實生活中Queue的應用也很廣泛,最廣泛的就是排隊了,”先來后到” First come first service ,以及Queue這個單詞就有排隊的意思。還有,比如我們的播放器上的播放列表,我們的數據流對象,異步的數據傳輸結構(文件IO,管道通訊,套接字等)
進程通知CPU線性地址,CPU要查詢內核中的task struck的內存映射(Page Table)并找到物理地址。
Page Table: 頁表。多級映射(一級目錄,二級目錄,三級目錄,類似ext3),映射連續地址空間與物理地址空間. 使用目錄項來做映射. 每一個對應關系稱為一個頁表項, page table entry.
CPU中的MMU組件就是用來完成頁表映射的。上下文切換的時候MMU中的內容也要進行切換.
TLB: CPU與MMU之間存在緩存,CPU先查緩存,沒有結果再去查找MMU-
? Translate Lookback Buffer,轉換后援緩存器,用于緩存頁表的查詢結果
64位地址的MMU轉換方式是相反的, 物理地址轉換成虛擬地址.
為了實現虛擬化, 早先的地址映射都是由CPU映射到HOST的地址, 然后才能映射到真是的物理地址. 經過兩次映射. 現在的CPU都有兩個MMU, shadow page table, 影子頁表.
系統調優
概述
isolcpus=0,1隔離CPU
如果進行swap的時候, maps映射表將會發生變化. CPU會發生缺頁異常. swap回內存時, 會使用新的內存區域.
Major Exception: 大異常, 當內存數據找不到時, 需要從交換空間換回時, 我們就稱之為大異常.
Minor Exception: 小異常, 當發生缺頁異常的時候, 無需從硬盤上從新查找, 只需要在內存上重定向就可以找到的場景. 比如共享庫.
內存常駐內存集: RSS, 只能在內存中存儲, 指令, 靜態變量. 數據,比如打開的文件可以交換出內存.
干凈頁面: 在內存中沒有被修改過的頁面. 修改過的頁面, 都會被同步到磁盤中, 叫做臟頁同步.
7200轉的硬盤, 每秒鐘一百次隨機I/O就已經非常不錯了, 固態硬盤是寫,300-400, 讀 500-600
由于機械臂只有一個, 所以磁盤I/O必然是串行的. I/O數量過多, 會產生阻塞, 導致CPU產生等待.
PCI-E的特定設計過的固態硬盤, 每秒鐘可以達到數十萬個.
cache: 讀取, 命中或者未命中
buffer: 寫, 現在內存中寫, 再寫入磁盤中
內核守護線程: ps指令加中括號的指令. 其優先級較高.
進程優先級: 1-99 數字越大優先級越高, 100-139. 一共一百四十個. 0-139.
實時進程: 內核中執行某些后臺的關鍵性的守護線程, 其優先級較高. 一般進程分到的時間片是5ms, 不論進程是否執行完成, 都要切到其他進程中.然而, 實時進程不是這么調度的. 實時進程在執行時, 只要其未執行完畢, 則不會進行進程切換, 除非有優先級更高的進程要執行.
普通進程都是按照時間片進行分配的.
內核進行動態優先級決策.
CPU的調度隊列: 每個優先級都有一個隊列. 共有140個隊列. CPU時間片分配大致是這樣的, 按照隊列的優先級從高低依次掃描, 找到待執行進程并取出執行.
進程調度策略:
? CFS: completely fair schedular 完全公平調度器,
調度實時進程和調度用戶進程的調度方法是不一樣的, 實時進程是按照先進先出, 或者是輪流的方法(RR)
用戶進程使用的調度算法一般是CFS, 會對占用CPU時長過多的進程進行懲罰.
網絡I/O. 使用特殊內存數據結構來維持每一個連接.
后援隊列: 當進程注冊的內存的緩沖區滿了, 內核會在其內存空間將新的請求接進來, 等之后再決定如何處理.
tcp連接重用機制
調優工具
sar, 淘寶tsar. htop, dstat, glances, vmstat, netperf, iftop
重量級: systemtap, oprofile, perf, valgrind(內存級別的性能分析公爵)(開發級別的工具)
systemtap: 是一個跟蹤和探測工具, 可以讓用戶監控并分析操作系統活動(特別是內核活動)的細節, 它提供類似netstat, top, ps 和iostat等工具的輸出結果, 但包含為所收集信息的額外過濾和分析選項.
CPU優化
CPU親和型
CPU掩碼, 最高位對應最后一個邏輯CPU. 0x00000001代表處理器0, 0x00000003代表處理器0和1.
taskset -p mask pid taskset -c 0,5,7 -- program taskset -pc 2 2480 taskset -c 1,2 nginxtaskset可以控制CPU的親原型, 但是在numa架構下, 也很難保證, CPU所訪問的數據是在其對應的內存空間的.
/sys/devices/system/cpu目錄中包含有關系統CPU是如何連接的信息.
/sys 目錄下一般保存跟硬件驅動相關的信息
/proc 內核運行屬性相關
numactl --show--hardware--membind 只從指定節點分配內存.兩三萬的服務器都不支持numa體系結構, 多個物理CPU, 并有多個內存控制器
調度策略
實時策略
SCHED_FIFO: 靜態優先級調度, 根據程序優先權順序掃描SCHED_FIFO線程列表. 這個線程會運行到它阻斷,推出或者被更高的線程槍戰準備運行的時候. 其優先級高于非實時線程
SCHED_RR:論調的調度. 有相同優先級的線程使用特定仲裁或者時間片以輪詢的方式進行調度.
chrt 修改實時優先級屬性, 默認是用RR
chrt [options] <policy> <priority> {<pid> | <command> [<arg> ...]} chrt -f 3 service nginx start一般調度策略
SCHED_OTHER: 默認調度策略, 該策略使用完全公平調度程序(CFS). CFS建立了動態優先權列表, 部分是根據每個進程線程的niceness值.
SCHED_IDLE: 首先用于低優先權任務, 優先級非常低的任務.
SCHED_BATCH: 也是用于低優先權任務.
中斷請求
/proc/interrupts
IRQ是用于服務的請求, 在硬件層發出, 可使用專用硬件線路或跨硬件總線的信息數據包(消息信號中斷, MSI)發出中斷.
啟用中斷后, 接受IRQ后會提示切換到中斷上下文. 內核中斷調度代碼會搜索IRQ號碼及其關聯的注冊中斷服務路由(ISR)列表, 并按順序調用ISR.
man 5 proc
中斷親原性
grep eth0 /proc/interrupts cat /proc/irq/19/smp_affinity 00000000,00000000,00000000,00000008內存調優
TLB: 轉義后援緩沖器, CPU緩存級別. 條目非常的少
MMU是分級的, 類似于目錄結構, 便于遍歷.
對于吃內存的進程, 通常使用大內存頁的方式. 超大頁面必須在引導時分配, 并且他們很難手動管理.
THP: 透明大頁面, 自動創建, 管理和使用超大頁面.
Varnish跟THP不兼容.
容量調節
位于/proc/sys/vm/
overcommit_memory: 規定決定是否接受超大內存的請求, 是否可以超出物理內存的大小. OOM kill: Out Of Memory. 壞蛋評分, 內核決定. 優先kill壞蛋評分高的.
? 0 . 默認設置, 內核執行啟發式內存過量使用處理. 計算方式一般是, 物理內存加交換內存.
? 1 . 無內存過量使用處理. 使用這個設置會增大內存超載的可能性
? 2 . 內存拒絕等于或者大于總可用swap大小及overcommit_ratio指定的物理RAM比例的內存請求.
? eg. 4G物理內存+4G交換內存. swap + memory* overcommit_ratio, 此處最多可以使用6G內存
? 比較理想, 但是如果有4G物理內存, 8G交換內存. 則, 此處可以使用8G內存, 顯然并不是合理.
max_map_count: 規定某個進程可能使用的最大內存映射區域. 默認為65530, 映射文件數. Mmap, 將磁盤的文件直接映射到內存地址空間, 像使用內存一樣使用磁盤上的數據.減少I/O, 從磁盤copy文件到內存的時間.
nr_hugepages: 規定在內核中配置的超大頁數. 默認為0. 只有當系統中有足夠的連續可用頁時, 方可分配超大頁.
sysctl -w vm.nr_hugepages=20MySQL的配置變量中可以設置允許使用大內存頁.
清楚緩存和緩沖
清buffer sync 清cache echo 1 >/proc/sys/vm/drop_caches容量相關可調參數, 位于/proc/sys/kernel/目錄中
msgmax: 以字節為單位規定信息隊列中任意信息的最大允許大小. 這個值一定不能超過該隊列的大小(msgmnb), 默認為65536
msgnmb: 信息隊列的最大值. 默認是65535
msgmni: 規定信息隊列識別符的最大數量. 64位 為1985, 32位為1736
shmall: 以字節為單位規定一次在系統中可以使用的共享內存總量. 64位 4294967296; 32位 268435456
shmmax: 以字節為單位規定內核可允許的最大共享內存片段. 64位68719476736, 32位4294967295
shmmi: 規定系統范圍內最大共享內存片段. 默認為4096
threads-max: 規定內核使用的最大線程. max_threads = mempages/(8*Thread_size/Page_Size)
文件系統相關參數, 位于/proc/sys/fs/目錄
aio-max-nr: 規定在所有活動異步I/O上下文中可允許的最多事件數.
file-max: 列出內核分配的文件句柄最大值. (mempages*(Page_size/1024))/10或者NR_FILE
Out-of-Memory Kill 可調參數:
如果將/proc/sys/vm/panic_on_oom參數設定為0, 會讓內核在出現OOM時調用oom_killer功能.
oom_adj: 定義-16到15之間的一個數值以便幫助決定某個進程的oom_score. oom_score值越高, 被oom_killer殺死的進程數就會越多.
虛擬內存管理
位于/proc/sys/vm/下
zoned buddy allocator: 防止內存外碎片, 將大量的離散內存合并成連續的內存.
? /proc/buddyinfo
slab allocator: 小內存空間的分配. 有固定個數. 防止內存內碎片
? /proc/slabinfo
16M DMA使用 --> 896M 內核使用 --> 預留區域
zoneDMA zoneNormal 大于1G的地址空間, 通過映射的方式訪問(zone high memory)
PAE: 物理地址擴展(Physical Address Extension) 多了四根線, 可尋址范圍為64G
64位系統: DMA可以尋址1G的空間, 剩余空間為normal段
swappiness: 控制系統swap的程序. 高數值可優先系統性能, 在進程不活躍時,主動將其轉出物理內存. 低數值可優先互動性盡量避免將進程轉換出物理內存. 代表一種傾向性, 默認值為60
dirty_ratio: 規定百分比值, 當臟數據組成達到系統內存總數的百分比值后開始寫臟數據(pdflush), 默認為20(單個進程)
dirty_backgroud_ratio: 當臟數據組成達到系統內存總數的百分比后,開始在后端寫下臟數據(pdflush), 默認為百分之10. (系統級別)
vm.dirty_expire_centisescs: pdflush守護進程被喚醒刷寫數據的時間
vm.dirty_writeback_centisecs: 一個數據成為臟數據多久以后被刷寫到磁盤.
刷寫臟頁的方法
1 . sync
2 . fsync system call
3 . echo s > /proc/sysrq-trigger
drop_caches: 讓內存放棄各種緩存頁和slab緩存的各種組合
1 . 系統釋放所有頁緩沖內存. 可以理解為free指令中顯示的cache
2 . 系統所有未使用的slab緩沖內存. 可以理解為free指令中顯示的buffer
3 . 系統釋放所有也緩存和slab緩沖內存.
文件系統相關調優
Barriers: 寫入barrier是保證在永久存儲中正確寫入并排列文件系統元數據的內核機制. 即使在存儲設備會經常斷電的情況下也不例外. 只對非回寫的機制有意義.
掛載文件系統時, 可提升文件系統性能:
? nobarrier: barrier通常只對write back機制有意義
? noatime: noatime包含nodiratime
? nodiratime:
EXT4: 支持到最大文件系統為16TB, 單一最大文件為16TB
XFS: 另一種可伸縮性文件系統, 沒有文件大小的限制. 性能本身也非常不錯
網絡相關調優
Socket buffer: 1. tcp_rmem 2. tcp wmem
網絡接收器路徑圖表
NIC hardware buffer --> hard IRQ --> soft IRQ --> app socket queue <--- application
網絡優化參數:
net.ipv4.tcp_max_tw_buckets: timewait的數量, 默認為8192
net.ip4.ip_local_port_range = 1024 65000: 允許系統打開的端口玩味, 前者為下面, 后面的數字為上限: 默認為32768 61000; 此范圍決定了最后timewait狀態的連接的數量, 下面的兩項可有效降低tw狀態連接的數量. (前端代理服務器一般應該修改)
net.ipv4.tcp_tw_recycle = {0|1}: 是否啟用timewait快速回收, 注意, 開啟此功能在NAT環境下可能會出現嚴重的問題, 因為TCP有一種行為, 它可以緩存每個連接最新的時間戳, 后續請求中如果時間戳小于緩存中的時間戳, 即被視為無效并丟棄響應的請求報文.
net.ipv4.tcp_tw_reuse = {0|1}: 是否啟用tw重用, 即是否允許將TIME-WAIT sockets用戶新的TCP連接
net.ipv4.tcp_syncookies = {0|1}: 是否開啟SYN Cookies, 即當SYN等待隊列溢出時, 是否啟用cookies功能.
net.ipv4.tcp_timestamps = 0 tcp報文時間戳, 關閉時可以避免序列號的卷繞. 原因是當tcp_tw_recycle/tcp_timestamps都開啟的條件下, 60s(timewait)時間內, 同一源ip的主機socket connect請求中的timestamp必須是遞減的.
net.ipv4.tcp_max_syn_backlog = 262144: 保存的那些尚未收到客戶端確認信息的連接請求的最大值: 默認為128, 可以增大此值.
net.ipv4.tcp_synack_retries = #: 為了打開對端的連接, 內核需要發送一個SYN并附帶一個回應前面一個SYN的ACK, 這也即所謂三次握手中的第二次; 這個設置決定了內核放棄連接之前SYN+ACK的數量, 繁忙的服務器上建議設置為0或者1;
net.ipv4.tcp_syn_retries = #: 在內核放棄建立連接之前發送SYN包的數量, 繁忙的服務器應該設置為0或1.
net.ipv4.tcp_max_orphans = 262144: 系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上, 如果超過這個數字, 孤兒連接將即刻被復位并打印出警告信息, 這個限制僅僅是為了防止簡單的Dos攻擊, 不能過分依靠它或者認為的減少這個值, 如果需要修改, 在確保有足弓內存可用的前提下, 應該增大此值.
net.ipv4.tcp_fin_timeout = 5: 如果套接字由本段要求關閉, 這個參數決定了它保持在FIN-WAIT-2狀態的時間, 缺省值為60秒. 然而, 對端可能會出錯或者意外宕機并永遠不關閉連接. 即使你的機器是一個輕載的WEB服務器, 也有因為大量的死套接字而內存溢出的風險, FIN-WAIT-2的危險性比FIN-WAI-1要小, 因為每個連接最多只能消耗1.5k內存, 但是他們的生存期長些.
tcp.ipv4.tcp_keepalive_time = 30:當keepalive啟用的時候, TCP發送keepalive消息的額度, 默認為2小時(7200).
net.core.rmem_max=8388608: 定義內核用于所有類型的連接的最大接受緩沖大小.
net.core.rmem_default=65536: 定義內核用于所有類型的連接的默認接收緩沖大小.
net.core.wmem_max=8388608: 定義內核用于所有類型的連接的最大發送緩沖大小
net.core.wmem_default=65536: 定義內核用于所有類型的連接的默認發送緩存大小
net.ipv4.tcp_mem='8388608 8388608 8388608' 定義TCP協議棧使用的內存空間, 分別為最小值, 默認值和最大值
net.ipv4.tcp_rmem='4096 87380 8388608': 定義TCP協議棧用于接收換種的內存空間: 第一個值為最小值, 即便當前主機內存空間吃緊, 也得保證TCP協議棧至少有此大小的空間可用, 第二個值為默認值, 他會覆蓋net.core.rmem_default中為所有協議定義的接收緩沖的大小, 第三值為最大值, 即能用于TCP接收緩沖的最大內存空間.
net.ipv4.tcp_wmem='4096 65536 8388608'
IO磁盤調度器
CFQ嘗試根據啟動I/O的進程決定公平的I/O調度. 可提供三個不同的調度等級: 實時(RT), 最佳效果(BE)和閑置. 可以使用ionice命令手動分配調度等級.
在最新的內核版本和發行版中,都選擇CFQ做為默認的I/O調度器,對于通用的服務器也是最好的選擇.
CFQ賦予I/O請求一個優先級,而I/O優先級請求獨立于進程優先級,高優先級進程的讀寫不能自動地繼承高的I/O優先級.
CFQ為每個進程/線程單獨創建一個隊列來管理該進程所產生的請求,也就是說每個進程一個隊列,各隊列之間的調度使用時間片來調度,以此來保證每個進程都能被很好的分配到I/O帶寬.I/O調度器每次執行一個進程的4次請求.
只有CFQ調度算法可以使用ionice更改類型和優先級
有八個調度等級, 0代表最高優先級, 7代表最低優先級. 默認等級為4.
eg. 采用cfg的實時調度, 優先級為7
ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&采用缺省的磁盤I/O調度, 優先級為3
ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&采用空閑的磁盤調度, 優先級為0
ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&ionice的三種調度方法,實時調度最高,其次是缺省的I/O調度,最后是空閑的磁盤調度.
/sys/block/sda/queue/scheduler 調度器
noop: 電梯調度算法. NOOP實現了一個FIFO隊列,它像電梯的工作主法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合并到最近的請求之后,以此來保證請求同一介質. NOOP傾向餓死讀而利于寫. 內核2.4之前的唯一算法
電梯算法餓死讀請求的解釋:因為寫請求比讀請求更容易.
寫請求通過文件系統cache,不需要等一次寫完成,就可以開始下一次寫操作,寫請求通過合并,堆積到I/O隊列中.
讀請求需要等到它前面所有的讀操作完成,才能進行下一次讀操作.在讀操作之間有幾毫秒時間,而寫請求在這之間就到來,餓死了后面的讀請求.
deadline: 會優先響應到期的I/O請求, 讀的響應時間通常較短.
通過時間以及硬盤區域進行分類,這個分類和合并要求類似于noop的調度程序.
Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而默認讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.
Deadline對數據庫環境(ORACLE RAC,MYSQL等)是最好的選擇.
RAID芯片也可能有自己的調度算法
永久修改I/O調度
修改內核引導參數,加入elevator=調度程序名
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet工具查看
查看統計數據
ethtool -S ethx
dstat
iostat
sar
tsar也可以監測流量
iostat
iftop監測流量
lsof
glances 可以工作在C/S模式下
server端
glances -s -B 192.168.48.130
client端
glances -c 192.168.48.130
如果安裝了 python-jinja2
可以glances -o HTML -f /var/www/html
可以使用瀏覽器訪問: http://ip/glances.html
虛擬化技術
起始于上個世紀70年代的IBM公司.
PC機的出現, 使虛擬化技術變得不那么重要.
CPU本身就是被抽象成時間片了, 這就是CPU虛擬化的基礎.
Host: 宿主機
Guest: 虛擬機
模擬實現
虛擬機CPU是軟件模擬,純軟件實現,特權指令是向host請求。
BT技術:Binary Translation 二進制翻譯技術。運行時翻譯,大大的提高了性能 (vmware)
BT技術的前提就是虛擬架構與底層物理架構相同. 使用這種方式的轉換時, 虛擬機的用戶空間運行在Ring3, 虛擬機的內核空間運行在Ring1, 宿主機的內核空間運行在Ring0
CPU虛擬化:
模擬:emulation,軟件模擬。模擬ring 0~3
虛擬:virtulization 架構要相同,僅僅需要模擬ring0
? 完全虛擬化,宿主機完全虛擬出來一個虛擬平臺,guest本身并不清楚自己是虛擬化出來的。
- BT: 二進制翻譯(軟件級別)
- HVM: 硬件輔助的虛擬化(硬件)
硬件虛擬化
HVM: Hardware assistant Virtualization Machine
讓CPU具有了五個環,多了一個-1環。虛擬機運行在環-1,環-1是虛擬機的根環
ring -1是特權指令環。
Host運行在ring -1上,虛擬機的內核運行在ring 0上
ring -1 可以捕獲ring 0上的指令。
這種虛擬化技術可以達到硬件性能的百分之八十五以上
CPU半虛擬化 (para-virtulization)
各guest的內核明確知道自己運行在虛擬化環境中, 他會向宿主機內核發起調用.
vm monitor = hypervisor 虛擬機監視器
hypervisor直接管理硬件(CPU和內存,一般不包括I/O),相當于內核
hyper call: 直接調用而非翻譯
虛擬機的內核要被修改,讓其內核知道此種調用機制。
這種虛擬化可以達到硬件性能的百分之九十以上
Memory虛擬化
兩次地址空間轉換, 第一次轉換成內核的虛擬拿到的連續的地址空間, 第二次從內核的虛擬空間轉換至實際的物理地址空間(第二次轉換是軟件模擬)
進程:線性地址空間
內核:物理地址空間
Hypervisor: 虛擬連續地址空間轉換成物理地址空間。Shadow page table, 影子列表的方式(一種模擬方式)。TLB難以命中,物理地址不重疊,為防止混淆,每次guest切換時,將會清空TLB緩存。
于是乎:
虛擬MMU
Intel:EPT, extend page table 擴展的頁表技術
AMD: NTP, Nested Page Table 嵌套的頁表技術
GVA: 虛擬機的虛擬地址
GPA: 虛擬機的物理地址
HPA: 宿主機的物理地址
GVA通過MMU虛擬化直接向Hypervisor轉換成HPA, 需要硬件支持.
TLB 虛擬化
tagged TLB技術
打標簽GVA到HPA的標記內容
I/O虛擬化
外存:硬盤,光盤,軟盤,u盤
網絡設備:網卡
顯示設備:VGA frame buffer機制
鍵盤鼠標:ps/2, usb
I/O虛擬化的方式:
- 模擬: 完全使用軟件來模擬真實硬件
- 半虛擬化: I/O frontend --> I/O backend (僅適用于硬盤和網卡). 虛擬機內核明確知道自己運行在虛擬化環境中, 在本地并不使用本地驅動進行, 對設備的調用直接轉換到后端.
- IO-through:I/O透傳, 直接分配物理資源給虛擬機. 仍然需要hypervisor進行協調.
IO Stack: 多個虛擬機將I/O排隊
鍵盤和鼠標都是使用焦點捕獲的方式, 將模擬設備和物理設備關聯的方式
IOMMU, IO內存管理單元. 硬件要支持IO透傳技術例如intel的VT-d
Intel: VT-d 基于北橋芯片的硬件輔助虛擬化技術,提高I/O可靠性,靈活性以及性能的。
DMA對傳統的x86架構而言是集中式的, 讓多個虛擬機直接使用某塊網卡時, 會產生混淆.
IO中斷: 可編程控制器, DMA.
DMA本身直接訪問虛擬機的連續內存空間(GPA), 中間也要經過多次轉換. 并且要考慮緩沖的問題. 實現機制非常復雜
兩種實現方式
Type-II型:操作系統基礎上安裝虛擬化軟件再創建各種主機
Type-I型:基于Hypervisor
Xen,vmware ESX/ESXI 屬于Type-I型
VMware workstation/virtualbox/KVM 屬于Type-II型
Intel硬件輔助虛擬化
第一類:跟處理器相關:vt-x
第二類:跟芯片相關:vt-d
第三類:跟I/O相關,VMDq和SR-IOV
模擬器PearPC, Bochs, QEMU
完全虛擬化:VMware Worksation, VMware Server, Parallels Desktop, KVM, Xen(HVM環境中)
半虛擬化:Hyper call ABI. 虛擬機的內核經過修改。xen, uml (user-mode linux)
OS級別的虛擬化:OpenVZ, lxc. Solaris Containers. FreeBSD jails
庫虛擬化:wine,
應用程序虛擬化:jvm
虛擬化網絡:
SDN:software defined network
Bridge方式:原物理網卡被做成交換機,然后模擬一個bridge設備出來。相當于兩臺交換機,一臺虛擬出來的. 網卡工作在混雜模式, 不論是否是本機的IP都進行轉發.
host-only: 僅主機模式,需要使用路由
NAT mode: 隱藏虛擬機.
TUN與TAP
在計算機網絡中, TUN與TAP是操作系統內核中的虛擬網絡設備, 不同于普通硬件網絡板卡實現的設備, 這些虛擬的網絡設備全部用軟件實現, 并向運行于操作系統的軟件提供與硬件的網絡設備完全相同的功能.
TAP等同于一個以太網設備, 它操作第二層數據包如以太網數據幀. TUN模擬了網絡設備, 操作第三層數據包比如IP數據封包.
操作系統通過TUN/TAP設備向綁定改設備的用戶空間的程序發送數據, 反之, 用戶空間的程序也可以像操作硬件網絡設備那樣, 通過TUN/TAP設備發送數據. 在后者情況下, TUN/TAP設備向操作系統的網絡棧投遞數據包, 從而模擬從外部接受數據的過程.
一般虛擬機不提供橋接模式,需要自己配置
為了做橋接模式的配置,應當關閉NetworkManager(network manager 不支持)
真正的橋功能是通過內核的TAP/TUN實現的. bridge-utils只是修改工具
yum install bridge-utils Device=br0 TYPE=Bridge NM_CONTROLLED=no修改原eth0網卡
BRIDGE=br0查看網橋狀態
brctl show使用brctl的配置過程:
brctl addbr br0 brctl stp br0 on ifconfig eth0 0 up brctl addif br0 eth0 ifconfig br0 IP/NETMASK up route add default gw GWXen
Ian Pratt, Keir Fraser. 兩人研發.
Xen直接跑在硬件上. 需要預裝Xen Hypervisor
核心問題是如何驅動各種I/O設備
Xen Hypervisor 本身只能虛擬化CPU,MMU進行管理
Domain是Xen虛擬機單元, domain是從0開始編號.
Dom0是第一臺虛擬機,又稱特權域. 可以直接使用硬件的驅動.
Dom0提供Xen console, 并且給DomU提供I/O各種驅動
DomU對于I/O設備的使用,僅僅是前端。
Dom0的內核必須做修改,可以直接調用Hyper Call. DomU也需要直接調用Hyper Call. 進程管理和內存使用, 以及中斷部分都需要修改內核.
2.6.37之后的kernel代碼已經直接整合所有Dom0所需要的功能
2.6.24+: DomU的內核部分已經被直接整合進內核中
Linux 3.0+ 之后對Xen做了專門的優化
CPU/Memory/中斷通過Hypervisor, 但是對I/O的調用需要通過Dom0
Xen的工作模式
4.2 之后版本使用XL
4.1 之前的版本使用XM,啟用xm工具必須啟動xend進程
目前Xen已經到4.4版本了
半虛擬化: grep -E ‘pae’ /proc/cpuinfo?
全虛擬化: grep -E ‘svm|vmx’ /proc/cpuinfo?
Xen的使用方式:
-
xen hypervisor
- 硬件--->正常安裝linux發行版-->編譯安裝xen-->修改grub配置其內核為xen,而不再使用linux內核(Linux的內核和initramfs文件當做xen的模塊)-->重新編譯Linux內核,使其能夠運行于Dom0 -->重啟系統
- DomU: 在Dom0使用工具創建虛擬機-->啟動虛擬機-->安裝操作系統
-
Xenserver:
-
citrix收購
-
使用XE/XAPI管理組件
-
XCP: Xen Cloud Platform
工具棧:xm/xend, xl, xapi/xe
通用工具棧:libvirt vrish/libvirtd, virtmanager(紅帽開發)
wiki.xenproject.org
GlusterFS
centos在xen4.2開始支持使用xen.
紅帽早在RHEL5就提供的xen的重新編譯的內核, 2008年紅帽收購了KVM. RHEL5.6 嘗試引入KVM, 5.8 的時候開始取代Xen. 從RHEL6開始, 不再支持Xen. 此時的Redhat可以運行在domU上.
安裝鏡像http://vault.centos.org/6.7/xen4/x86_64/
http://mirrors.163.com/centos/6.8/virt/x86_64/xen-44/
Xen Grub配置
#boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (3.7.4-1.el6xen.x86_64)root (hd0,0)kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pinmodule /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quietmodule /initramfs-3.7.4-1.el6xen.x86_64.img title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quietinitrd /initramfs-2.6.32-279.el6.x86_64.imgAvaya的dom0使用Xen 4.1
如果要使用xm,要確保xend服務啟動
xm info xl infoDom0的ID永遠為0
xen虛擬狀態:
r: 運行狀態
b: I/O阻塞狀態
p: 暫停(暫停在內存中,資源不釋放)
s: 停止
c: 崩潰. crashed
d: dying,當前域開始關機
Time(s):占據CPU并使用于運行時間的時長
Destory: 關閉電源
Delete:刪除虛擬機
xm常用命令
create: 創建虛擬機 -c 表示打開控制臺
destory: 關閉虛擬機電源
new: 添加到xend domain
delete: 刪除
start: 開機一個域
shutdown: shutdown -h now
vcpu-list: 各虛擬機虛擬CPU狀態
創建xen pv模式虛擬機
前提
DOMU內核借用DOM0內核
磁盤創建
創建稀疏格式的磁盤
dd if=/dev/zero of=centos6.img bs=1M oflag=direct seek=1023 count=1 dd if=/dev/zero of=/xen/vm/test.img oflag=direct count=120000 bs=1M count=1 seek=1199991023直接被跳過
mount -o loop centos6.img /mnt cd /mnt;mkdir -pv etc/{init,rc.d} bin sbin lib64 dev proc sys tmp var home rootxm的配置文件
Kernel:內核
ramdisk: initramfs或initrd文件
name: 域名稱
memory:內存大小
disk: 磁盤設備文件列表,格式disk = ["disk1","disk2",]。
? 每個disk都由三個參數來定義
-
“Backend-dev": 有兩種類型,物理設備,虛擬磁盤映像文件,格式分別為:
- phy: device路徑
- file: /path/to/image_file
-
Frontend-dev: 定義其在DomU中的設備類型;虛擬磁盤映像文件對應的設備文件名通常為xvd[a-z],tr通常只能模擬IDE插槽,并不能模擬scssi設備
-
mode: 訪問權限模型:r,w
vcpus: 虛擬CPU的個數,默認為1
root: 根文件系統路徑, 指所在的設備
extra: 傳遞給內核的額外參數, selinux=0
on_reboot: 執行xm reboot命令時的操作,有destory和restart
on_crash: 有destory, restart,preserve(保存系統崩潰時的映像信息)
on_shutdown:
vif = ['ip=172.16.100.11',bridge=br0']
- type: 設備類型,默認為netfront
- mac: 指定網卡mac地址
- bridge: 指定橋接到的物理設備
- ip: 指定IP地址
- script: 配置此接口的腳本文件
- vifname : 后端設備名稱
bootloader: 引導器文件的路徑,一般指PyGrub的路徑:
cpu: 指定在某顆物理CPU上啟動
cpus: 指定當前域的VCPU可以在那些物理CPU上運行
research一下為何無法啟動此操作系統
kernel = "/tmp/vmlinuz" ramdisk = "/tmp/initramfs" memory = 512 name = "centos6_vm" vcpus = 2 disk = [ 'file:/xen/vm1/test.img,xvda,w' ] root = "/dev/xvda2 ro" extra = "3 selinux=0"關聯loop設備文件
查找最小的未被使用的loop設備
losetup -f使用鏡像文件跟loop設備做關聯
losetup /dev/loop0 /xen/vm1/test.img然后就可以對loop0進行分區
fdisk /dev/loop0 kpartx -av /xen/vm1/test.img隨后磁盤映射文件會在/dev/mapper中顯示
移動安裝虛擬機
光盤安裝使用的是isolinux下引導
將isolinux下的vmlinuz以及initrd.img文件cp出來
然后在虛擬機配置中設定kernel以及initrd
在安裝完成之后,將kernel以及initrd內容取消,然后添加bootloader = /usr/bin/pygrub
#ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img" #kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" name="linux" vcpus=1 memory=128 disk=['file:/xen/vm2/dom2.img,xvda,w',] bootloader="/usr/bin/pygrub" #root="/dev/xvda2 ro" #extra="selinux=0 init=/sbin/init" vif=[ 'bridge=br0' ] on_crash="destroy" on_reboot="restart"安裝時要添加kernel 和 initrd
reset 重置窗口大小
Xen快速安裝
yum install centos-release-xen -y yum install xen -y yum update -yXen 總結:
pv:
? 啟動一個虛擬機實例,內核和initramfs文件可以放置在Dom0,也可由自己的文件系統提供
? 第一種:配置文件,由xm/xl等管理工具來提供的引導過程
kernel = ramdisk = root = extra =? 第二種:需要一個bootloader,pygrub
bootloader =xm基于某過程引導安裝過程:
? isolinux:
? vmlinuz
? initrd.img
note:一般在半虛擬化的環境中,一般使用url方式來安裝
在PV模式中運行guest系統,需要滿足幾個基本前提。
◇ 能運行于Xen DomU的(Xen-enabled)內核:Liunx 2.6.24及以后的內核已經添加了對Xen DomU的支持,因此,只要在內核編譯時啟用了相應的功能就能滿足此要求,目前多數Linux發行版的內核都已經支持此特性;而此前的版本需要內核在編譯前手動打補丁方可;
◇ 根文件系統(Root Filesystem):包含了應用程序、系統組件及配置文件等運行DomU的各種所需要文件的文件系統,其不用非得包含內核及對應的ramdisk,后面的這些組件放在Dom0中即可;事實上,用于DomU的內核文件必須要能夠允許Dom0訪問到,因為其運行時需要與Xen Hypervisor通信,因此,這些內核組件可以位于Dom0能夠訪問到的任何文件系統上;然而,目前基于pygrub(可用于Dom0跟非特權域磁盤映像中的內核通信),此內核文件也可以直接放置于非特權域的磁盤映像中;
◇ DomU內核所需要的內核模塊:內核模塊是內核的重要組成部分,它們一般存儲于根文件系統;
◇ ramdisk或者ramfs:這個根據實際需要是個可選組件,如果在內核初始化過程中不需要依賴于此來裝載額外的驅動程序以訪問根文件系統則也可以不用提供;
◇ swap設備:交換分區能夠讓Linux運行比僅有物理內存時更多的進程,因此,提供此組件是常見的做法;當然,它是可選的;
◇ DomU配置文件:集中在一起指定前述各組件的配置信息,以及定義其它有關PV DomU的基本屬性的文件;其通常包含所有用于當前DomU屬性配置參數,包括為其指定磁盤映像和內核文件的位置(或pygrub的位置)等,以及其它許多屬性如當前DomU可以訪問的設備等,這些設備包括網絡設備、硬盤、顯卡及其它PCI設備;同時,配置文件中也可以指定新創建的非特權域可以使用的物理內存大小及虛擬CPU個數等等;
這里需要提醒的是,如果計劃為PV DomU編譯內核,需要以與傳統方式不同的方式放置內核及其模塊。前面也已經提到,內核一般會放在Dom0的某路徑下,而內核模塊則需要放在DomU的根文件系統上。
PV DomU的根文件系統可以以多種不同的方式進行安置,比如:
◇ 虛擬磁盤映像文件
◇ Dom0沒有使用的額外物理磁盤分區
◇ Dom0沒有使用的邏輯卷
◇ 塊級別網絡文件系統,如iSCSI設備
◇ 網絡文件系統,如NFS
vfb:vnc或sd1,是一種c/s架構
安裝vnc server
yum install tigervnc-server啟動vnc server
vncserver :1VNC協議是明文的, 并不安全
vfb=[ 'vnc=1,vnclisten=0.0.0.0' ] 直接使用當前窗口打開另一個窗口 vfb=[ 'vnc1,sdl=1']幀緩沖:提供圖形化界面
磁盤映像管理工具qemu-img
查看某種format的格式選項
qemu-img create -f qcow2 -o ? /xen/vm/test.img qemu-img create -f qcow2 -o size=120G,preallocation=metadata /xen/vm/centos.qcow2鏡像格式
raw: the raw format is a plain binary image of the disc image, and is very portable.
追加磁盤大小
dd if=/dev/zero of=zeros.raw bs=1024k count=4096 cat foresight.img zeros.raw > new-foresight.imgcow: copy on write
qcow: 同cow都是歷史的棄嬰
qcow2: QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots.
性能接近raw, 支持快照, 支持AES加密, 支持zlib磁盤壓縮等
vmdk: vmware支持的虛擬化鏡像格式. OVF的同一封包. 性能和功能上來說vmdk都是目前比較出色的.
libvirt
virsh
virt-viewer: python開發, 顯示工具
virt-manager: python開發, 圖形化配置文件
virt-install: 自動創建映像文件, 命令行工具
Redhat在RHEL6中有意的將libvirt對xen的支持的部分沒有編譯
service libvirt strat之后, 會自動創建一個virbr0的虛擬網橋
virt-install -n "centos6.7" -r 512 --vcpus=2 =l http://192.168.48.130/cobbler/ks_mirror/centos-6.7-x86_64 -disk path=/xem/vm/test.img --network bridge=br0 --force磁盤和網絡熱插拔
xm block-attach centos6 file:/xen/vm1/test.qcow2 xvdb w掛起虛擬機
xm save centos /tmp/centos.save恢復虛擬機
xm restore /tmp/centos.save暫停在內存中
xm pause/unpause如果虛擬機被xend完全管理, 則可以使用suspend/resume
Xen實時遷移
grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#'
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address '')
(xend-relocation-hosts-allow '')
xm migrate [domu]KVM
KVM: Kernel-based Virutal Machine
Popek, Globerg.提出了經典虛擬化的三個條件
1 . 等價執行
2 . 性能良好
3 . 安全隔離
以色列Qumranet公司 2008年以后被Redhat收購
KVM僅僅是kernel上的一個模塊
類似寄存的方式, 將內核變成hypervisor.
I/O 通過qemu來模擬實現
note: KVM要求硬件必須支持HVM
加載KVM模塊
modprobe kvm modprobe kvm-intelqemu-kvm 專用于結合kvm使用的管理工具
模式: 內核模式, 用戶模式, 來賓模式
來賓模式: guest mode, 虛擬機上的用戶空間.
vCPU是通過線程來模擬實現CPU
KVM組件:
核心組件: /dev/kvm. 管理虛擬機的設備節點. 用戶控件的程序可通過isctl()系統調用來對虛擬機的創建啟動等管理工作. 1. 為虛擬機分配內存; 2 . 讀, 寫VCPU的寄存器. 3 .向vCPU注入中斷; 4 . 運行vCPU;
qemu組件: qemu進程, 工作于用戶空間的組件, 用于仿真PC機的I/O類硬件設備.
KVM必須使用HVM
egrep -i "vmx|svm" /proc/cpuinfoqemu-kvm
qemu-kvm的標準選項涉及指定主機類型, CPU模式, NUMA, 軟驅設備, 光驅設備以及硬件設備
◇ -name name:設定虛擬機名稱; ◇ -M machine:指定要模擬的主機類型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”獲取所支持的所有類型; ◇ -m megs:設定虛擬機的RAM大小; ◇ -cpu model:設定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”獲取所支持的所有模型; ◇ -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:設定模擬的SMP架構中CPU的個數等、每個CPU的核心數及CPU的socket數目等;PC機上最多可以模擬255顆CPU;maxcpus用于指定熱插入的CPU個數上限; ◇ -numa opts:指定模擬多節點的numa設備; ◇ -fda file ◇ -fdb file:使用指定文件(file)作為軟盤鏡像,file為/dev/fd0表示使用物理軟驅; ◇ -hda file ◇ -hdb file ◇ -hdc file ◇ -hdd file:使用指定file作為硬盤鏡像; ◇ -cdrom file:使用指定file作為CD-ROM鏡像,需要注意的是-cdrom和-hdc不能同時使用;將file指定為/dev/cdrom可以直接使用物理光驅; ◇ -drive option[,option[,option[,...]]]:定義一個新的硬盤設備;可用子選項有很多。 ? file=/path/to/somefile:硬件映像文件路徑; ? if=interface:指定硬盤設備所連接的接口類型,即控制器類型,如ide、scsi、sd、mtd、floppy、pflash及virtio等; ? index=index:設定同一種控制器類型中不同設備的索引號,即標識號; ? media=media:定義介質類型為硬盤(disk)還是光盤(cdrom); ? snapshot=snapshot:指定當前硬盤設備是否支持快照功能:on或off; ? cache=cache:定義如何使用物理機緩存來訪問塊數據,其可用值有none、writeback、unsafe和writethrough四個; ? format=format:指定映像文件的格式,具體格式可參見qemu-img命令; ◇ -boot [order=drives][,once=drives][,menu=on|off]:定義啟動設備的引導次序,每種設備使用一個字符表示;不同的架構所支持的設備及其表示字符不盡相同,在x86 PC架構上,a、b表示軟驅、c表示第一塊硬盤,d表示第一個光驅設備,n-p表示網絡適配器;默認為硬盤設備;eg.
qemu-kvm -name "rhel5.8" -m 512 -smp 2 -boot d -drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 -drive file=/isos/rhel-5.8.iso,index=1,media=cdrom -net nic,model=virtio,macaddr=52:54:00:A5:41:1E -vga cirrus -balloon virtio qemu-kvm -name "centos65" -m 512 -smp 2 -hda /images/vm/centos.qcow2 -cdrom CentOS-6.5-x86_64-bin-DVD1.iso -boot order=dc其他常用選項
動態遷移時用到的選項: -incoming tcp:0:PORT
讓qemu-kvm進程運行于后臺: -daemonize
開啟USB總線: -usb
? GuestOS為Windows時, -usb -usbdevice tablet, 用于實現鼠標定位
打開KVM的支持: -enable-kvm (qemu-kvm默認啟用此選項)
打開聲音設備: -soundhw
設定iscsi存儲設備: -iscsi 通過URL指定使用的iscsi設備 iscsi://<target_ip>/<target_iqn>/
? user=USERNAME, password=PASSWORD, initiator-name=iqn
qemu-kvm -iscsi initiator-name= -drive file=iscsi://tgt.example.com/1qn.2014-05.com.example.com.tgt1/1
指定使用bios文件: -bios /path/to/some_bios_program
使用外部內核及ramdisk文件. -kernel -initrd -append 向內核傳遞的參數
KVM虛擬網絡模型
NAT模型: 虛擬機實例的網卡都要虛擬成hypervisor上的虛擬網絡接口. -net, nic -net tap 指令hypervisor的對應關系. NAT模型中, 再在hypervisor創建一個虛擬橋, 并沒有綁定任何物理接口.
dnsmasq: 可以提供dns服務器以及dhcp服務器.為嵌入式平臺使用, 非常輕量級.
在虛擬網橋上創建SNAT規則
iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -j SNAT --to-source 192.168.48.131路由模型: 對虛擬網橋而言, 不做NAT轉換, 而是做路由功能.
隔離模型: hypervisor中的虛擬網橋并沒有綁定到任何一個接口上.
橋接模型: 將eth0(物理網卡作為交換機來使用), 通過橋接的方式來連接虛擬機和物理機.
多路橋接模型:
/etc/qemu-ifup
#!/bin/bash switch=virbr0 if [ -n "$1" ];thenifconfig $1 upsleep 0.5brctl addif $switch $1exit 0 elseecho "Error: no specified interface."exit 1 fi開啟虛擬機網橋
qemu-kvm -name "rhel5" -m 512 -smp 2 -drive file=/images/vm/centos.qcow2,if=virtio,index=0 -boot order=c -net nic,model=virtio -net tap,ifname=vnet0,downscript=noSDL: Simple DirectMedia Layer, C語言編寫的簡單的跨平臺的, 免費開源的多媒體程序庫. 操作系統硬件平臺的圖形,顯示, 聲音等.
VNC: Virtual Network Computing: 基于RFB
-vnc display的指定方式:
1 . host:N 172.16.100.7:1, 偵聽于5900+N的端口上
2 . unix: /path/to/socket_file
3 . none 不啟動桌面
? option: password, 連接時需要驗證密碼, 設定密碼通過monitor接口使用change
? reverse: 反向
? change vnc password
? -monitor stdio 在標準輸入輸出上顯示monitor界面, 相當于alt+ctrl+2
? Ctrl-a, c: 在console和monitor之間切換
? Ctrl-a, h: 顯示幫助信息
不做圖形顯示 -nographic
qemu-img
創建qcow2的磁盤鏡像文件
qemu-img create -f qcow2 -o size=20G,preallocation=metadata /images/vm2/test.qcow2增加其大小
qemu-img resize /images/vm2/test.qcow2 40G查看虛擬磁盤鏡像文件大小
qemu-img info /images/vm2/test.qcow2鏡像文件類型進行轉換
qemu-img convert -f qcow2 -O vmdk -o adapter_type=lsilogic test.qcow2 test.vmdk創建某一虛擬鏡像文件快照
qemu-img snapshot -c test-1.snmp test.qcow2查看快照
qemu-img snapshot -l test.qcow2應用快照
qemu-img snapshot -a test-1.snap test.qcow2刪除快照
qemu-img snapshot -d test-1.snap test.qcow2CirrOS
In a CirrOS image, the login account is cirros. The password is cubswin:)
qemu-kvm -name "cirros" -smp 2 -m 512 -drive file=/root/cirros-0.3.4-x86_64-disk.img,media=disk -net tap,ifname=vnet0,downscript=no -nographicctrl+a ^c
info cpus info status info tlb info vnc 使用info直接查看幫助文檔虛擬機遷移
保持CPU架構相同.
incoming的機制: 等待其他虛擬機實例遷移過來
hb: qemu-kvm -incoming tcp:0:6767 (0表示允許任意主機)
ha: monitor: migrate tcp:hb:6767
? -cpu host 可以將宿主機的cpu類型直接給虛擬機
virtio
通用于各種虛擬化技術的半虛擬化技術. linux內核從2.6.25起直接支持了virtio.通用框架, 提高io性能.
建議創建網絡設備和磁盤設備的時候都使用virtio.
Libvirt
工具棧實現虛擬機管理
安裝系統: virt-manager, virt-install
virsh不能安裝, 可以用于管理
virsh
yum -y install libvirt virt-manager virt-viewer python-virtinst查看幫助
virsh help iface-bridge添加網橋
virsh iface-bridge eth0 br0virsh可以運行在交互模式下
顯示子類的幫助, 比如只顯示虛擬機的管理子命令
vrish# help domain分組
domain: 虛擬機域
virt-install
使用pxe引導安裝虛擬機
virt-install -n "centos6" --vcpus 2 -r 512 -l http://192.168.48.130/cobbler/ks_mirror/centos-6.7-x86_64/ --disk /images/vm/centos6.qcow2,bus=virtio,size=120,sparse --network bridge=br0,model=virtio --nographics --forcedump已有的xml配置文件
virsh dumpxml centos >/etc/libvirt/qemu/cirros.xml創建cirros利用鏡像文件
virsh create /etc/libvirt/qemu/cirros.xml --consoleRHEL 虛擬化包組
Virtualization: qemu-kvm, qemu-guest-agent, qemu-kvm-tools
Virtualization Client: python-virtinst, virt-manager, virt-viewer, virt-top
Virtualization Platform: libvirt, libvirt-client, virt-who, virt-what
Virtualization Tools: libguestfs
ESXI
hypervisor自身包含一個dom0. 混合模式的I/O驅動模型.
各VMM對于I/O的驅動, 有三種模式:
1 . 自主VMM, VMM自行提供驅動 (幾乎不存在)
2 . 混合VMM, 借助于OS提供驅動.
? 依賴于外部OS(xen)
? 自我提供特權域(ESXI)
3 . 寄宿式的VMM:
I/O虛擬化模型:
1 . 純模擬的方式實現
2 . 半虛擬化
3 . 透傳: 直接是用實際的物理設備.
IOV, SR-IOV: 將一個物理硬件輪流分給多個虛擬機實例.
?
?
?
補充:
QEMU: 實現CPU跨平臺模擬
VMM: VM monitor
VM management: 虛擬機管理器
?
?
?
?
?
?
[root@centos6 ~]# tail master_key Start Time: 1456729243Timeout : 300 (sec)Verify return code: 19 (self signed certificate in certificate chain) --- <html><body><h1>It works!</h1></body></html> <<< TLS 1.2 Alert [length 0002], warning close_notify01 00 closed >>> TLS 1.2 Alert [length 0002], warning close_notify01 00?
?
?
posted on 2016-12-22 20:01?孫大喜 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/sundaxi/p/6212653.html
總結
- 上一篇: 首汽旗下「GoFun」:共享危机四伏,区
- 下一篇: zsh与oh-my-zsh ← 阳志平的