Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
KVM ÐéÄ⻯Ïê½â
 
×÷ÕߣºÔÆÆðABC
  2920  次浏览      29
 2020-8-14  
 
±à¼­ÍƼö:
ÎÄÕÂÖ÷Òª½éÉÜÁË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²ãÃæµÄÏÞÖÆ»¹±È½Ï¶à¡£

   
2920 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
ÔÆÔ­Éú¼Ü¹¹¸ÅÊö
K8S¸ß¿ÉÓü¯Èº¼Ü¹¹ÊµÏÖ
ÈÝÆ÷ÔÆ¹ÜÀíÖ®K8S¼¯Èº¸ÅÊö
k8s-ÕûÌå¸ÅÊöºÍ¼Ü¹¹
Ê®·ÖÖÓѧ»áÓÃdocker²¿Êð΢·þÎñ
×îпγÌ
ÔÆ¼ÆË㡢΢·þÎñÓë·Ö²¼Ê½¼Ü¹¹
Æóҵ˽ÓÐÔÆÔ­ÀíÓë¹¹½¨
»ùÓÚKubernetesµÄDevOpsʵ¼ù
ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦Ó㨰¢ÀïÔÆ£©
Docker²¿Êð±»²âϵͳÓë×Ô¶¯»¯¿ò¼Üʵ¼ù
³É¹¦°¸Àý
±±¾© ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ùÅàѵ
ij¾ü¹¤Ñо¿µ¥Î» MDA£¨Ä£ÐÍÇý¶¯¼Ü¹¹£©
ÖªÃûÏû·Ñ½ðÈÚ¹«Ë¾ ÁìÓòÇý¶¯Éè¼Æ
ÉîÛÚijÆû³µÆóÒµ Ä£ÐÍÇý¶¯µÄ·ÖÎöÉè¼Æ