±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚinfoq£¬SR-IOV
¼¼ÊõÊÇÒ»ÖÖ»ùÓÚÓ²¼þµÄÐéÄ⻯½â¾ö·½°¸£¬¿ÉÌá¸ßÍøÂçÐÔÄܺͿÉÉìËõÐÔ¡£ |
|

1. SR-IOV ½éÉÜ
SR-IOV ±ê×¼ÔÊÐíÔÚÐéÄâ»úÖ®¼ä¸ßЧ¹²Ïí PCIe£¨Peripheral
Component Interconnect Express£¬¿ìËÙÍâÉè×é¼þ»¥Á¬£©É豸£¬²¢ÇÒËüÊÇÔÚÓ²¼þÖÐʵÏֵģ¬¿ÉÒÔ»ñµÃÄܹ»Óë±¾»úÐÔÄÜæÇÃÀµÄ
I/O ÐÔÄÜ¡£SR-IOV ¹æ·¶¶¨ÒåÁËеıê×¼£¬¸ù¾Ý¸Ã±ê×¼£¬´´½¨µÄÐÂÉ豸¿ÉÔÊÐí½«ÐéÄâ»úÖ±½ÓÁ¬½Óµ½ I/O
É豸¡£
µ¥¸ö I/O ×ÊÔ´¿ÉÓÉÐí¶àÐéÄâ»ú¹²Ïí¡£¹²ÏíµÄÉ豸½«ÌṩרÓõÄ×ÊÔ´£¬²¢ÇÒ»¹Ê¹Óù²ÏíµÄͨÓÃ×ÊÔ´¡£ÕâÑù£¬Ã¿¸öÐéÄâ»ú¶¼¿É·ÃÎÊΨһµÄ×ÊÔ´¡£Òò´Ë£¬ÆôÓÃÁË
SR-IOV ²¢ÇÒ¾ßÓÐÊʵ±µÄÓ²¼þºÍ OS Ö§³ÖµÄ PCIe É豸£¨ÀýÈçÒÔÌ«Íø¶Ë¿Ú£©¿ÉÒÔÏÔʾΪ¶à¸öµ¥¶ÀµÄÎïÀíÉ豸£¬Ã¿¸ö¶¼¾ßÓÐ×Ô¼ºµÄ
PCIe ÅäÖÿռ䡣
ÏÂͼչʾÁËÕë¶Ô PCIe Ó²¼þµÄ SR-IOV ¼¼ÊõÌåϵʾÒâͼ¡£

ͼ 1 SR-IOV ¼¼ÊõÌåϵ¼Ü¹¹
Ö§³Ö SR-IOV µÄÍø¿¨Ö÷Òª¹¦ÄÜÄ£¿é·ÖΪ£º
ÎïÀí¹¦ÄÜ (Physical Function, PF)
Ö§³Ö SR-IOV µÄ¹ÜÀí¡£¿ÉÒÔ´´½¨ VF£¬¶ÔÓÚÍø¿¨£¬ÀíÂÛÉÏ¿ÉÒÔ´´½¨ 256 ¸ö VF¡£Ò»°ãÇé¿öÏ£¬
ǧÕ×Íø¿¨ÄÜÖ§³Ö´ï 7 ¸ö VF£¬ ÍòÕ×Íø¿¨ÄÜÖ§³Ö´ï 63 ¸ö VF¡£
ÐéÄ⹦ÄÜ (Virtual Function, VF)
VF ¿ÉÒÔÀí½âΪһ¸öÐéÄâÍø¿¨£¬ÓµÓжÀÁ¢ÄÚ´æ¿Õ¼ä¡¢ÖÐ¶ÏºÍ Direct Memory Access (DMA)
Á÷¡£VF ÊÇ PF ÐéÄâ³öµÄÒ»¸öʵÀý£¬ÒÔÒ»¸ö¶ÀÁ¢µÄÍø¿¨ÐÎʽչÏÖ¡£VF ÊÇÒ»ÖÖÇáÁ¿¼¶ PCIe ¹¦ÄÜ£¬¿ÉÒÔÓë
PF ÒÔ¼°Æä´´½¨µÄËùÓÐ VF ¹²ÏíÒ»¸ö»ò¶à¸öÎïÀí×ÊÔ´¡£
½»»»¹¦ÄÜ (Layer 2 Classifier/Sorter switch)
Õâ¸ö½»»»»úÆäʵÊÇÎïÀíÍø¿¨ÄÚÖõġ£Á÷Á¿½øÈëÎïÀíÍø¿¨ºó£¬¾¹ýÕâ¸ö½»»»»úÈ»ºó·Ö·¢µ½²»Í¬µÄ VF ÉÏ¡£
ʹÓà SR-IOV ¼¼ÊõµÄÖ÷ÒªÓŵãÊÇ£º
Ìá¸ßÐéÄâ»ú°üת·¢Ð§ÂÊ
¼õÉÙ±¨ÎÄÔÚÖ÷»úÄÚ²¿µÄ´«ÊäÑÓʱÒÔ¼°ÑÓʱ¶¶¶¯
ÓÉÓÚÈÆ¹ýÁËÖ÷»úµÄÐÒéÕ»ÒÔ¼° VMM£¨Virtual Machine Manager£©£¬¼õÉÙÁËÖ÷»úÔÚÍøÂ籨ÎÄÊÕ·¢ÖеÄ×ÊÔ´ÏûºÄ
ͬʱ£¬ÓÉÓÚ SR-IOV ¼¼ÊõʹÐéÄâ»úͨ¹ý PCI-passthrough µÄ·½Ê½Ö±½ÓʹÓà VF£¬ÈƹýÁËÖ÷»úµÄÄÚºËÐÒéÕ»ÒÔ¼°
VMM£¬¹Ê´æÔÚÒÔϾÖÏÞ£º
Host ÎÞ·¨¼à¿Ø VF µÄ״̬
°²È«×éÎÞ·¨Ó¦ÓÃ
ÐéÄâ»úÈÈÇ¨ÒÆÎÞ·¨ÊµÏÖ£¬Ç¨ÒƵÄÖ§³ÖÄÜÁ¦²»¹»Áé»î
¶Ô HA µÄÖ§³Ö²»Ì«¸ß
sriov ²»Ö§³Ö vxlan
2. SR-IOV ÐÔÄÜ
±¾²âÊԶԱȲâÊÔÍòÕ×ÍøÂçÖÐ SRIOV ÐéÄâ»úºÍ OVS ÐéÄâ»úÔÚÍøÂç¸ºÔØ½Ï¸ßÇé¿öϵÄÐéÄâÍøÂç±íÏÖ£¬×ܽá·ÖÎö£¬Í¬Ê±ÎªÒÔºó
SRIOV ÐéÄâ»úºÍÆäËüÀàÐ͵ÄÐéÄâ»ú×ö¶Ô±È¸ø³ö²Î¿¼¡£
2.1 ²âÊÔÐÔÄÜÖ¸±ê
Ö÷Òª¶ÔÒÔϼ¸¸öÍøÂçÐÔÄÜÖ¸±ê½øÐвâÊÔ£º
¸ºÔØ£¨OfferedLoad£©£ºÍøÂçÁ÷Á¿¸ººÉ°Ù·Ö±È£¬µ±Ç°Á÷Á¿Õ¼¶Ë¿ÚËÙÂʵıÈÀý£¨°Ù·Ö±È£©
°üËÙ£¨Frame Per-second£©£ºÊý¾Ý°üÿÃëµÄÊÕ / ·¢¸öÊý
ƽ¾ùʱÑÓ£¨Average Latency£©£ºÊý¾Ý°ü´«ÊäµÄƽ¾ùÑÓ³Ù£¨ºÁÃ룬ms£©
2.2 ²âÊÔÍØÆËͼ
SR-IOV ²âÊÔ»·¾³ÍøÂçÍØÆË£º

Openvswitch ²âÊÔ»·¾³ÍøÂçÍØÆË£º

2.3 ²âÊÔ½á¹û









¿ÉÒÔ¿´³ö SR-IOV ¸÷·½ÃæÐÔÄܶ¼ÒªÓÅÓÚ Openvswitch¡£
3. SR-IOV ¸ß¿ÉÓ÷½°¸
ÒòΪ²ÉÓà SR-IOV£¬ÐéÄâ»úÁ÷Á¿²»¾¹ýËÞÖ÷»ú²Ù×÷ϵͳ£¬ËùÒÔ²»ÄÜÔÚËÞÖ÷»ú²Ù×÷ϵͳ²ãÃæ×ö¸ß¿ÉÓ㬱ØÐëÔÚÐéÄâ»úÄÚ²¿×ö¸ß¿ÉÓá£SR-IOV
¸ß¿ÉÓ÷½°¸ÈçÏÂͼ£º

£¨1£© vm ¹ÒÔØ²»Í¬ pf µÄ vf£¬ÔÚ vm ÄÚ²¿ÅäÖÃÍø¿¨ bond£¬¿ÉÒÔ¸ù¾ÝÐèÇóÑ¡Ôñ balance-rr¡¢active-backup
»òÕß balance-xor ²ßÂÔ¡£
£¨2£© vm ¹ÒÔØµÄ vf µÄ mac µØÖ·±ØÐëÉèÖóÉÒ»Ñù¡£ÕâÑùÔÚÐéÄâ»úÅäÖÃÍø¿¨ bond µÄÇé¿öÏ£¬ÈÔÈ»¿ÉÒÔʹÓÃ
vf µÄ mac spoofing check ¹¦ÄÜ¡£
£¨3£© pf ÅäÖà lacp bond£¬½»»»»ú²àÅäÖö¯Ì¬Á´Â·¾ÛºÏ£¬ÊµÏ־ۺϴø¿íµÄ¶¯Ì¬µ÷Õû¡£
4. OpenStack ´´½¨ SR-IOV ÐéÄâ»ú¹ý³Ì
Openstack ĬÈϲ»Ö§³Ö SR-IOV µÄ¸ß¿ÉÓã¬neutron ÖÐÒ»¸öÂß¼µÄ port ¶ÔÓ¦Ò»¸ö
vf ¿Ú¡£ËùÒÔÎÒÃÇÐèÒª¶Ô openstack ½øÐиÄÔ죬×ÜÌå˼·ÊÇ£¬Í¨¹ýÔÚµ÷Óà Neutron Create
Port µÄ api ʱºò£¬¶Ô Port ´òÉÏ bond ±êÇ©£¬Nova ÔÚ´´½¨Ðé»úµÄʱºòͨ¹ý¶ÁÈ¡µ½¶ÔÓ¦
port µÄ bond ±êÇ©£¬Îª¸Ã port ·ÖÅäÁ½¸ö VF ¿Ú£¬²¢ÇÒÔÚ·ÖÅä VF ¿ÚµÄ pci ×ÊÔ´µÄʱºò£¬Ä¬ÈϵİÑÁ½¸ö
vf ·ÖÅäÔÚ²»Í¬µÄ pf ÉÏ¡£¶ÔÓ¦ÔÚ port µÄ binding:profile ÉÏÐèҪչʾʹÓõÄÁ½¸ö
vf ¿ÚµÄ pci ÐÅÏ¢¡£
4.1 µ÷Óà neutron api ´´½¨ sriov µÄ port
µ÷Óà neutron ½Ó¿Ú´´½¨ sriov port£¬ÔÚ profile ÖÐ¶Ô Port ´òÉÏ bond
±êÇ©£¬ÕâÀïÎÞÐè׸Êö¡£ÃüÁîÈçÏ£º
neutron port-create
--binding:vnic_type =direct --binding:profile
type=dict bond =true
|
4.2 µ÷Óà nova api ´´½¨ÐéÄâ»ú
Èë¿ÚΪ nova/api/openstack/compute/servers µÄ create ·½·¨£¬¼ì²éһϵÁвÎÊýºÍ
policy£¬È»ºóµ÷Óà compute_api µÄ create ·½·¨:

compute_api ÊÇ nova/compute/api.py Ä£¿é£¬ÔÚ¸ÃÎļþÖÐÕÒµ½ create
·½·¨£¬¸Ã·½·¨½Ó×ŵ÷Óà _create_instance ·½·¨£¬ÔÚ _create_instance
·½·¨Öе÷Óà _validate_and_build_base_options ·½·¨¶ÔËùÓеÄÊäÈë²ÎÊýºÍ²ßÂÔ×ö¼ì²é£¬²¢ÇÒ·â×°
pci ÇëÇó¡£·â×° pci ÇëÇóµÄ·½·¨ÊÇ nova/network/neutronv2/api.py
µÄ create_pci_requests_for_sriov_ports ·½·¨£¬¸Ã·½·¨»áÏȵ÷Óà neutron
api »ñÈ¡ port µÄ vnic_type¡¢phynet_name¡¢bond ÊôÐÔ£¬¸ù¾Ý bond
ÊôÐÔÈ·¶¨ vf µÄÊýÁ¿£¨bond Ϊ true£¬vf µÄÊýÁ¿ÊÇ 2£¬·ñÔò vf ÊýÁ¿ÊÇ 1£©¡£

·µ»Øµ½ nova/compute/api.py µÄ _create_instance ·½·¨£¬¸Ã·½·¨½Ó×ŵ÷ÓÃ
compute_task_api µÄ schedule_and_build_instances ·½·¨:

compute_task_api ÊÇ nova/conductor/api.py Ä£¿é¡£ÕâÀïûÓÐÖ´ÐÐʲô²Ù×÷£¬Ö±½Óµ÷ÓÃÁË
conductor_compute_rpcapi µÄ schedule_and_build_instances
·½·¨:

¸Ã·½·¨Ô¶³Ì¹ý³Ìµ÷Óà api£¬¼´ nova/conductor/rpcapi.py Ä£¿é£¬¸Ã·½·¨»á¶Ô°æ±¾½øÐмì²é£¬È»ºóµ÷ÓÃ
RPC:

cast ±íʾÒì²½µ÷Óã¬schedule_and_build_instances ÊÇÔ¶³Ìµ÷Óõķ½·¨£¬kw
ÊÇ´«µÝµÄ²ÎÊý¡£ÏÖÔÚ nova-api ÈÎÎñÍê³É£¬´Ëʱ»áÏìÓ¦Óû§ÇëÇó£¬ÐéÄâ»ú״̬Ϊ building¡£
4.3 nova conductor
nova-api Ïò nova-conductor ·¢Æð RPC µ÷Ó㬽ø³ÌÌøµ½ nova-conductor
·þÎñ£¬Èë¿ÚΪ nova/conductor/manager.py µÄ schedule_and_build_instances
·½·¨£¬¸Ã·½·¨Ê×Ïȵ÷ÓÃÁË _schedule_instances ·½·¨£¬ÔÚ _schedule_instances
·½·¨Öе÷ÓÃÁË scheduler_client µÄ select_destinations ·½·¨:

Õâ¸ö·½·¨×îÖÕµ÷Óõ½ nova/scheduler/client/query.py Ï嵀 select_destinations
·½·¨£¬Ö´ÐÐ RPC µÄµ÷Óá£

RPC ·âװͬÑùÊÇÔÚ scheduler µÄ rpcapi ÖÐʵÏÖ¡£¸Ã·½·¨ RPC µ÷ÓôúÂëÈçÏÂ:

Call ±íʾͬ²½µ÷Ó㬴Ëʱ nova-conductor ²¢²»»áÍ˳ö£¬¶øÊǶÂÈûµÈ´ýÖ±µ½ nova-scheduler
·µ»Ø¡£Òò´Ëµ±Ç°×´Ì¬Îª nova-conductor Ϊ blocked ״̬£¬µÈ´ý nova-scheduler
·µ»Ø£¬nova-scheduler ½Ó¹ÜÈÎÎñ¡£
4.4 nova scheduler
nova scheduler ÖÐÈë¿ÚΪ nova/scheduler/manager.py Ä£¿éµÄ
select_destinations ·½·¨£¬¸Ã·½·¨»áµ÷Óà driver µÄ select_destinations
·½·¨£¬ÕâÀïµÄ driver Êǵ÷¶ÈË㷨ʵÏÖ£¬Í¨¹ý filters ¹ýÂ˵ô²»Âú×ãÌõ¼þµÄ¼ÆËã½Úµã£¬Ê£ÏµĽڵãͨ¹ý
weigh ·½·¨¼ÆËãȨֵ£¬×îºóÑ¡ÔñȨֵ¸ßµÄ×÷ΪºòÑ¡¼ÆËã½Úµã·µ»Ø¡£×îºó nova-scheduler
·µ»Øµ÷¶È½á¹ûµÄ hosts ¼¯ºÏ£¬ÈÎÎñ½áÊø£¬·µ»Øµ½ nova-conductor ·þÎñ¡£
nova/scheduler/manager.py

nova/scheduler/driver.py

nova/scheduler/filter_scheduler.py

4.5 nova condutor
»Øµ½ nova-conductor µÄ schedule_and_build_instances ·½·¨£¬nova-conductor
µÈ´ý nova-scheduler ·µ»Øºó£¬Äõ½µ÷¶ÈµÄ¼ÆËã½ÚµãÁÐ±í¡£ÒòΪ¿ÉÄÜͬʱÆô¶¯¶à¸öÐéÄâ»ú£¬Òò´ËÑ»·µ÷ÓÃÁË
compute_rpcapi µÄ build_and_run_instance ·½·¨¡£

Compute_rpcpai λÓÚ nova/compute/rpcapi Ä£¿é£¬¸Ã·½·¨Ïò nova-compute
·¢Æð RPC ÇëÇó£º

·¢ÆðµÄÊÇÒì²½ RPC£¬Òò´Ë nova-conductor ÈÎÎñ½áÊø£¬½øÈë nova-compute
·þÎñ¡£
4.6 nova compute
Èë¿ÚÊÇ nova/compute/manager.py µÄ build_and_run_instance
·½·¨£¬¸Ã·½·¨»áµ÷Óà _do_build_and_run_instance ·½·¨£¬¸Ã·½·¨»á¸üÐÂÐéÄâ»ú״̬£¬È»ºóµ÷ÓÃ
_build_and_run_instance ·½·¨£¬¸Ã·½·¨»áÔ¤ÏÈÉùÃ÷Õ¼ÓüÆËã½ÚµãµÄ×ÊÔ´¡£

ÆäÖÐÔÚ instance_claim ·½·¨ÖлᴦÀí pci µÄÇëÇó£¬instance_claim¡ú claim_instance £¨nova/pci/manager.py£©¡ú_claim_instance
¡úconsume_requests £¨nova/pci/stats.py£©, ÔÚ nova/pci/stats.py
Öлá¸ù¾Ý²»Í¬µÄÍø¿¨°Ñ pci ×ÊÔ´·ÖΪ²»Í¬µÄ pool¡£

ÔÚ consume_requests ·½·¨Öлá¾ßÌå·ÖÅä pci ×ÊÔ´Ò²¾ÍÊÇ vf£¬

Ïȸù¾ÝÊ£Óà¿ÉÓÃµÄ vf µÄÊýÁ¿½« pool ½øÐÐÅÅÐò£¬Èç¹û port µÄ bond ÊôÐÔΪ false£¬Ôò
count ÊýÁ¿Îª 1£¬Ôò´Ó¿ÉÓà vf ÊýÁ¿×î¶àµÄ pool ÖзÖÅäÒ»¸ö vf£¬ÕâÑùʹ²»Í¬Íø¿¨µÄ¸ºÔؾ¡Á¿¾ùºâ¡£Èç¹û
port µÄ bond ÊôÐÔΪ true£¬Ôò count ÊýÁ¿Îª 2£¬Ôò´ÓÁ½¸ö pool Öи÷·ÖÅäÒ»¸ö
vf£¬´ïµ½¸ß¿ÉÓõÄÄ¿µÄ¡£
»Øµ½ nova/compute/manager.py µÄ build_and_run_instance
·½·¨£¬Õâ¸ö·½·¨½ÓÏÂÀ´»áµ÷Óà spawn_n ·½·¨£¬¿ªÊ¼ÕæÕý´´½¨ÐéÄâ»ú¡£ÕâÀﲻͬµÄÐéÄâ»ú¼¼Êõ¶ÔÓ¦²»Í¬µÄ
driver£¬ÆäÖÐ libvrit µÄ driver ¶ÔÓ¦ nova/virt/libvirt/driver.py¡£´Ó
spawn ·½·¨¿ªÊ¼£¬»áÏÈ»ñÈ¡ instance µÄ´ÅÅÌ¡¢¾µÏñ¡¢ÍøÂçµÈÐÅÏ¢£¬È»ºóÉú³É instance
µÄ xml Îļþ¡£

ÔÚ _get_guest_xml ·½·¨Öлáµ÷Óà _get_guest_config ·½·¨£¬ÆäÖÐ sriov
Íø¿¨µÄ²¿·ÖÈçÏ£º

ÕâÀïÈç¹û port µÄ bond Ϊ true£¬Ôò»á½«Á½¿éÍø¿¨µÄÐÅϢдÈë xml ÎļþÖС£
»Øµ½ spawn ·½·¨£¬½ÓÏÂÀ´»áµ÷Óà _create_domain_and_network ·½·¨£¬¸Ã·½·¨»áµ÷ÓÃ
plug_vifs ·½·¨´´½¨ qbr ºÍ qvo£¬½Ó×Å´´½¨ÐéÄâ»ú£¬ÐéÄâ»ú״̬Ϊ pause¡£È»ºóµÈ´ý
neutron-server µÄÏûÏ¢£¬Èç¹ûµÈµ½ÏûÏ¢ºó½«ÐéÄâ»ú״̬¸ÄΪ running£¬·ñÔò³¬Ê±Ã»Óеȵ½£¬Ôò½«ÐéÄâ»úÏú»Ù¡£

4.7 neutron sriov agent
ÔÚ neutron/plugins/ml2/ drivers/mech_sriov/ agent/sriov_nic_agent.py
ÖÐ daemon_loop ·½·¨»á¶¨Ê±¼ì²â vf µÄ״̬±ä»¯£¬Èç¹ûÓÐ vf ·¢Éú±ä»¯£¬½øÈë process_network_devices
·½·¨£¬Ôڸ÷½·¨ÖУ¬»á¸ù¾Ý vf µÄ״̬ÊÇÌí¼Ó¸ü¸Äɾ³ý×ö²»Í¬µÄ´¦Àí¡£

ÆäÖÐÔÚ treat_devices_added_updated ·½·¨ÖУ¬Èç¹û port µÄ bond
Ϊ true£¬ÐèÒª¸üÐÂÁ½¸ö vf µÄ״̬£º

È»ºó»áµ÷Óà rpc£¬Í¨Öª neutron-server ¸üÐÂ״̬¡£

ÕâÀïÊÇͬ²½µ÷Óã¬neutron-server ½ÓÊÕµ½ÏûÏ¢ºó£¬»áÏò nova ·¢Ë͸üРport µÄÏûÏ¢£¬½Ó×Å
nova compute »á resume ״̬ÊÇ pause µÄÐéÄâ»ú¡£
ÖÁ´Ë£¬´øÓÐ sriov ¸ß¿ÉÓÃÍø¿¨µÄÐéÄâ»ú´´½¨Íê³É¡£
|