±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½éÉÜÁËKVMÐéÄ⻯¼Ü¹¹¡¢
CPUÐéÄ⻯¡¢ÄÚ´æÐéÄ⻯¡¢IOÉ豸ÐéÄ⻯µÈ·½ÃæÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚÖªºõ £¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
·þÎñÆ÷ÐéÄ⻯ÊÇÔÆ¼ÆËã×îºËÐĵļ¼Êõ£¬¶øKVMÊǵ±Ç°×îÖ÷Á÷µÄ¿ªÔ´µÄ·þÎñÆ÷ÐéÄ⻯¼¼Êõ¡£´ÓLinux2.6.20Æð£¬KVM×÷ΪÄں˵ÄÒ»¸öÄ£¿é
¼¯³Éµ½LinuxÖ÷Òª·¢Ðа汾ÖС£´Ó¼¼Êõ¼Ü¹¹£¨´úÂëÁ¿¡¢¹¦ÄÜÌØÐÔ¡¢µ÷¶È¹ÜÀí¡¢ÐÔÄܵȣ©¡¢ÉçÇø»îÔ¾¶È£¬ÒÔ¼°Ó¦Óù㷺¶ÈÀ´¿´£¬KVMÏÔÏÖ³öÃ÷ÏÔÓÅÊÆ£¬ÒÑÖð½¥Ìæ»»ÁíÒ»¿ªÔ´ÐéÄ⻯¼¼ÊõXen¡£ÔÚ¹«ÓÐÔÆÁìÓò£¬2017ÄêÖ®ºóAWS¡¢°¢ÀïÔÆ¡¢»ªÎªÔƵȳ§É̶¼Öð½¥´ÓXenתÏòKVM£¬¶øGoogle¡¢ÌÚÑ¶ÔÆ¡¢°Ù¶ÈÔÆµÈҲʹÓÃKVM¡£ÔÚ˽ÓÐÔÆÁìÓò£¬Ä¿Ç°VMware
ESXiÊÇÁìµ¼Õߣ¬Î¢ÈíHyper-V²»ÉÙÓ¦Óã¬Ëæ×Ź«ÓÐÔÆ³§É̲»¶ÏÍÆ½ø×¨ÓÐÔÆ/˽ÓÐÔÆ·½°¸£¬Î´À´KVMÓ¦ÓÃÒ²»áÖð½¥Ôö¼Ó¡£KVMĿǰÒÑÖ§³Öx86¡¢PowerPC¡¢S/390¡¢ARMµÈƽ̨¡£±¾ÎIJο¼¡¶KVMʵս£ºÔÀí¡¢½ø½×ÓëÐÔÄܵ÷ÓÅ¡·µÈ²ÄÁÏ£¬¼òÒªÊáÀí×ܽáKVMÔÚx86ƽ̨µÄ¹Ø¼ü¼¼ÊõÔÀí¡£
1. KVM ÐéÄ⻯¼Ü¹¹
1.1 Ö÷Á÷ÐéÄ⻯¼Ü¹¹
ͼ1¶Ô±ÈÁ˼¸ÖÖÖ÷Á÷ÐéÄ⻯¼¼Êõ¼Ü¹¹£ºESXi¡¢XenÓëKVM£¬ÆäÖ÷Òª²î±ðÔÚÓë¸÷×é¼þ£¨CPU¡¢ÄÚ´æ¡¢´ÅÅÌÓëÍøÂçIO£©µÄÐéÄ⻯Óëµ÷¶È¹ÜÀíʵÏÖ×é¼þÓÐËù²»Í¬¡£ÔÚESXiÖУ¬ËùÓÐÐéÄ⻯¹¦Äܶ¼ÔÚÄÚºËʵÏÖ¡£XenÄں˽öʵÏÖCPUÓëÄÚ´æÐéÄ⻯£¬
IOÐéÄ⻯Óëµ÷¶È¹ÜÀíÓÉDomain0£¨Ö÷»úÉÏÆô¶¯µÄµÚÒ»¸ö¹ÜÀíVM£©ÊµÏÖ¡£?KVMÄÚºËʵÏÖCPUÓëÄÚ´æÐéÄ⻯£¬QEMUʵÏÖIOÐéÄ⻯£¬Í¨¹ýLinux½ø³Ìµ÷¶ÈÆ÷ʵÏÖVM¹ÜÀí¡£

ͼ1£ºÐéÄ⻯¼Ü¹¹¶Ô±È
1.2 KVMÐéÄ⻯¼Ü¹¹
Èçͼ2£¬KVMÐéÄ⻯ÓÐÁ½¸öºËÐÄÄ£¿é£º
1£©KVMÄÚºËÄ£¿é£ºÖ÷Òª°üÀ¨KVMÐéÄ⻯ºËÐÄÄ£¿éKVM.ko£¬ÒÔ¼°Ó²¼þÏà¹ØµÄKVM_intel»òKVM_AMDÄ£¿é£»¸ºÔðCPUÓëÄÚ´æÐéÄ⻯£¬°üÀ¨VM´´½¨£¬ÄÚ´æ·ÖÅäÓë¹ÜÀí¡¢vCPUÖ´ÐÐģʽÇл»µÈ¡£
2£©QEMUÉ豸ģÄ⣺ʵÏÖIOÐéÄ⻯Óë¸÷É豸ģÄ⣨´ÅÅÌ¡¢Íø¿¨¡¢ÏÔ¿¨¡¢Éù¿¨µÈ£©£¬Í¨¹ýIOCTLϵͳµ÷ÓÃÓëKVMÄں˽»»¥¡£KVM½öÖ§³Ö»ùÓÚÓ²¼þ¸¨ÖúµÄÐéÄ⻯£¨ÈçIntel-VTÓëAMD-V£©£¬ÔÚÄں˼ÓÔØÊ±£¬KVMÏȳõʼ»¯ÄÚ²¿Êý¾Ý½á¹¹£¬´ò¿ªCPU¿ØÖƼĴæÆ÷CR4ÀïÃæµÄÐéÄ⻯ģʽ¿ª¹Ø£¬Ö´ÐÐVMXONÖ¸ÁHost
OSÉèÖÃΪrootģʽ£¬²¢´´½¨µÄÌØÊâÉ豸Îļþ/dev/kvmµÈ´ýÀ´×ÔÓû§¿Õ¼äµÄÃüÁȻºóÓÉKVMÄÚºËÓëQEMUÏ໥ÅäºÏʵÏÖVMµÄ¹ÜÀí¡£KVM»á¸´Óò¿·ÖLinuxÄں˵ÄÄÜÁ¦£¬Èç½ø³Ì¹ÜÀíµ÷¶È¡¢É豸Çý¶¯£¬ÄÚ´æ¹ÜÀíµÈ¡£

ͼ2£ºKVMÐéÄ⻯¼Ü¹¹
2. CPUÐéÄ⻯
2.1 pCPUÓëvCPU
Èçͼ3£¬ÎïÀí·þÎñÆ÷ÉÏͨ³£ÅäÖÃ2¸öÎïÀípCPU£¨Socket£©£¬Ã¿¸öCPUÓжà¸öºË£¨core£©£»¿ªÆô³¬Ïß³ÌHyper-Threading¼¼Êõºó£¬Ã¿¸öcoreÓÐ2¸öỊ̈߳¨Thread£©£»ÔÚÐéÄ⻯»·¾³ÖÐÒ»¸öThread¶ÔÓ¦Ò»¸övCPU¡£ÔÚKVMÖÐÿһ¸öVM¾ÍÊÇÒ»¸öÓû§¿Õ¼äµÄQEMU½ø³Ì£¬·ÖÅ䏸GuestµÄvCPU¾ÍÊǸýø³ÌÅÉÉúµÄÒ»¸öÏß³ÌThread£¬ÓÉLinuxÄں˶¯Ì¬µ÷¶Èµ½»ùÓÚʱ·Ö¸´ÓõÄÎïÀípCPUÉÏÔËÐС£KVMÖ§³ÖÉèÖÃCPUÇ׺ÍÐÔ£¬½«vCPU°ó¶¨µ½Ìض¨ÎïÀípCPU£¬Èçͨ¹ýlibvirtÇý¶¯Ö¸¶¨´ÓNUMA½ÚµãΪGuest·ÖÅävCPUÓëÄÚ´æ¡£KVMÖ§³ÖvCPU³¬·Ö£¨over-commit£©Ê¹µÃ·ÖÅ䏸GuestµÄvCPUÊýÁ¿³¬¹ýÎïÀíCPUÏß³Ì×ÜÁ¿¡£

ͼ3£ºpCPUÓëvCPU¹ØÏµ
2.2 ÐéÄ⻯ÀàÐͶԱÈ
Intel¶Ôx86 CPUÖ¸¶¨ÁË4ÖÖÌØÈ¨¼¶±ðRing0 - Ring3£¬ÆäÖÐRing 0ÊÇÄÚºË̬£¬ÔËÐÐOSÄںˣ¬È¨ÏÞ×î¸ß£¬¿ÉÖ´ÐÐÌØÈ¨»òÃô¸ÐÖ¸Á¶Ôϵͳ×ÊÔ´½øÐйÜÀíÓë·ÖÅäµÈ£»ring
3ȨÏÞ×îµÍ£¬ÔËÐÐÓû§Ó¦Óá£Èçͼ4£¬ESXiÊôÓÚÈ«ÐéÄ⻯£¬VMMÔËÐÐÔÚRing0ÍêÕûÄ£Äâµ×²ãÓ²¼þ£» GuestOSÔËÐÐÔÚring1£¬ÎÞÐèÈκÎÐ޸ļ´¿ÉÔËÐУ¬Ö´ÐÐÌØÈ¨Ö¸ÁîʱÐèҪͨ¹ýVMM½øÐÐÒì³£²¶»ñ¡¢¶þ½øÖÆ·ÒëBT£¨Binary
Translation£©ºÍÄ£ÄâÖ´ÐС£XenÖ§³ÖÈ«ÐéÄ⻯£¨HVM Guest£©Óë°ëÐéÄ⻯£¨PV Guest£©£»Ê¹ÓðëÐéÄ⻯ʱ£¬GuestOSÔËÐÐÔÚRing
0ÐèÒª½øÐÐÐ޸ģ¨Èç°²×°PV Driver£©£¬Í¨¹ýHypercallµ÷ÓÃVMM´¦ÀíÌØÈ¨Ö¸ÁÎÞÐèÒì³£²¶»ñÓëÄ£ÄâÖ´ÐС£
KVMÊÇÒÀÀµÓÚÓ²¼þ¸¨ÖúµÄÈ«ÐéÄ⻯£¨ÈçInter-VT¡¢AMD-V£©£¬Ä¿Ç°Ò²Í¨¹ývirtioÇý¶¯ÊµÏÖ°ëÐéÄ⻯ÒÔÌáÉýÐÔÄÜ¡£Inter-VTÒýÈëеÄÖ´ÐÐģʽ£ºVMMÔËÐÐÔÚVMX
Rootģʽ£¬ GuestOSÔËÐÐÔÚVMX Non-rootģʽ£¬Ö´ÐÐÌØÈ¨Ö¸ÁîʱÁ½ÖÖģʽ¿ÉÒÔÇл»¡£

ͼ4£ºx86 CPU ÌØÈ¨¼¶±ðÓëÐéÄ⻯·ÖÀà
2.3 KVM CPUÐéÄ⻯
KVMÖÐvCPUÔÚÈýÖÖģʽÏÂÖ´ÐУº
1£© ¿Í»§Ä£Ê½£¨Guest Mode£©ÔËÐÐGuestOS£¬Ö´ÐÐGuest·ÇIO²Ù×÷Ö¸Áî¡£
2£© Óû§Ä£Ê½£¨User Mode£©ÔËÐÐQEMU£¬ÊµÏÖIOÄ£ÄâÓë¹ÜÀí¡£
3£© ÄÚºËģʽ£¨Kernel Mode£©ÔËÐÐKVMÄںˣ¬ÊµÏÖģʽµÄÇл»£¨VM Exit/VM Entry£©£¬Ö´ÐÐÌØÈ¨ÓëÃô¸ÐÖ¸Áî¡£
Èçͼ5£¬KVMÄں˼ÓÔØÊ±Ö´ÐÐVMXONÖ¸Áî½øÈëVMX²Ù×÷ģʽ£¬VMM½øÈëVMX Rootģʽ£¬¿ÉÖ´ÐÐVMXOFFÖ¸ÁîÍ˳ö¡£GuestOSÖ´ÐÐÌØÈ¨»òÃô¸ÐÖ¸Áîʱ´¥·¢VM
Exit£¬ÏµÍ³¹ÒÆðGuestOS£¬Í¨¹ýVMCALLµ÷ÓÃVMMÇл»µ½RootģʽִÐУ¬VMExit¿ªÏúÊDZȽϴóµÄ¡£VMMÖ´ÐÐÍê³Éºó£¬¿ÉÖ´ÐÐVMLANCH»òVMRESUMEÖ¸Áî´¥·¢VM
EntryÇл»µ½Non-rootģʽ£¬ÏµÍ³×Ô¶¯¼ÓÔØGuestOSÔËÐС£
VMX¶¨ÒåÁËVMCS£¨Virtual Machine Control Structure£©Êý¾Ý½á¹¹À´¼Ç¼vCPUÏà¹ØµÄ¼Ä´æÆ÷ÄÚÈÝÓë¿ØÖÆÐÅÏ¢£¬·¢ÉúVMExit»òVMEntryʱÐèÒª²éѯºÍ¸üÐÂVMCS¡£VMMΪÿ¸övCPUά»¤Ò»¸öVMCS£¬´óС²»³¬¹ý4KB£¬´æ´¢ÔÚÄÚ´æÖÐVMCSÇøÓò£¬Í¨¹ýVMCSÖ¸Õë½øÐйÜÀí¡£VMCSÖ÷Òª°üÀ¨3²¿·ÖÐÅÏ¢£¬control
dataÖ÷Òª±£´æ´¥·¢Ä£Ê½Çл»µÄʼþ¼°ÔÒò£»Guest state ±£´æGuestÔËÐÐʱ״̬£¬ÔÚVM
Entryʱ¼ÓÔØ£»Host state±£´æVMMÔËÐÐʱ״̬£¬ÔÚVM Exitʱ¼ÓÔØ¡£Í¨¹ý¶ÁдVMCS½á¹¹¶ÔGuest½øÐпØÖÆ¡£

ͼ5£ºVMX Root/Non-Root ģʽÇл»
3. ÄÚ´æÐéÄ⻯
3.1 EPTÓëVPID
ÄÚ´æ´æ·ÅCPU½«ÒªÖ´ÐеÄÖ¸Áî»òÊý¾Ý£¬ÄÚ´æ´óСÓë·ÃÎÊЧÂʶÔϵͳÐÔÄÜÖÁ¹ØÖØÒª¡£ÄÚ´æÐéÄ⻯Ŀ±êÊDZ£ÕÏÄÚ´æ¿Õ¼äµÄºÏÀí·ÖÅä¡¢¹ÜÀí£¬¸ôÀ룬ÒÔ¼°¸ßЧ¿É¿¿µØÊ¹Óá£ÐèÒª½«GuestÏßÐÔÐéÄâÄÚ´æµØÖ·GVA£¨Guest
Virtual Address£©×ª»»ÎªHostÉϵÄÎïÀíÄÚ´æµØÖ·HPA£¨Host Virtual Address
£©¡£Ã»ÓÐÓ²¼þ¸¨ÖúÐéÄ⻯֮ǰ£¬VMMΪÿ¸öGuestά»¤Ò»·ÝÓ°×ÓÒ³±í£¨Shadow Page Table£©£¬Í¨¹ýÈí¼þά»¤GVAµ½HPAµÄÓ³É䣬ÓÉÓÚÄÚ´æ·ÃÎÊÓë¸üÐÂÆµ·±µ¼ÖÂÓ°×ÓÒ³±íµÄά»¤¸´ÔÓ£¬¿ªÏú½Ï´ó¡£
IntelÒýÈëÁËÓ²¼þ¸¨ÖúÄÚ´æÐéÄ⻯À©Õ¹Ò³±íEPT£¨Extend Page Table£©£¬AMD µÄÊÇǶÈëÒ³±íNPT£¨Nested
Page Table£©£¬×÷ΪCPUÄÚ´æ¹ÜÀíµ¥ÔªMMUµÄÀ©Õ¹£¬Í¨¹ýÓ²¼þÀ´ÊµÏÖGVA¡¢GPAµ½HPAµÄת»»¡£Èçͼ6£¬Ê×ÏÈGuestͨ¹ýCR3¼Ä´æÆ÷½«GVAת»»ÎªGPA£¬È»ºó²éѯEPT½«GPAת»»ÎªHPA¡£EPTµÄ¿ØÖÆÈ¨ÔÚVMMÉÏ£¬Ö»ÓÐCPU¹¤×÷ÔÚNon-Rootģʽʱ²Å²ÎÓë¸ÃÄÚ´æ×ª»»¡£ÒýÈëEPTºó£¬Guest¶ÁдCR3¼Ä´æÆ÷»òGuest
Page Fault£¬Ö´ÐÐINVLPGÖ¸ÁîµÈ²»»á´¥·¢VM Exit£¬Óɴ˽µµÍÁËÄÚ´æ×ª»»¸´ÔÓ¶È£¬ÌáÉýת»»Ð§ÂÊ¡£
ÁíÍ⣬CPUʹÓÃTLB£¨Translation Lookaside Buffer£©»º´æÏßÐÔÐéÄâµØÖ·µ½ÎïÀíµØÖ·µÄÓ³É䣬µØÖ·×ª»»Ê±CPUÏȸù¾ÝGPAÏȲéÕÒTLB£¬Èç¹ûδÕÒµ½Ó³ÉäµÄHPA£¬½«¸ù¾ÝÒ³±íÖеÄÓ³ÉäÌî³äTLB£¬ÔÙ½øÐеØÖ·×ª»»¡£²»Í¬GuestµÄvCPUÇл»Ö´ÐÐʱÐèҪˢÐÂTLB£¬Ó°ÏìÁËÄÚ´æ·ÃÎÊЧÂÊ¡£IntelÒýÈëÁËVPID£¨Virtual-Processor
Identifier£©¼¼ÊõÔÚÓ²¼þÉÏΪTLBÔö¼ÓÒ»¸ö±êÖ¾£¬Ã¿¸öTLB±íÏîÓëÒ»¸öVPID¹ØÁª£¬Î¨Ò»¶ÔÓ¦Ò»¸övCPU£¬µ±vCPUÇл»Ê±¿É¸ù¾ÝVPIDÕÒµ½²¢±£ÁôÒÑÓеÄTLB±íÏ¼õÉÙTLBˢС£

ͼ6£º»ùÓÚEPTµÄÄÚ´æµØÖ·×ª»»
3.2 ͸Ã÷´óÒ³THP
x86 CPUĬÈÏʹÓÃ4KBµÄÄÚ´æÒ³Ã棬ĿǰÒѾ֧³Ö2MB£¬1GBµÄÄÚ´æ´óÒ³£¨Huge Page£©¡£Ê¹ÓôóÒ³ÄÚ´æ¿É¼õÉÙÄÚ´æÒ³ÊýÓëÒ³±íÏîÊý£¬½ÚÊ¡ÁËÒ³±íËùÕ¼ÓõÄCPU»º´æ¿Õ¼ä£¬Í¬Ê±Ò²¼õÉÙÄÚ´æµØÖ·×ª»»´ÎÊý£¬ÒÔ¼°TLBʧЧºÍˢеĴÎÊý£¬´Ó¶øÌáÉýÄÚ´æÊ¹ÓÃЧÂÊÓëÐÔÄÜ¡£µ«Ê¹ÓÃÄÚ´æ´óÒ³Ò²ÓÐһЩ±×¶Ë£ºÈç´óÒ³±ØÐëÔÚʹÓÃǰ׼±¸ºÃ£»Ó¦ÓóÌÐò±ØÐëÏÔʽµØÊ¹ÓôóÒ³£¨Ò»°ãÊǵ÷ÓÃmmap¡¢shmget»òʹÓÃlibhugetlbfs¿â½øÐзâ×°£©£»ÐèÒª³¬¼¶Óû§È¨ÏÞÀ´¹ÒÔØhugetlbfsÎļþϵͳ£»Èç¹û´óÒ³ÄÚ´æÃ»ÓÐʵ¼ÊʹÓûáÔì³ÉÄÚ´æÀ˷ѵȡ£2009ÄêʵÏÖµÄ͸Ã÷´óÒ³THP£¨Transparent
Hugepage£©¼¼Êõ´´½¨ÁËÒ»¸ö³éÏó²ã£¬Äܹ»×Ô¶¯´´½¨¡¢¹ÜÀíºÍʹÓô«Í³´óÒ³£¬ÊµÏÖ·¢»Ó´óÒ³ÓÅÊÆÍ¬Ê±Ò²¹æ±ÜÒÔÉϱ׶ˡ£µ±Ç°Ö÷Á÷µÄLinux°æ±¾¶¼Ä¬ÈÏÖ§³Ö¡£KVMÖпÉÒÔÔÚHostºÍGuestÖÐͬʱʹÓÃTHB¼¼Êõ¡£
3.3 Äڴ泬·ÖOver-Commit
ÓÉÓÚGuestʹÓÃÄÚ´æÊ±²ÉÓÃÊÝ·ÖÅä°´ÐèÔö¼ÓµÄģʽ£¬KVMÖ§³ÖÄڴ泬·Ö£¨Over-Commit£©Ê¹µÃ·ÖÅ䏸GuestµÄÄÚ´æ×ÜÁ¿´óÓÚʵ¼ÊÎïÀíÄÚ´æ×ÜÁ¿£¬´Óϵͳ·ÃÎÊÐÔÄÜÓëÎȶ¨ÐÔ¿¼ÂÇ£¬ÔÚÉú²ú»·¾³ÖÐÒ»°ã²»½¨ÒéʹÓÃÄڴ泬·Ö¡£Äڴ泬·ÖÓÐÈýÖÖʵÏÖ·½Ê½£º
1£© ÄÚ´æ½»»»£¨Swapping£©£ºµ±ÏµÍ³ÄÚ´æ²»¹»ÓÃʱ£¬°Ñ²¿·Ö³¤Ê±¼äδ²Ù×÷µÄÄÚ´æ½»»»µ½´ÅÅÌÉÏÅäÖõÄSwap·ÖÇø£¬µÈÏà¹Ø³ÌÐòÐèÒªÔËÐÐʱÔÙ»Ö¸´µ½ÄÚ´æÖС£
2£© ÆøÇò£¨Ballooning£©£ºÍ¨¹ývirtio_balloonÇý¶¯ÊµÏÖ¶¯Ì¬µ÷ÕûGuestÓëHostµÄ¿ÉÓÃÄÚ´æ¿Õ¼ä¡£ÆøÇòÖеÄÄÚ´æÊÇHost¿ÉʹÓã¬Guest²»ÄÜʹÓᣵ±HostÄÚ´æ²»×ãʱ£¬¿ÉÒÔÊ¹ÆøÇòÅòÕÍ£¬´Ó¶ø»ØÊÕ²¿·ÖÒÑ·ÖÅ䏸GuestµÄÄÚ´æ¡£µ±GuestÄÚ´æ²»×ãʱ¿ÉÇëÇóѹËõÆøÇò£¬´ÓHostÉêÇë¸ü¶àÄÚ´æÊ¹Óá£
3£© Ò³¹²Ïí£¨Page Sharing£©£ºÍ¨¹ýKSM£¨Kernel Samepage Merging£©ÈÃÄÚºËɨÃèÕýÔÚÔËÐнø³ÌµÄÄÚ´æ¡£Èç¹û·¢ÏÖÍêÈ«ÏàͬµÄÄÚ´æÒ³¾Í»áºÏ²¢Îªµ¥Ò»ÄÚ´æÒ³£¬²¢±ê־λдʱ¸´ÖÆCOW£¨Copy
On Write£©¡£Èç¹ûÓнø³Ì³¢ÊÔÐ޸ĸÃÄÚ´æÒ³£¬½«¸´ÖÆÒ»¸öеÄÄÚ´æÒ³¹©ÆäʹÓá£KVMÖÐQEMUͨ¹ýmadviseϵͳµ÷ÓøæÖªÄÚºËÄÇЩÄÚ´æ¿ÉÒԺϲ¢£¬Í¨¹ýÅäÖÿª¹Ø¿ØÖÆÊÇ·ñÆóÒµKSM¹¦ÄÜ?¡£?Guest¾ÍÊÇQEMU½ø³Ì£¬Èç¹û¶à¸öGuestÔËÐÐÏàͬOS»òÓ¦Óã¬ÇÒ²»³£¸üУ¬Ê¹ÓÃKSMÄÜ´ó·ùÌáÉýÄÚ´æÊ¹ÓÃЧÂÊÓëÐÔÄÜ¡£µ±È»É¨ÃèºÍ¶Ô±ÈÄÚ´æÐèÒªÏûºÄCPU×ÊÔ´¶ÔÐÔÄÜ»áÓÐÒ»¶¨Ó°Ïì¡£
4. IOÉ豸ÐéÄ⻯
4.1 IOÉ豸ÐéÄ⻯¸ÅÊö
ÔÚÐéÄ⻯»·¾³ÖУ¬GuestµÄIO²Ù×÷ÐèÒª¾¹ýÌØÊâ´¦Àí²ÅÄÜÔڵײãIOÉ豸ÉÏÖ´ÐС£Èç±í1£¬KVMÖ§³Ö5ÖÖIOÐéÄ⻯¼¼Êõ¡£

±í1£ºÐéÄ⻯»·¾³IO´¦Àí·½Ê½¶Ô±È
4.2 É豸ģÄâÓëvirtioÇý¶¯
Èçͼ7£¬È«ÐéÄ⻯µÄÉ豸ģÄâÓë°ëÐéÄ⻯µÄvirtioÇý¶¯¶¼ÊÇͨ¹ýÈí¼þʵÏÖIOÐéÄ⻯¡£
É豸ģÄâ
KVMÖÐͨ¹ýQEMUÀ´Ä£ÄâÍø¿¨»ò´ÅÅÌÉ豸¡£Guest·¢ÆðIO²Ù×÷ʱ±»KVMµÄÄں˲¶»ñ£¬´¦Àíºó·¢Ë͵½IO¹²ÏíÒ³²¢Í¨ÖªQEMU£»QEMU»ñÈ¡IO½»¸øÓ²¼þÄ£Äâ´úÂëÄ£ÄâIO²Ù×÷£¬²¢·¢ËÍIOÇëÇ󵽵ײãÓ²¼þ´¦Àí£¬´¦Àí½á¹û·µ»Øµ½IO¹²ÏíÒ³£»È»ºó֪ͨIO²¶»ñ´úÂ룬¶ÁÈ¡½á¹û²¢·µ»Øµ½GuestÖС£
VirtioÇý¶¯
ÔÚGuestÖв¿Êðvirtioǰ¶ËÇý¶¯£¬Èçvirtio-net¡¢virtio-blk¡¢virtio_pci¡¢virtio_balloon¡¢virtio_scsi¡¢virtio_consoleµÈ£¬È»ºóÔÚQEMUÖв¿Êð¶ÔÓ¦µÄºó¶ËÇý¶¯£¬Ç°ºó¶ËÖ®¼ä¶¨ÒåÁËÐéÄâ»·Ðλº³åÇø¶ÓÁÐvirtio-ring£¬ÓÃÓÚ±£´æIOÇëÇóÓëÖ´ÐÐÐÅÏ¢¡£GuestµÄIO´Óǰ¶ËÇý¶¯·¢Ë͵½virtio-ring£¬È»ºóºó¶ËÇý¶¯»òÈ¥IO²¢×ª·¢µ½µ×²ãÉ豸´¦Àí£¬´¦ÀíÍêºó·µ»Ø½á¹û¡£Ä¿Ç°Ö÷Á÷µÄLinuxÓëwindows¶¼Ö§³Övirtio£¬ÒÔ»ñµÃ¸üºÃµÄIOÐÔÄÜ¡£

ͼ7£º»ùÓÚÈí¼þµÄIOÐéÄ⻯
vhost-netÓëvhost-user
virtioÖкó¶ËÇý¶¯ÓÉÓû§¿Õ¼äµÄQEMUÌṩ£¬µ«ÍøÂçÐÒéÕ»´¦ÓÚÄÚºËÖУ¬Èç¹ûͨ¹ýÄں˿ռäÀ´´¦ÀíÍøÂçIO£¬¿ÉÒÔ¼õÉÙÁËÍøÂçIO´¦Àí¹ý³ÌÖеĶà´ÎÉÏÏÂÎÄÇл»£¬´Ó¶øÌá¸ßÍøÂçÍÌÍÂÁ¿ÓëÐÔÄÜ¡£ËùÒÔ£¬ÐµÄÄÚºËÖÐÌṩvhost-netÇý¶¯£¬Ê¹Ç°¶ËÍøÂçÇý¶¯virtio-netµÄºó¶Ë´¦ÀíÈÎÎñ´ÓÓû§Ì¬µÄQEMU¸Äµ½HostÄں˿ռäÖ´ÐС£
´ó¹æÄ£ÔƼÆËã»·¾³ÖлáʹÓÃOVS£¨Open vSwitch£©»òSDN·½°¸£¬¶ø½ø³ÌÔËÐÐÔÚÓû§Ì¬£¬Èç¹û¼ÌÐøÓÃʹÓÃÄÚºË̬µÄvhost-net£¬ÒÀÈ»´æÔÚ´óÁ¿Óû§Ì¬ÓëÄÚºË̬µÄÇл»£¬ËùÒÔÒýÈëÁËvhost-user£¨ÄÚºË̬vhost¹¦ÄÜÔÚÓû§Ì¬ÊµÏÖ£©¡£vhost-user¶¨ÒåÁËMaster£¨QEMU½ø³Ì£©ºÍslave£¨OVS½ø³Ì£©×÷ΪͨÐÅÁ½¶Ë£¬MasterÓëslaveÖ®¼ä¿ØÖÆÃæÍ¨¹ý¹²ÏíµÄÐéÄâ¶ÓÁÐvirtqueure½»»»¿ØÖÆÂß¼£¬Êý¾ÝÃæÍ¨¹ý¹²ÏíÄÚ´æ½»»»ÐÅÏ¢¡£½áºÏvhost-user¡¢vSwitchÓëDPDK¿ÉÒÔÔÚÓû§Ì¬Íê³ÉÍøÂçÊý¾Ý°ü½»»»´¦Àí£¬´Ó¶ø´ó·ùÌáÉýÁËÍøÂçÐéÄ⻯ÐÔÄÜ¡£
4.3 É豸ֱͨÓë¹²Ïí
ͨ¹ýÈí¼þ·½Ê½ÊµÏÖIOÐéÄ⻯´æÔÚÒ»¶¨ÏµÍ³¿ªÏúÓëÐÔÄÜËðºÄ£¬ËùÒÔIntelÍÆ³öÁËÓ²¼þ¸¨ÖúÐéÄ⻯¼¼Êõ£¨AMD-VÀàËÆ£©¡£

±í2£ºIntel Ó²¼þ¸¨ÖúÐéÄ⻯¼¼Êõ
É豸ֱͨPCI Pass-through
»ùÓÚÓ²¼þ¸¨ÖúÐéÄ⻯¼¼Êõ£¬KVMÖ§³Ö½«HostµÄPCI/PCI-EÎïÀíÉ豸£¨ÈçÍø¿¨¡¢´ÅÅÌ¡¢USB¡¢ÏÔ¿¨¡¢GPUµÈ£©Ö±½Ó·ÖÅ䏸GuestʹÓá£GuestµÄ¶Ô¸ÃÉ豸µÄIO²Ù×÷ÓëÎïÀíÉ豸һÑù£¬²»¾¹ýQEMU/KVM´¦Àí¡£Ö±Í¨É豸²»Äܹ²Ïí¸ø¶à¸öGuestʹÓã¬ÇÒ²»ÄÜËæGuest½øÐж¯Ì¬Ç¨ÒÆ£¬ÐèҪͨ¹ýÈȲå°Î»òlibvirt¹¤¾ßÀ´½â¾ö¡£
É豸¹²ÏíSR-IOV
ΪÁËʵÏÖ¶à¸öGuest¿ÉÒÔ¹²Ïíͬһ¸öÎïÀíÉ豸£¬PCI-SIG·¢²¼ÁËSR-IOV£¨Single Root-IO
Virtualization£©±ê×¼£¬ÈÃÒ»¸öÎïÀíÉ豸֧³Ö¶à¸öÐéÄ⹦Äܽӿڣ¬¿ÉÒÔ¶ÀÁ¢·ÖÅ䏸²»Í¬µÄGuestʹÓá£SR-IOV¶¨ÒåÁËÁ½¸ö¹¦ÄÜ£º
1£© ÎïÀí¹¦ÄÜPF£¨Physical Function£©£ºÓµÓÐÎïÀíPCI-eÉ豸µÄÍêÕû¹¦ÄÜ£¬¿É¶ÀÁ¢Ê¹Óã»ÒÔ¼°SR-IOVÀ©Õ¹ÄÜÁ¦£¬¿ÉÅäÖùÜÀíVF¡£
2£© ÐéÄ⹦ÄÜVF£¨Virtual Function£©£ºÓÉPFÑÜÉúµÄÇáÁ¿¼¶PCI-e¹¦ÄÜ£¬°üÀ¨Êý¾Ý´«Ë͵ıØÒª×ÊÔ´¡£²»Í¬µÄVF¿ÉÒÔ·ÖÅ䏸²»Í¬µÄGuest£¬SR-IOVΪGuest¶ÀÁ¢Ê¹ÓÃVFÌṩÁ˶ÀÁ¢µÄÄÚ´æ¡¢ÖжÏÓëDMAÁ÷£¬Êý¾Ý´«Êä¹ý³ÌÎÞÐèVMM½éÈë¡£
DPDK/SPDK
ΪÁ˸üºÃµØÌáÉýÐéÄâ»¯ÍøÂç»ò´ÅÅÌIOÐÔÄÜ£¬IntelµÈ¹«Ë¾ÍƳöÁËÊý¾ÝÆ½Ãæ¿ª·¢¹¤¾ß¼¯DPDK£¨Data
Plance Development Kit£©Óë´æ´¢ÐÔÄÜ¿ª·¢¹¤¾ß¼¯SPDK£¨Storage Performace
Development Kit£©¡£DPDK¡¢vhost-user¡¢OVS½áºÏʹÓ㬿ÉÌø¹ýLinuxÄںˣ¬Ö±½ÓÔÚÓû§Ì¬Íê³ÉÍøÂçÊý¾Ý°ü½»»»´¦Àí¡£SPDKͨ¹ý»·¾³³éÏó²ãEALÓëUIO½«´æ´¢Çý¶¯·ÅÔÚÓû§Ì¬´¦Àí£¬Í¬Ê±Í¨¹ýPMDÂÖѯ»úÖÆ´úÌæ´«Í³ÖжÏģʽÀ´´¦ÀíIO¡£DPDKÓëSPDK´ó·ùËõ¶ÌÁËIO´¦Àí·¾¶Óëϵͳ¿ªÏú£¬
IOÐÔÄÜÌáÉý·Ç³£Ã÷ÏÔ¡£DPDKÓëSPDKÏêÇé²Î¿¼ÔÆÍøÂç½éÉÜÓëÔÆ´æ´¢½éÉܲ¿·Ö¡£
4.4 ÆäËûIOÉè±¸ÌØÐÔ
ͼÏñÓëÉùÒô
QEMUÖжÔGuestµÄͼÏñÏÔʾĬÈÏʹÓÃSDL£¨Simple DirectMedia Layer£©ÊµÏÖ¡£SDLÊÇÒ»¸ö»ùÓÚCÓïÑԵġ¢¿çƽ̨µÄ£¬¿ªÔ´µÄ¶àýÌå³ÌÐò¿â£¬ÌṩÁ˼òµ¥µÄ½Ó¿ÚÓÃÓÚ²Ù×÷Ó²¼þƽ̨µÄͼÐÎÏÔʾ¡¢ÉùÒô¡¢ÊäÈëÉ豸µÈ£¬¹ã·ºÓ¦ÓÃÓÚ¸÷ÖÖ²Ù×÷ϵͳ¡£Í¬Ê±ÔÚÐéÄ⻯»·¾³ÖÐÒ²¹ã·ºÊ¹ÓÃÐéÄâÍøÂç¿ØÖÆÌ¨VNC£¨Virtual
Network Computing£©£¬²ÉÓÃRFB£¨Remote Frame Buffer£©ÐÒ齫¿Í»§¶Ë£¨ä¯ÀÀÆ÷»òVNC
Viewer£©µÄ¼üÅÌÓëÊó±êÊäÈë´«µÝµ½Ô¶³Ì·þÎñ¶ËVNC ServerÖУ¬²¢·µ»ØÊä³ö½á¹û¡£VNC²»ÒÀÀµ²Ù×÷ϵͳ£¬ÔÚVNC´°¿Ú¶Ï¿ªºó£¬ÒÑ·¢³ö²Ù×÷ÈÔÈ»»áÔÚ·þÎñ¶Ë¼ÌÐøÖ´ÐС£ÓÉÓÚVNCÊÇGPLÊÚȨ£¬ÑÜÉú³ö¶à¸ö°æ±¾RealVNC¡¢TightVNCÓëUltraVNC£¬Æä¶Ô±ÈÈç±í3¡£

±í3£ºVNC°æ±¾¶Ô±È
ÈȲå°ÎHot Plugging
ÈȲå°Î¾ÍÊÇÔÚ·þÎñÆ÷ÔËÐÐʱ²åÉÏ»ò°Î³öÓ²¼þ£¬ÒÔ±£ÕÏ·þÎñÆ÷µÄÀ©Õ¹ÐÔÓëÁé»îÐÔ¡£ÈȲå°ÎÐèÒª×ÜÏßµçÆøÌØÐÔ¡¢Ö÷°åBIOS¡¢²Ù×÷ϵͳÒÔ¼°É豸Çý¶¯µÄÖ§³Ö¡£Ä¿Ç°Ö§·þÎñÆ÷³ÖÓ²ÅÌ¡¢CPU¡¢ÄÚ´æ¡¢Íø¿¨¡¢USBÉ豸Óë·çÉȵȲ¿¼þÈȲå°Î¡£ÔÚKVMÖÐÔÚGuest²»¹Ø»úÇé¿öÏÂÖ§³ÖPCIÉ豸£¨ÈçÄ£Äâ¡¢°ëÐéÄ⻯»òֱͨµÄÍø¿¨¡¢Ó²ÅÌ¡¢USBÉ豸£©¡£CPUºÍÄÚ´æÈȲå°ÎÓ²¼þƽ̨ºÍOS²ãÃæµÄÏÞÖÆ»¹±È½Ï¶à¡£ |