From 5a56bf69988b7c72e88546eb4659576fb51bfb77 Mon Sep 17 00:00:00 2001 From: swatisharma Date: Thu, 18 Aug 2016 21:06:56 +0530 Subject: [PATCH] OPNFV KVM4NFV: Documentation This patch contains the full documentation required for KVM4NFV project. The documents are organized into the following sections- user guide, configuration guide, installation guide. requirement document, design document, release notes and glossary. Co-Authored-By: Gundarapu Reddy Signed-off-by: Swati Sharma --- docs/all/environment-setup.rst | 151 -------- docs/all/index.rst | 48 --- docs/configurationguide/abstract.rst | 16 + .../configuration.options.render.rst | 23 ++ .../images/brahmaputrafeaturematrix.jpg | Bin 0 -> 62966 bytes .../images/brahmaputrascenariomatrix.jpg | Bin 0 -> 51071 bytes docs/configurationguide/images/weather-clear.jpg | Bin 0 -> 1286 bytes docs/configurationguide/images/weather-dash.jpg | Bin 0 -> 1010 bytes .../images/weather-few-clouds.jpg | Bin 0 -> 1348 bytes .../configurationguide/images/weather-overcast.jpg | Bin 0 -> 1215 bytes docs/configurationguide/index.rst | 16 + ...w-latency.feature.configuration.description.rst | 93 +++++ .../os-nosdn-kvm-ha.description.rst | 126 +++++++ docs/configurationguide/scenariomatrix.rst | 100 ++++++ docs/design/Bare-metalPacketForwarding.png | Bin 0 -> 20986 bytes docs/design/DeviceInterruptTest.png | Bin 0 -> 14326 bytes docs/design/PacketforwardingDPDK_OVS.png | Bin 0 -> 9111 bytes docs/design/TimerTest.png | Bin 0 -> 17837 bytes docs/design/index.rst | 12 + docs/design/kvm1.png | Bin 0 -> 55615 bytes docs/design/kvmfornfv_design.rst | 155 ++++++++ docs/glossary/kvmfornfv_glossary.rst | 396 +++++++++++++++++++++ docs/installationprocedure/abstract.rst | 7 + docs/installationprocedure/index.rst | 17 + .../kvm4nfv-cicd.installation.instruction.rst | 74 ++++ .../kvm4nfv-cicd.release.notes.rst | 138 +++++++ docs/overview/kvmfornfv_overview.rst | 25 ++ docs/releasenotes/index.rst | 11 + docs/releasenotes/release-notes.rst | 174 +++++++++ docs/requirements/index.rst | 12 + docs/requirements/kvmfornfv_requirements.rst | 89 +++++ docs/userguide/abstract.rst | 16 + docs/userguide/common.platform.render.rst | 15 + docs/userguide/feature.userguide.render.rst | 14 + docs/userguide/index.rst | 20 ++ docs/userguide/introduction.rst | 53 +++ .../live_migration.userguide.rst} | 27 +- docs/{all => userguide}/lmdowntime.jpg | Bin docs/{all => userguide}/lmnetwork.jpg | Bin docs/{all => userguide}/lmtotaltime.jpg | Bin docs/userguide/low_latency.userguide.rst | 68 ++++ docs/userguide/openstack.rst | 51 +++ .../tuning.rst => userguide/tuning.userguide.rst} | 57 +-- 43 files changed, 1768 insertions(+), 236 deletions(-) delete mode 100644 docs/all/environment-setup.rst delete mode 100644 docs/all/index.rst create mode 100644 docs/configurationguide/abstract.rst create mode 100644 docs/configurationguide/configuration.options.render.rst create mode 100644 docs/configurationguide/images/brahmaputrafeaturematrix.jpg create mode 100644 docs/configurationguide/images/brahmaputrascenariomatrix.jpg create mode 100644 docs/configurationguide/images/weather-clear.jpg create mode 100644 docs/configurationguide/images/weather-dash.jpg create mode 100644 docs/configurationguide/images/weather-few-clouds.jpg create mode 100644 docs/configurationguide/images/weather-overcast.jpg create mode 100644 docs/configurationguide/index.rst create mode 100644 docs/configurationguide/low-latency.feature.configuration.description.rst create mode 100644 docs/configurationguide/os-nosdn-kvm-ha.description.rst create mode 100644 docs/configurationguide/scenariomatrix.rst create mode 100644 docs/design/Bare-metalPacketForwarding.png create mode 100644 docs/design/DeviceInterruptTest.png create mode 100644 docs/design/PacketforwardingDPDK_OVS.png create mode 100644 docs/design/TimerTest.png create mode 100755 docs/design/index.rst create mode 100644 docs/design/kvm1.png create mode 100644 docs/design/kvmfornfv_design.rst create mode 100644 docs/glossary/kvmfornfv_glossary.rst create mode 100644 docs/installationprocedure/abstract.rst create mode 100644 docs/installationprocedure/index.rst create mode 100644 docs/installationprocedure/kvm4nfv-cicd.installation.instruction.rst create mode 100644 docs/installationprocedure/kvm4nfv-cicd.release.notes.rst create mode 100644 docs/overview/kvmfornfv_overview.rst create mode 100644 docs/releasenotes/index.rst create mode 100644 docs/releasenotes/release-notes.rst create mode 100755 docs/requirements/index.rst create mode 100644 docs/requirements/kvmfornfv_requirements.rst create mode 100644 docs/userguide/abstract.rst create mode 100644 docs/userguide/common.platform.render.rst create mode 100644 docs/userguide/feature.userguide.render.rst create mode 100644 docs/userguide/index.rst create mode 100644 docs/userguide/introduction.rst rename docs/{all/live_migration.rst => userguide/live_migration.userguide.rst} (82%) rename docs/{all => userguide}/lmdowntime.jpg (100%) rename docs/{all => userguide}/lmnetwork.jpg (100%) rename docs/{all => userguide}/lmtotaltime.jpg (100%) create mode 100644 docs/userguide/low_latency.userguide.rst create mode 100644 docs/userguide/openstack.rst rename docs/{all/tuning.rst => userguide/tuning.userguide.rst} (70%) diff --git a/docs/all/environment-setup.rst b/docs/all/environment-setup.rst deleted file mode 100644 index e3814310a..000000000 --- a/docs/all/environment-setup.rst +++ /dev/null @@ -1,151 +0,0 @@ -.. This work is licensed under a Creative Commons Attribution 4.0 International License. -.. http://creativecommons.org/licenses/by/4.0 -.. (c) - -Low Latency Environment -======================= - -Achieving low latency with the KVM4NFV project requires setting up a special -test environment. This environment includes the BIOS settings, kernel -configuration, kernel parameters and the run-time environment. - -Hardware Environment Description --------------------------------- - -BIOS setup plays an important role in achieving real-time latency. A collection -of relevant settings, used on the platform where the baseline performance data -was collected, is detailed below: - -CPU Features -~~~~~~~~~~~~ - -Some special CPU features like TSC-deadline timer, invariant TSC and Process posted -interrupts, etc, are helpful for latency reduction. - -Below is the CPU information on the baseline test platform. -:: - processor : 35 - vendor_id : GenuineIntel - cpu family : 6 - model : 63 - model name : Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz - stepping : 2 - microcode : 0x2d - cpu MHz : 2294.795 - cache size : 46080 KB - physical id : 1 - siblings : 18 - core id : 27 - cpu cores : 18 - apicid : 118 - initial apicid : 118 - fpu : yes - fpu_exception : yes - cpuid level : 15 - wp : yes - flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge - mca cmov pat pse36 clflush dts acpi mmx fxsr sse - sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm - constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc - aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 - ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt - tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm arat epb - pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase - tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc - cqm_occup_llcbugs - bogomips : 4595.54 - clflush size : 64 - cache_alignment : 64 - address sizes : 46 bits physical, 48 bits virtual - power management: - -CPU Topology -~~~~~~~~~~~~ - -NUMA topology is also important for latency reduction. - -Below is the CPU topology on the baseline test platform. -:: - [nfv@otcnfv02 ~]$ lscpu - Architecture: x86_64 - CPU op-mode(s): 32-bit, 64-bit - Byte Order: Little Endian - CPU(s): 36 - On-line CPU(s) list: 0-35 - Thread(s) per core: 1 - Core(s) per socket: 18 - Socket(s): 2 - NUMA node(s): 2 - Vendor ID: GenuineIntel - CPU family: 6 - Model: 63 - Model name: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz - Stepping: 2 - CPU MHz: 2294.795 - BogoMIPS: 4595.54 - Virtualization: VT-x - L1d cache: 32K - L1i cache: 32K - L2 cache: 256K - L3 cache: 46080K - NUMA node0 CPU(s): 0-17 - NUMA node1 CPU(s): 18-35 - -BIOS Setup -~~~~~~~~~~ - -Careful BIOS setup is important in achieving real time latency. Different -platforms have different BIOS setups, below are the important BIOS settings on -the platform used to collect the baseline performance data. -:: - CPU Power and Performance - CPU C-State - C1E Autopromote - Processor C3 - Processor C6 - Select Memory RAS - NUMA Optimized - Cluster-on-Die - Patrol Scrub - Demand Scrub - Correctable Error <10> - Intel(R) Hyper-Threading - Active Processor Cores - Execute Disable Bit - Intel(R) Virtualization Technology - Intel(R) TXT - Enhanced Error Containment Mode - USB Controller - USB 3.0 Controller - Legacy USB Support - Port 60/64 Emulation - -Software Environment Setup --------------------------- -Both the host and the guest environment need to be configured properly to -reduce latency variations. Below are some suggested kernel configurations. -The ci/envs/ directory gives detailed implementation on how to setup the -environment. - -Kernel Parameter -~~~~~~~~~~~~~~~~ - -Please check the default kernel configuration in the source code at: -kernel/arch/x86/configs/opnfv.config. - -Below is host kernel boot line example: -:: - isolcpus=11-15,31-35 nohz_full=11-15,31-35 rcu_nocbs=11-15,31-35 iommu=pt intel_iommu=on default_hugepagesz=1G hugepagesz=1G mce=off idle=poll intel_pstate=disable processor.max_cstate=1 pcie_asmp=off tsc=reliable - -Below is guest kernel boot line example -:: - isolcpus=1 nohz_full=1 rcu_nocbs=1 mce=off idle=poll default_hugepagesz=1G hugepagesz=1G - -Please refer to :doc:`tunning` for more explanation. - -Run-time Environment Setup -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Not only are special kernel parameters needed but a special run-time -environment is also required. Please refer to :doc:`tunning` for more -explanation. diff --git a/docs/all/index.rst b/docs/all/index.rst deleted file mode 100644 index 7f5f7a694..000000000 --- a/docs/all/index.rst +++ /dev/null @@ -1,48 +0,0 @@ -.. This work is licensed under a Creative Commons Attribution 4.0 International License. -.. http://creativecommons.org/licenses/by/4.0 -.. (c) - -=============== -KVM4NFV project -=============== - -Welcome to KVM4NFV_ project! - - - -.. _KVM4NFV: https://wiki.opnfv.org/nfv-kvm - -Contents: - -KVM4NFV Project Description -=========================== - -The NFV hypervisors provide crucial functionality in the NFV Infrastructure -(NFVI). The existing hypervisors, however, are not necessarily designed or -targeted to meet the requirements for the NFVI, and we need to make -collaborative efforts toward enabling the NFV features. - -The KVM4NFV project focuses on the KVM hypervisor to enhance it for NFV, by -looking at the following areas - -+ Minimal Interrupt latency variation for data plane VNFs - * Minimal Timing Variation for Timing correctness of real-time VNFs - * Minimal packet latency variation for data-plane VNFs -+ Fast live migration - -While these items require software development and/or specific hardware features -there are also some adjustments that need to be made to system configuration -information, like hardware, BIOS, OS, etc. - -.. toctree:: - :numbered: - :maxdepth: 1 - -Setup Guides -============ -.. toctree:: - :maxdepth: 2 - - environment-setup - tuning - live_migration diff --git a/docs/configurationguide/abstract.rst b/docs/configurationguide/abstract.rst new file mode 100644 index 000000000..a5066c284 --- /dev/null +++ b/docs/configurationguide/abstract.rst @@ -0,0 +1,16 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +======== +Abstract +======== + +This document provides guidance for the configurations available in the +Colorado release of OPNFV. + +The release includes four installer tools leveraging different technologies; +Apex, Compass4nfv, Fuel and JOID, which deploy components of the platform. + +This document also includes the selection of tools and components including +guidelines for how to deploy and configure the platform to an operational +state. diff --git a/docs/configurationguide/configuration.options.render.rst b/docs/configurationguide/configuration.options.render.rst new file mode 100644 index 000000000..93add7755 --- /dev/null +++ b/docs/configurationguide/configuration.options.render.rst @@ -0,0 +1,23 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +====================== +Configuration Options +====================== + +OPNFV provides a variety of virtual infrastructure deployments called scenarios +designed to host virtualised network functions (VNF's). KVM4NFV scenarios +provide specific capabilities and/or components aimed to solve specific +problems for the deployment of VNF's. KVM4NFV scenario includes components +such as OpenStack,KVM etc. which includes different source components or +configurations. + +KVM4NFV Scenarios +=================== + +Each KVM4NFV scenario provides unique features and capabilities, it is +important to understand your target platform capabilities before installing +and configuring. This configuration guide outlines how to install and +configure components in order to enable the features required. + +.. include:: scenariomatrix.rst diff --git a/docs/configurationguide/images/brahmaputrafeaturematrix.jpg b/docs/configurationguide/images/brahmaputrafeaturematrix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d2a122799533e59984bb96fa8f5fd8dacfe4425 GIT binary patch literal 62966 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

< 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 literal 0 HcmV?d00001 diff --git a/docs/configurationguide/images/weather-clear.jpg b/docs/configurationguide/images/weather-clear.jpg new file mode 100644 index 0000000000000000000000000000000000000000..011ad52e9c586c786d11ff25522bb731206df619 GIT binary patch literal 1286 zcmex=kR1VV=P zOa>M(n}IP%zdrV6brV^ko5= z1_WTXDwrv7MYiW=Kf@-LmkpdV-u!T?`+tBzkb^;iL4lc3iGfLwky()O{}Bdxpo>@; z!2qlcNH8)nv#_$Ub8vET0~Kr)06LwSnTds&l@(+SV=Yjgfklv2NYT)dO*k--U8zvS zsBz*#4rQl}2StM}eo!$^Dr(~75)+q@lu}hw*U;25F*P%{u(Wb^admU|@bn4}2@MO6 zh>S{3Nli=7$jmA(DJ?6nsH|#kX>Duo=IO#5TBv>OAzQUCKeWE7Iu)o7@5jJ9v5U`RWxK1atvfoEEHBUYUB`cnz(S|K~81k zpbw%+MHjimR7@VKegt_9>@(s#)o$Wk0}~i9GXZ0XnHd;UEI`1@&I$tT z9PD7g0R>!OzzqVtaPS{!2qVx8pk_88;^k!Lgv$}l_dzVJ+5Y5dcN*s7LDNVwxRwBR)yDBo;3Y=UHaouo2gn^mx_H= z=FXaQcl)X+)70!c-;36)e$72EJgmOTw%hMY!hD~uPo5JRc9h>+l2UlpQ_{5V)-&xL zEgyseCNV0kE1M(7#~&DPH8(7qyLE=VaWzZA@%KF+)>QZ1`SQwAa(&I^t+GZHiCyPH z54zrHZ*E%9x7W{Z>-ht63PF!JymU3J%6!dNPj{Qwxoq;Tt?x4DJXy~%)wOKN{YA0; z|1bP~ex>BEQAO&sPpY>!Zr}0X!Akb!!ToD%KCh}>@3T|0pv~cDN-6vEuL^uS|60ii z#(Txwb}bidD)18GWSDyH^28GdUupF%T<&Z)Q+H0lGP9?_SraFocQTwDKck}g;a5Aw zWwWyQIJaEdGrM}(mat7><$M2Z|7A1TD#HA9V6po1P4D_=tX=#5>+dgZEEx-1n@=kD zurPe^u&}MSYgV~_c~{xoWsW>XH;?S#*e&y^K!ox7!lP1Ub9tmv!itVG_+$=6MinOSh<-Gw>R} V`ThD@i?~j5$)qaNyYv6w1OS6e)lvWe literal 0 HcmV?d00001 diff --git a/docs/configurationguide/images/weather-dash.jpg b/docs/configurationguide/images/weather-dash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bf98dd27ebb57fc14e678c7f5b3f59256fb498f GIT binary patch literal 1010 zcmex=kR1VRQz zDF#+Bn}NZLQ5wz;V$^`DVPart&tzbMs)+*9AOJKOq#H^zFJMHNxPS?+T44b*f(_F4 z|1E<>Kt_H^esM;Afr7D~0fU8;r!Nc0bRYn;Rl!VwE3!Q|`x!Q|ylmi{@#cq9-Twm& zf*cGA3<}IZ*E0z+G7B>PKf)jnbOkFT7=X0_2}UMn7FITP4o)s^pn|Oe3`~s7%uFoI ztgIkw7;Ay@3@n1ILW+itY{G$w>`H|qMvW5}awt1(JSZA;@q>zSQc)8pmzcPOq?D?f zx`w8fiK&^ng{76Vi>sTvho@I?NN8AiL}XNQN@`kqMrKxVNoiSmMP*fUOKV$uM`zch z$y26In?7UatVN5LEM2yI#mZHiHgDOwZTpU$yAB;ba`f2o6DLnyx_ss8wd*%--g@}x z@sp>|p1*kc>f@)+U%r0({^RE_kiUT83Go(?g!l~2UxGk?F|n{Pv#^8w#mH0+^0*)i ztD+&BkYgZwVxh2-Q6qLj)ms?<-vj_jMmm20 literal 0 HcmV?d00001 diff --git a/docs/configurationguide/images/weather-few-clouds.jpg b/docs/configurationguide/images/weather-few-clouds.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51994ee84f27d828904d01b5976a82dac081081b GIT binary patch literal 1348 zcmex=kR1VV=P zOa>M(n}IP%zdrV6brV^ko5= z1_WTXDwrv7MYiW=Kf@-LmkpdV-u!T?`+tBzkb^;iL4lc3iGfLwky()O{}Bdxpo>@; z!2qlcNH8)nv#_$Ub8vET0~Kr)06LwSnTds&l@(+SV=Yjgfklv2NYT)dO*k--U8zvS zsBz*#4rQl}2StM}eo!$^Dr(~75)+q@lu}hw*U;25F*P%{u(Wb^admU|@bn4}2@MO6 zh>S{3Nli=7$jmA(DJ?6nsH|#kX>Duo=IO#5TBv>OAzQUCKeWE7Iu)o7@5jJ9v5U`RWxK1atvfoEEHBUYUB`cnz(S|K~81k zpbw%+MHjimR7@VKegt_9>@(s#)o$Wk0}~i9GXZ0XnHd;UEI`1@&I$tT z9PD7g0R>!OzzqVtaPS{!2qVx8pk_88;^k!Lgv$}l_YnRT zu``;#8|KYi9zMY^!J{`+(x9woy6&fs4VA~|N1fF0oxXYV9hW7NR*C0zMC!Sk4=}$f zs$74r;&z|rla;|?lV@eByty*%?cSh^tF_~v@1B|(9})9u*XG|B-&U0^X8Dy8KFOzr z_3*y0%F2DKJWj6ucHJ=chXR!``Z{f1_lXCk<`;5II=}GR1_lMB z>`W+F9o-5qjwrBp hePx)#d_KVNYv5wPz}`h`wq4HuWOH0o?dtjeHvz;x^f3Sc literal 0 HcmV?d00001 diff --git a/docs/configurationguide/images/weather-overcast.jpg b/docs/configurationguide/images/weather-overcast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdc1e0487b9bcd069a542e820da343c96dca930a GIT binary patch literal 1215 zcmex=kR1VV=P zOa>M(n}IP%zdrV6brV^ko5= z1_WTXDwrv7MYiW=Kf@-LmkpdV-u!T?`+tBzkb^;iL4lc3iGfLwky()O{}Bdxpo>@; z!2qlcNH8)nv#_$Ub8vET0~Kr)06LwSnTds&l@(+SV=Yjgfklv2NYT)dO*k--U8zvS zsBz*#4rQl}2StM}eo!$^Dr(~75)+q@lu}hw*U;25F*P%{u(Wb^admU|@bn4}2@MO6 zh>S{3Nli=7$jmA(DJ?6nsH|#kX>Duo=IO#5TBv>OAzQUCKeWE7Iu)o7@5jJ9v5U`RWxK1atvfoEEHBUYUB`cnz(S|K~81k zpbw%+MHjimR7@VKegt_9>@(s#)o$Wk0}~i9GXZ0XnHd;UEI`1@&I$tT z9PD7g0R>!OzzqVtaPS{!2qVx8pk_88;^k!Lgv$}l_!;q~2r zPqM-|96a8yH}e(d^E+9yGtR;B#q%bMoC4e8L;qAZeT?fD+nBUgYO_g^tD5;ym2{ro zK8sfz51Ke0Tt8K1x^Cv0=xnn~{-v@{{CX4mZCZ3#c#r6NI_-1hpTx#+;NW_PAAzR- z8XxW6&l?-(Sem=y_UtVJY>at|H`X2&a(kkzZei`t@Lbct{{Mx)n?JH2?)J@lbLU{K z>8#CLmZ=1sP${04dQw8CQhDMe|DfWh|5SfCKH|2x=Ffl6cSRH5izbJ@wG+?3j}>XM z`g5Sk`g#AdjHL;7_Lui?f0Xu~l-=>gdgrrg_S$ERZ|Ge)p`syflhRjP@nv22!F`M$ xS5>S!9Ck%VMPqF{M2>?Qls7U|- literal 0 HcmV?d00001 diff --git a/docs/configurationguide/index.rst b/docs/configurationguide/index.rst new file mode 100644 index 000000000..6ad3b282c --- /dev/null +++ b/docs/configurationguide/index.rst @@ -0,0 +1,16 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +************************* +OPNFV Configuration Guide +************************* +Colorado 1.0 +------------ + +.. toctree:: + :maxdepth: 2 + + ./abstract.rst + ./configuration.options.render.rst + ./low-latency.feature.configuration.description.rst + ./os-nosdn-kvm-ha.description.rst diff --git a/docs/configurationguide/low-latency.feature.configuration.description.rst b/docs/configurationguide/low-latency.feature.configuration.description.rst new file mode 100644 index 000000000..bb2bbd1ba --- /dev/null +++ b/docs/configurationguide/low-latency.feature.configuration.description.rst @@ -0,0 +1,93 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Introduction +============ + +In KVM4NFV project, we focus on the KVM hypervisor to enhance it for NFV, by +looking at the following areas initially + +* Minimal Interrupt latency variation for data plane VNFs: + * Minimal Timing Variation for Timing correctness of real-time VNFs + * Minimal packet latency variation for data-plane VNFs +* Inter-VM communication, +* Fast live migration + +Configuration of Cyclictest +=========================== + +Cyclictest measures Latency of response to a stimulus. Achieving low latency +with the KVM4NFV project requires setting up a special test environment. +This environment includes the BIOS settings, kernel configuration, kernel +parameters and the run-time environment. + +* For more information regarding the test environment, please visit + https://wiki.opnfv.org/display/kvm/KVM4NFV+Test++Environment + https://wiki.opnfv.org/display/kvm/Nfv-kvm-tuning + +Pre-configuration activities +---------------------------- + +Intel POD1 is currently used as OPNFV-KVM4NFV test environment. The latest +build packages are downloaded onto Intel Pod1-jump server from artifact +repository. Yardstick running in a ubuntu docker container on Intel Pod1-jump +server will trigger the cyclictest. + +Running cyclictest through Yardstick will Configure the host(Pod1-node1), the +guest, executes cyclictest on the guest. + +The following scripts are used for configuring host and guest to create a +special test environment and achieve low latency. + +**host-setup0.sh**: On running this script will install latest kernel rpm +on host and will make necessary changes as following to create special test +environment + + * Isolates CPUs from the general scheduler + * Stops timer ticks on isolated CPUs whenever possible + * Stops RCU callbacks on isolated CPUs + * Enables intel iommu driver and disables DMA translation for devices + * Sets HugeTLB pages to 1GB + * Disables machine check + * Disables clocksource verification at runtime + +**host-setup1.sh**: On running this script will make following test +environment changes + + * Disabling watchdogs to reduce overhead + * Disabling RT throttling + * Reroute interrupts bound to isolated CPUs to CPU 0 + * Change the iptable so that we can ssh to the guest remotely + +**host-run-qemu.sh**: On running this script will launch a guest vm on host. + Note: download guest disk image from artifactory + +**guest-setup0.sh**: On running this scrcipt on guest vm will install the +latest build kernel rpm, cyclictest and makes following configuration on +guest vm. + + * Isolates CPUs from the general scheduler + * Stops timer ticks on isolated CPUs whenever possible + * Uses polling idle loop to improve performance + * Disables clocksource verification at runtime + +**guest-setup1.sh**: On running this script on guest vm will make following +configurations + + * Disable watchdogs to reduce overhead + * Routes device interrupts to non-RT CPU + * Disables RT throttling + +Hardware configuration +---------------------- + +Currently Intel POD1 is used as test environment for kvmfornfv to execute +cyclictest. As part of this test environment Intel pod1-jump is configured as +jenkins slave and all the latest build artifacts are downloaded on to it. +Intel pod1-node1 is the host on which a guest vm will be launched as a part of +running cylictest through yardstick. + +* For more information regarding hardware configuration, please visit + https://wiki.opnfv.org/display/pharos/Intel+Pod1 + https://build.opnfv.org/ci/computer/intel-pod1/ + http://artifacts.opnfv.org/octopus/brahmaputra/docs/octopus_docs/opnfv-jenkins-slave-connection.html diff --git a/docs/configurationguide/os-nosdn-kvm-ha.description.rst b/docs/configurationguide/os-nosdn-kvm-ha.description.rst new file mode 100644 index 000000000..d60276e0f --- /dev/null +++ b/docs/configurationguide/os-nosdn-kvm-ha.description.rst @@ -0,0 +1,126 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + + +Introduction +============ + +.. In this section explain the purpose of the scenario and the + types of capabilities provided + +The purpose of os-nosdn-kvm-ha scenario testing is to test the +High Availability deployment and configuration of OPNFV software suite +with OpenStack and without SDN software. This OPNFV software suite +includes OPNFV KVM4NFV latest software packages for Linux Kernel and +QEMU patches for achieving low latency. High Availability feature is achieved +by deploying OpenStack multi-node setup with 3 controllers and 2 computes nodes + +KVM4NFV packages will be installed on compute nodes as part of deployment. +This scenario testcase deployment is happening on multi-node by using +OPNFV Fuel deployer. + +Scenario Components and Composition +=================================== +.. In this section describe the unique components that make up the scenario, +.. what each component provides and why it has been included in order +.. to communicate to the user the capabilities available in this scenario. + +This scenario deploys the High Availability OPNFV Cloud based on the +configurations provided in ha_nfv-kvm_heat_ceilometer_scenario.yaml. +This yaml file contains following configurations and is passed as an +argument to deploy.py script + +* scenario.yaml:This configuration file defines translation between a + short deployment scenario name(os-nosdn-kvm-ha) and an actual deployment + scenario configuration file(ha_nfv-kvm_heat_ceilometer_scenario.yaml) + +* deployment-scenario-metadata:Contains the configuration metadata like + title,version,created,comment. + +* stack-extensions:Stack extentions are opnfv added value features in form + of a fuel-plugin.Plugins listed in stack extensions are enabled and + configured. + +* dea-override-config: Used to configure the HA mode,network segmentation + types and role to node assignments.These configurations overrides + corresponding keys in the dea_base.yaml and dea_pod_override.yaml. + These keys are used to deploy multiple nodes(3 controllers,2 computes) + as mention below. + + * **Node 1**: This node has MongoDB and Controller roles. The controller + node runs the Identity service, Image Service, management portions of + Compute and Networking, Networking plug-in and the dashboard. The + Telemetry service which was designed to support billing systems for + OpenStack cloud resources uses a NoSQL database to store information. + The database typically runs on the controller node. + + * **Node 2**: This node has Controller and Ceph-osd roles. Ceph is a + massively scalable, open source, distributed storage system. It is + comprised of an object store, block store and a POSIX-compliant distributed + file system. Enabling Ceph, configures Nova to store ephemeral volumes in + RBD, configures Glance to use the Ceph RBD backend to store images, + configures Cinder to store volumes in Ceph RBD images and configures the + default number of object replicas in Ceph. + + * **Node 3**: This node has Controller role in order to achieve high + availability. + + * **Node 4**: This node has Compute role. The compute node runs the + hypervisor portion of Compute that operates tenant virtual machines + or instances. By default, Compute uses KVM as the hypervisor. + + * **Node 5**: This node has compute role. + +* dha-override-config:Provides information about the VM definition and + Network config for virtual deployment.These configurations overrides + the pod dha definition and points to the controller,compute and + fuel definition files. + +* os-nosdn-kvm-ha scenario is successful when all the 5 Nodes are accessible, + up and running + +Scenario Usage Overview +======================= +.. Provide a brief overview on how to use the scenario and the features available to the +.. user. This should be an "introduction" to the userguide document, and explicitly link to it, +.. where the specifics of the features are covered including examples and API's + +* The high availability feature can be acheived by executing deploy.py with + ha_nfv-kvm_heat_ceilometer_scenario.yaml as an argument. +* Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware + Environment: + + -Example: + + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -log ~/Deployment-888.log.tar.gz + +* Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual + Environment: + + -Example: + + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -log ~/Deployment-888.log.tar.gz + +* os-nosdn-kvm-ha scenario can be executed from the jenkins project + "fuel-os-nosdn-kvm-ha-baremetal-daily-master" +* This scenario provides the High Availability feature by deploying + 3 controller,2 compute nodes and checking if all the 5 nodes + are accessible(IP,up & running). +* Test Scenario is passed if deployment is successful and all 5 nodes have + accessibility (IP , up & running). +* Observed that scenario is not running any testcase on top of deployment. + +Known Limitations, Issues and Workarounds +========================================= +.. Explain any known limitations here. + +* Test scenario os-nosdn-kvm-ha result is not stable. After node reboot + triggered by kvm plugin, sometimes puppet agent (mcollective) is not + responding with in the given time. + +References +========== + +For more information on the OPNFV Colorado release, please visit +http://www.opnfv.org/colorado diff --git a/docs/configurationguide/scenariomatrix.rst b/docs/configurationguide/scenariomatrix.rst new file mode 100644 index 000000000..1e2cef90a --- /dev/null +++ b/docs/configurationguide/scenariomatrix.rst @@ -0,0 +1,100 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +Scenarios are implemented as deployable compositions through integration with an installation tool. +OPNFV supports multiple installation tools and for any given release not all tools will support all +scenarios. While our target is to establish parity across the installation tools to ensure they +can provide all scenarios, the practical challenge of achieving that goal for any given feature and +release results in some disparity. + +Colorado scenario overeview +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following table provides an overview of the installation tools and available scenario's +in the Colorado release of OPNFV. + +Scenario status is indicated by a weather pattern icon. All scenarios listed with +a weather pattern are possible to deploy and run in your environment or a Pharos lab, +however they may have known limitations or issues as indicated by the icon. + +Weather pattern icon legend: + ++---------------------------------------------+----------------------------------------------------------+ +| Weather Icon | Scenario Status | ++=============================================+==========================================================+ +| .. image:: ../images/weather-clear.jpg | Stable, no known issues | ++---------------------------------------------+----------------------------------------------------------+ +| .. image:: ../images/weather-few-clouds.jpg | Stable, documented limitations | ++---------------------------------------------+----------------------------------------------------------+ +| .. image:: ../images/weather-overcast.jpg | Deployable, stability or feature limitations | ++---------------------------------------------+----------------------------------------------------------+ +| .. image:: ../images/weather-dash.jpg | Not deployed with this installer | ++---------------------------------------------+----------------------------------------------------------+ + +Scenarios that are not yet in a state of "Stable, no known issues" will continue to be stabilised +and updates will be made on the stable/colorado branch. While we intend that all Colorado +scenarios should be stable it is worth checking regularly to see the current status. Due to +our dependency on upstream communities and code some issues may not be resolved prior to the D release. + +Scenario Naming +^^^^^^^^^^^^^^^ + +In OPNFV scenarios are identified by short scenario names, these names follow a scheme that +identifies the key components and behaviours of the scenario. The rules for scenario naming are as follows: + + os-[controller]-[feature]-[mode]-[option] + +Details of the fields are + * os: mandatory + + * Refers to the platform type used + * possible value: os (OpenStack) + +* [controller]: mandatory + + * Refers to the SDN controller integrated in the platform + * example values: nosdn, ocl, odl, onos + + * [feature]: mandatory + + * Refers to the feature projects supported by the scenario + * example values: nofeature, kvm, ovs, sfc + + * [mode]: mandatory + + * Refers to the deployment type, which may include for instance high availability + * possible values: ha, noha + + * [option]: optional + + * Used for the scenarios those do not fit into naming scheme. + * The optional field in the short scenario name should not be included if there is no optional scenario. + +Some examples of supported scenario names are: + + * os-nosdn-kvm-noha + + * This is an OpenStack based deployment using neutron including the OPNFV enhanced KVM hypervisor + + * os-onos-nofeature-ha + + * This is an OpenStack deployment in high availability mode including ONOS as the SDN controller + + * os-odl_l2-sfc + + * This is an OpenStack deployment using OpenDaylight and OVS enabled with SFC features + +Installing your scenario +^^^^^^^^^^^^^^^^^^^^^^^^ + +There are two main methods of deploying your target scenario, one method is to follow this guide which will +walk you through the process of deploying to your hardware using scripts or ISO images, the other method is +to set up a Jenkins slave and connect your infrastructure to the OPNFV Jenkins master. + +For the purposes of evaluation and development a number of Colorado scenarios are able to be deployed +virtually to mitigate the requirements on physical infrastructure. Details and instructions on performing +virtual deployments can be found in the installer specific installation instructions. + +To set up a Jenkins slave for automated deployment to your lab, refer to the `Jenkins slave connect guide. +`_ diff --git a/docs/design/Bare-metalPacketForwarding.png b/docs/design/Bare-metalPacketForwarding.png new file mode 100644 index 0000000000000000000000000000000000000000..4b884e2572f7abf133d1c24444937ae0608ab6a7 GIT binary patch literal 20986 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 literal 0 HcmV?d00001 diff --git a/docs/design/DeviceInterruptTest.png b/docs/design/DeviceInterruptTest.png new file mode 100644 index 0000000000000000000000000000000000000000..497f63fa35f7f13d6618db1437105006b5286b5d GIT binary patch literal 14326 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 F{x^C?TzCKg literal 0 HcmV?d00001 diff --git a/docs/design/index.rst b/docs/design/index.rst new file mode 100755 index 000000000..871f17388 --- /dev/null +++ b/docs/design/index.rst @@ -0,0 +1,12 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +================ +KVMFORNFV Design +================ + +.. toctree:: + :numbered: + :maxdepth: 3 + + kvmfornfv_design.rst diff --git a/docs/design/kvm1.png b/docs/design/kvm1.png new file mode 100644 index 0000000000000000000000000000000000000000..3de1a6b80f3f983de133cd3cd1cdb299f045c455 GIT binary patch literal 55615 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 literal 0 HcmV?d00001 diff --git a/docs/design/kvmfornfv_design.rst b/docs/design/kvmfornfv_design.rst new file mode 100644 index 000000000..54dcd120a --- /dev/null +++ b/docs/design/kvmfornfv_design.rst @@ -0,0 +1,155 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============ +Introduction +============ + +**Purpose**: + + This document provides an overview of the areas that can be addressed to + enhance the KVM Hypervisor for NFV. It is intended to capture and convey the + significant changes which have been made on the KVM Hypervisor. + + +=================== +Project description +=================== + +The NFV hypervisors provide crucial functionality in the NFV +Infrastructure(NFVI).The existing hypervisors, however, are not necessarily +designed or targeted to meet the requirements for the NFVI. + +This design focuses on the enhancement of following area for KVM Hypervisor + +* Minimal Interrupt latency variation for data plane VNFs: + * Minimal Timing Variation for Timing correctness of real-time VNFs + * Minimal packet latency variation for data-plane VNFs +* Fast live migration + +While these items require software development and/or specific hardware features +there are also some adjustments that need to be made to system configuration +information, like hardware, BIOS, OS, etc. + +**Minimal Interrupt latency variation for data plane VNFs** + +Processing performance and latency depend on a number of factors, including +the CPUs (frequency, power management features, etc.), micro-architectural +resources, the cache hierarchy and sizes, memory (and hierarchy, such as NUMA) +and speed, inter-connects, I/O and I/O NUMA, devices, etc. + +There are two separate types of latencies to minimize: + + 1. Minimal Timing Variation for Timing correctness of real-time + VNFs – timing correctness for scheduling operations(such as Radio scheduling) + 2. Minimal packet latency variation for data-plane VNFs – packet delay + variation, which applies to packet processing. + +For a VM, interrupt latency (time between arrival of H/W interrupt and +invocation of the interrupt handler in the VM), for example, can be either of +the above or both, depending on the type of the device. Interrupt latency with +a (virtual) timer can cause timing correctness issues with real-time VNFs even +if they only use polling for packet processing. + +We assume that the VNFs are implemented properly to minimize interrupt latency +variation within the VMs, but we have additional causes of latency variation +on KVM: + + - Asynchronous (e.g. external interrupts) and synchronous(e.g. instructions) + VM exits and handling in KVM (and kernel routines called), which may have + loops and spin locks + - Interrupt handling in the host Linux and KVM, scheduling and virtual + interrupt delivery to VNFs + - Potential VM exit (e.g. EOI) in the interrupt service routines in VNFs + - Exit to the user-level (e.g. QEMU) + +.. Figure:: kvm1.png + +===================== +Design Considerations +===================== + +The latency variation and jitters can be minimized with the below +steps (with some in parallel): + + 1. Statically and exclusively assign hardware resources + (CPUs, memory, caches,) to the VNFs. + + 2. Pre-allocate huge pages (e.g. 1 GB/2MB pages) and guest-to-host mapping, + e.g. EPT (Extended Page Table) page tables, to minimize or mitigate + latency from misses in caches, + + 3. Use the host Linux configured for hard real-time and packet latency, + Check the set of virtual devices used by the VMs to optimize or + eliminate virtualization overhead if applicable + + 4. Use advanced hardware virtualization features that can reduce or + eliminate VM exits, if present, and + + 5. Inspect the code paths in KVM and associated kernel services to + eliminate code that can cause latencies (e.g. loops and spin locks). + + 6. Measure latencies intensively. We leverage the existing testing methods. + OSADL, for example, defines industry tests for timing correctness. + +==================== +Goals and Guidelines +==================== + +The output of this project will provide : + + 1. A list of the performance goals, which will be obtained by the + OPNFV members (as described above) + + 2. A set of comprehensive instructions for the system configurations + (hardware features, BIOS setup, kernel parameters, VM configuration, + options to QEMU/KVM, etc.) + + 3. The above features to the upstream of Linux, the real-time patch + set, KVM, QEMU, libvirt, and + + 4. Performance and interrupt latency measurement tools + +========= +Test plan +========= + +The tests that need to be conducted to make sure that all components from OPNFV +meet the requirement are mentioned below: + +**Timer test**:This test utilize the cyclictest +(https://rt.wiki.kernel.org/index.php/Cyclictest) to test the guest timer +latency (the latency from the time that the guest timer should be triggered +to the time the guest timer is really triggered). + +.. Figure:: TimerTest.png + +**Device Interrupt Test**:A device on the hardware platform trigger interrupt +every one ms and the device interrupt will be delivered to the VNF. This test +cover the latency from the interrupt happened on the hardware to the time the +interrupt handled in the VNF. + +.. Figure:: DeviceInterruptTest.png + +**Packet forwarding (DPDK OVS)**:A packet is sent from TC (Traffic Generator) +to a VNF. The VNF, after processing the packet, forwards the packet to another +NIC and in the end the packet is received by the traffic generator. The test +check the latency from the packet is sent out by the TC to the time the packet +is received by the TC. + +.. Figure:: PacketforwardingDPDK_OVS.png + +**Packet Forwarding (SR-IOV)**:This test is similar to Packet Forwarding +(DPDK OVS). However, instead of using virtio NIC devices on the guest, +a PCI NIC or a PCI VF NIC is assigned to the guest for network acess. + +**Bare-metal Packet Forwarding**:This is used to compare with the above +packet forwarding scenario. + +.. Figure:: Bare-metalPacketForwarding.png + +========= +Reference +========= + +https://wiki.opnfv.org/display/kvm/ diff --git a/docs/glossary/kvmfornfv_glossary.rst b/docs/glossary/kvmfornfv_glossary.rst new file mode 100644 index 000000000..adebc815a --- /dev/null +++ b/docs/glossary/kvmfornfv_glossary.rst @@ -0,0 +1,396 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +************** +OPNFV Glossary +************** +Colorado 1.0 +------------ + +======== +Contents +======== + +This glossary provides a common definition of phrases and words commonly used +in OPNFV. + +-------- + +A +- + +Arno + + A river running through Tuscany and the name of the first OPNFV release. + +API + + Application Programming Interface + +AVX2 + + Advanced Vector Extensions 2 is an instruction set extension for x86. + + +-------- + +B +- + +Brahmaputra + + A river running through Asia and the name of the Second OPNFV release. + +Bios + + Basic Input/Output System + +Builds + + Build in Jenkins is a version of a program. + +Bogomips + + Bogomips is the number of million times per second a processor can do + absolutely nothing. + +-------- + +C +- + +CAT + + Cache Automation Technology + +CentOS + + Community Enterprise Operating System is a Linux distribution + +CICD + + Continuous Integration and Continuous Deployment + +CLI + + Command Line Interface + +Colorado + + A river in Argentina and the name of the Third OPNFV release. + +Compute + + Compute is an OpenStack service which offers many configuration options + which may be deployment specific. + +Console + + Console is display screen. + +CPU + Central Processing Unit + +-------- + +D +- + +Data plane + + The data plane is the part of a network that carries user traffic. + +Debian/deb + + Debian is a Unix-like computer operating system that is composed entirely of + free software. + +Docs + + Documentation/documents + +DPDK + + Data Plane Development Kit + +DPI + + Deep Packet Inspection + +DSCP + + Differentiated Services Code Point + +-------- + +F +- + +Flavors + + Flavors are templates used to define VM configurations. + +Fuel + + Provides an intuitive, GUI-driven experience for deployment and management of OpenStack + +-------- + +H +- + +Horizon + + Horizon is an OpenStack service which serves as an UI. + +Hypervisor + + A hypervisor, also called a virtual machine manager, is a program that allows + multiple operating systems to share a single hardware host. + +-------- + +I +- + +IGMP + + Internet Group Management Protocol + +IOMMU + + Input-Output Memory Management Unit + +IOPS + + Input/Output Operations Per Second + +IRQ + + Interrupt ReQuest is an interrupt request sent from the hardware level to + the CPU. + +IRQ affinity + + IRQ affinity is the set of CPU cores that can service that interrupt. + +-------- + +J +- + +Jenkins + + Jenkins is an open source continuous integration tool written in Java. + +JIRA + + JIRA is a bug tracking software. + +Jitter + + Time difference in packet inter-arrival time to their destination can be called jitter. + +JumpHost + + A jump host or jump server or jumpbox is a computer on a network typically + used to manage devices in a separate security zone. + +-------- + +K +- + +Kernel + + The kernel is a computer program that constitutes the central core of a + computer's operating system. + +-------- + +L +- + +Latency + + The amount of time it takes a packet to travel from source to destination is + Latency. + +libvirt + + libvirt is an open source API, daemon and management tool for managing + platform virtualization. + +-------- + +M +- + +Migration + + Migration is the process of moving from the use of one operating environment + to another operating environment. + +-------- + +N +- + +NFV + + Network Functions Virtualisation, an industry initiative to leverage + virtualisation technologies in carrier networks. + +NFVI + + Network Function Virtualization Infrastructure + +NIC + + Network Interface Controller + +NUMA + + Non-Uniform Memory Access + +-------- + +O +- + +OPNFV + + Open Platform for NFV, an open source project developing an NFV reference + platform and features. + +-------- + +P +- + +Pharos + + Is a lighthouse and is a project deals with developing an OPNFV lab + infrastructure that is geographically and technically diverse. + +Pipeline + + A suite of plugins in Jenkins that lets you orchestrate automation. + +Platform + + OPNFV provides an open source platform for deploying NFV solutions that + leverages investments from a community of developers and solution providers. + +Pools + + A Pool is a set of resources that are kept ready to use, rather than acquired + on use and released afterwards. + +-------- + +Q +- + +Qemu + + QEMU is a free and open-source hosted hypervisor that performs hardware + virtualization. + +-------- + +R +- + +RDMA + + Remote Direct Memory Access (RDMA) + +Rest-Api + + REST (REpresentational State Transfer) is an architectural style, and an + approach to communications that is often used in the development of web + services + +-------- + +S +- + +Scaling + + Refers to altering the size. + +Slave + + Works with/for master.where master has unidirectional control over one or + more other devices. + +SR-IOV + + Single root IO- Virtualization. + +Spin locks + + A spinlock is a lock which causes a thread trying to acquire it to simply + wait in a loop while repeatedly checking if the lock is available. + +Storage + + Refers to computer components which store some data. + +-------- + +T +- + +Tenant + + A Tenant is a group of users who share a common access with specific + privileges to the software instance. + +Tickless + + A tickless kernel is an operating system kernel in which timer interrupts + do not occur at regular intervals, but are only delivered as required. + +TSC + + Technical Steering Committee + +-------- + +V +- + +VLAN + + A virtual local area network, typically an isolated ethernet network. + +VM + + Virtual machine, an emulation in software of a computer system. + +VNF + + Virtual network function, typically a networking application or function + running in a virtual environment. + +-------- + +X +- + +XBZRLE + + Helps to reduce the network traffic by just sending the updated data + +-------- + +Y +- + +Yardstick + + Yardstick is an infrastructure verification. It is an OPNFV testing project. diff --git a/docs/installationprocedure/abstract.rst b/docs/installationprocedure/abstract.rst new file mode 100644 index 000000000..728f0aa1c --- /dev/null +++ b/docs/installationprocedure/abstract.rst @@ -0,0 +1,7 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +This document will give the user instructions on how to deploy available +KVM4NFV CICD build scenario verfied for the Colorado release of the OPNFV +platform. diff --git a/docs/installationprocedure/index.rst b/docs/installationprocedure/index.rst new file mode 100644 index 000000000..00ccaf237 --- /dev/null +++ b/docs/installationprocedure/index.rst @@ -0,0 +1,17 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +********************** +Installation procedure +********************** +Colorado 1.0 +------------ + +.. toctree:: + :numbered: + :maxdepth: 2 + + abstract.rst + kvm4nfv-cicd.installation.instruction.rst + kvm4nfv-cicd.release.notes.rst diff --git a/docs/installationprocedure/kvm4nfv-cicd.installation.instruction.rst b/docs/installationprocedure/kvm4nfv-cicd.installation.instruction.rst new file mode 100644 index 000000000..54886668d --- /dev/null +++ b/docs/installationprocedure/kvm4nfv-cicd.installation.instruction.rst @@ -0,0 +1,74 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +===================================== +KVM4NFV CICD Installation Instruction +===================================== + +Preparing the installation +-------------------------- + +The OPNFV project- KVM4NFV (https://gerrit.opnfv.org/gerrit/kvmfornfv.git) is +cloned first, to make the build scripts for Qemu & Kernel, Rpms and Debians +available. + +HW requirements +--------------- + +These build scripts are triggered on the Jenkins-Slave build server. Currently +Intel POD1 is used as test environment for kvmfornfv to execute cyclictest. As +part of this test environment Intel pod1-jump is configured as jenkins slave +and all the latest build artifacts are downloaded on to it. Intel pod1-node1 +is the host on which a guest vm will be launched as a part of running cylictest +through yardstick. + +Build instructions +------------------ + +Builds are possible for the following packages- + +**kvmfornfv source code**- The ./ci/build.sh is the main script used to trigger +the Rpms (on 'centos') and Debians (on 'ubuntu') builds in this case. + +* How to build Kernel/Qemu Rpms- To build rpm packages, build.sh script is run + with -p and -o option (i.e. if -p package option is passed as "centos" or in + default case). Example: sh ./ci/build.sh -p centos -o build_output + +* How to build Kernel/Qemu Debians- To build debian packages, build.sh script + is run with -p and -o option (i.e. if -p package option is passed as + "ubuntu"). Example: sh ./ci/build.sh -p ubuntu -o build_output + +* How to build all Kernel & Qemu, Rpms & Debians- To build both debian and rpm + packages, build.sh script is run with -p and -o option (i.e. if -p package + option is passed as "both"). Example: sh ./ci/build.sh -p both -o build_output + +Installation instructions +------------------------- + +Installation can be done in the following ways- + +**1. From kvmfornfv source code**- +The build packages that are prepared in the above section, are installed +differently depending on the platform. + +Please visit the links for each- + +* Centos : https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-rpm-using.html +* Ubuntu : https://help.ubuntu.com/community/InstallingSoftware + +Test the built packages by executing the scripts present in ci/envs for +configuring host and guest respectively. Once the setup is in place, cyclictest +is performed via yardtick, using ./ci/test_kvmfornfv.sh + +**2. Using Fuel installer**- + +* Please refer to the document present at /fuel-plugin/README.md + +Post-installation activities +---------------------------- + +After the rpm and debian builds are deployed successfully on the host-guest and +give the expected cyclictest results, jenkins gives +1 to indicate the +completion of verify process. Thereafter, the releng executes the merge process +to merge this code into parent repository. diff --git a/docs/installationprocedure/kvm4nfv-cicd.release.notes.rst b/docs/installationprocedure/kvm4nfv-cicd.release.notes.rst new file mode 100644 index 000000000..a54fe0b11 --- /dev/null +++ b/docs/installationprocedure/kvm4nfv-cicd.release.notes.rst @@ -0,0 +1,138 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +============================= +Release Note for KVM4NFV CICD +============================= + + +Abstract +======== + +This document contains the release notes for the Colorado release of +OPNFV when using KVM4NFV CICD process. + +Introduction +============ + +Provide a brief introduction of how this configuration is used in OPNFV release +using KVM4VFV CICD as scenario. + +Be sure to reference your scenario installation instruction. + +Release Data +============ + ++--------------------------------------+--------------------------------------+ +| **Project** | NFV Hypervisors-KVM | +| | | ++--------------------------------------+--------------------------------------+ +| **Repo/tag** | kvmfornfv | +| | | ++--------------------------------------+--------------------------------------+ +| **Release designation** | | +| | | ++--------------------------------------+--------------------------------------+ +| **Release date** | | +| | | ++--------------------------------------+--------------------------------------+ +| **Purpose of the delivery** | Automate the KVM4VFV CICD scenario | +| | | ++--------------------------------------+--------------------------------------+ + +Deliverables +------------ + +Software deliverables +~~~~~~~~~~~~~~~~~~~~~ +Kernel and Qemu- RPM and Debian build packages + +Documentation deliverables +~~~~~~~~~~~~~~~~~~~~~~~~~~ +- KVM4NFV CICD process documentation available under /docs/ under + various categories. + +Version change +-------------- +.. This section describes the changes made since the last version of this +.. document. + +Module version change +~~~~~~~~~~~~~~~~~~~~~ +- Build scripts made available for Kernel rpm, Kernel deb, Qemu rpm, Qemu + deb packages. +- Releng scripts made available to trigger these kvm4nfv build scripts for + automating complete CICD process. + +Document version change +~~~~~~~~~~~~~~~~~~~~~~~ +The following documents are added- +- configurationguide +- instalationprocedure +- userguide +- overview +- glossary +- releasenotes + +Reason for new version +---------------------- + +Feature additions +~~~~~~~~~~~~~~~~~ + ++--------------------------------------+--------------------------------------+ +| **JIRA REFERENCE** | **SLOGAN** | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | NFV Hypervisors-KVMKVMFORNFV-34 | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | NFV Hypervisors-KVMKVMFORNFV-34 | +| | | ++--------------------------------------+--------------------------------------+ + +Bug corrections +~~~~~~~~~~~~~~~ + +**JIRA TICKETS:** + ++--------------------------------------+--------------------------------------+ +| **JIRA REFERENCE** | **SLOGAN** | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | | +| | | ++--------------------------------------+--------------------------------------+ + + +Known Limitations, Issues and Workarounds +========================================= + +System Limitations +------------------ + +Known issues +------------ + +**JIRA TICKETS:** + ++--------------------------------------+--------------------------------------+ +| **JIRA REFERENCE** | **SLOGAN** | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | | ++--------------------------------------+--------------------------------------+ +| JIRA: | | ++--------------------------------------+--------------------------------------+ + + +Workarounds +----------- +See JIRA: + + +References +========== +For more information on the OPNFV Brahmaputra release, please visit +http://www.opnfv.org/brahmaputra diff --git a/docs/overview/kvmfornfv_overview.rst b/docs/overview/kvmfornfv_overview.rst new file mode 100644 index 000000000..87d401bf0 --- /dev/null +++ b/docs/overview/kvmfornfv_overview.rst @@ -0,0 +1,25 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +============================= +KMV4MFV CICD Project Overview +============================= + +The detailed understanding of this project is organized into different sections- + +* userguide - This provides the required technical assistance to the user, in + using the KVM4NFV CICD process. +* installationprocedure- This will give the user instructions on how to deploy + available KVM4NFV CICD build scenario. +* configurationguide- This provides guidance for configuring KVM4NFV + environment, even with the use of specific installer tools for deploying some + components, available in the Colorado release of OPNFV. +* requirements- This includes the introduction of KVM4NFV CICD project, + specifications of how the project should work, and constraints placed upon + its execution. +* design- This includes the parameters or design considerations taken into + account for achieving minimal interrupt latency for the data VNFs. +* releasenotes- This describes a brief summary of recent changes, enhancements + and bug fixes in the KVM4NFV project. +* glossary- It includes the definition of terms, used in the KVM4NFV project diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst new file mode 100644 index 000000000..9ae91bf0f --- /dev/null +++ b/docs/releasenotes/index.rst @@ -0,0 +1,11 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +========================= +KVM4NFV CICD Release Note +========================= + +.. toctree:: + :maxdepth: 2 + + release-notes diff --git a/docs/releasenotes/release-notes.rst b/docs/releasenotes/release-notes.rst new file mode 100644 index 000000000..c6013d2ef --- /dev/null +++ b/docs/releasenotes/release-notes.rst @@ -0,0 +1,174 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +===================================================== +OPNFV Release Note for "Colorado release" - KVMFORNFV +===================================================== + +.. _Kvmfornfv: https://wiki.opnfv.org/display/kvm/ + + +Abstract +======== + +This document provides the release notes for Colorado release of KVMFORNFV. + +License +======= + +KVMFORNFV is licensed under a Creative Commons Attribution 4.0 International +License.You should have received a copy of the license along with this. If not, +see . + + +**Contents** + +1 Version History + +2 Important notes + +3 Summary + +4 Delivery Data + +5 References + +1 Version history +=================== + ++--------------------+--------------------+--------------------+--------------------+ +| **Date** | **Ver.** | **Author** | **Comment** | +| | | | | ++--------------------+--------------------+--------------------+--------------------+ +|2016-08-22 | 0.1.0 | | Colorado release | +| | | | | ++--------------------+--------------------+--------------------+--------------------+ + +2 Important notes +=================== + +The software delivered in the OPNFV KVMFORNFV_ Project, comprises the +*ci*, the *kvmfornfv test cases*. + +The *KVMFORNFV* framework depends on the *Fuel* installer. + + +3 Summary +=========== + +This Colorado release provides *KVMFORNFV* as a framework to enhance the +KVM Hypervisor for NFV and OPNFV scenario testing, automated in the OPNFV +CI pipeline, including: + +* Documentation created + + * User Guide + + * Configuration Guide + + * Installation Procedure + + * Release notes (this document) + +* KVMFORNFV source code + +* Cyclictests for KVMFORNFV + +For Colorado release, the KVMFORNFV uses for the following: + +* Automation of building the Kernel and qemu RPM's or debians + +* Executing the Cyclictests to check the latency + +* os-sdn-kvm-ha Scenario testing for High Availability Configuration using + Fuel Installer + +The *KVMFORNFV framework* is developed in the OPNFV community, by the +KVMFORNFV_ team. + +4 Release Data +================ + ++--------------------------------------+--------------------------------------+ +| **Project** | NFV Hypervisors-KVM | +| | | ++--------------------------------------+--------------------------------------+ +| **Repo/commit-ID** | kvmfornfv | +| | | ++--------------------------------------+--------------------------------------+ +| **Release designation** | Colorado | +| | | ++--------------------------------------+--------------------------------------+ +| **Release date** | 2016-08-22 | +| | | ++--------------------------------------+--------------------------------------+ +| **Purpose of the delivery** | OPNFV Colorado Releases | +| | | ++--------------------------------------+--------------------------------------+ + +4.1 Version change +------------------ + +4.1.1 Module version changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This is the first tracked release of KVMFORNFV + + +4.1.2 Document version changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This is the initial version of the KVMFORNFV framework in OPNFV. + +4.2 Reason for version +---------------------- + +4.2.1 Feature additions +~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------------------------------+--------------------------------------+ +| **JIRA REFERENCE** | **SLOGAN** | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | NFV Hypervisors-KVMKVMFORNFV-34 | +| | | ++--------------------------------------+--------------------------------------+ +| JIRA: | NFV Hypervisors-KVMKVMFORNFV-34 | +| | | ++--------------------------------------+--------------------------------------+ + +4.2.2 Bug corrections +~~~~~~~~~~~~~~~~~~~~~ + +Initial Release + +4.3 Deliverables +---------------- + +4.3.1 Software deliverables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +KVMFORNFV framework source code + +4.3.2 Documentation deliverables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The below documents are delivered for Colorado KVMFORNFV Release: + + * User Guide + + * Configuration Guide + + * Installation Procedure + + * Overview + + * Release notes (this document) + + * Glossary + + +5 References +============= + +For more information on the KVMFORNFV Colorado release, please see: + +https://wiki.opnfv.org/display/kvm/ diff --git a/docs/requirements/index.rst b/docs/requirements/index.rst new file mode 100755 index 000000000..42dba0422 --- /dev/null +++ b/docs/requirements/index.rst @@ -0,0 +1,12 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +================ +KVMFORNFV Design +================ + +.. toctree:: + :numbered: + :maxdepth: 3 + + kvmfornfv_requirements.rst diff --git a/docs/requirements/kvmfornfv_requirements.rst b/docs/requirements/kvmfornfv_requirements.rst new file mode 100644 index 000000000..048838907 --- /dev/null +++ b/docs/requirements/kvmfornfv_requirements.rst @@ -0,0 +1,89 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) OPNFV, Intel Corporation, AT&T and others. + +============ +Introduction +============ +The NFV hypervisors provide crucial functionality in the NFV +Infrastructure(NFVI).The existing hypervisors, however, are not necessarily +designed or targeted to meet the requirements for the NFVI. + +This document specifies the list of requirements that need to be met as part +of this "NFV Hypervisors-KVM" project in Colorado release. + +As part of this project we need to make collaborative efforts towards enabling +the NFV features. + +================= +Scope and Purpose +================= + +The main purpose of this project is to enhance the KVM hypervisor for NFV, by +looking at the following areas initially: + +* Minimal Interrupt latency variation for data plane VNFs: + * Minimal Timing Variation for Timing correctness of real-time VNFs + * Minimal packet latency variation for data-plane VNFs +* Inter-VM communication +* Fast live migration + +The output of this project would be list of the performance goals,comprehensive +instructions for the system configurations,tools to measure Performance and +interrupt latency. + +=========================== +Methods and Instrumentation +=========================== + +The above areas would require software development and/or specific hardware +features, and some need just configurations information for the system +(hardware, BIOS, OS, etc.). + +A right configuration is critical for improving the NFV performance/latency. +Even working on the same code base, different configurations can make +completely different performance/latency result. +Configurations that can be made as part of this project to tune a specific +scenario are: + + 1. **Platform Configuration** : Some hardware features like Power management, + Hyper-Threading,Legacy USB Support/Port 60/64 Emulation,SMI can be configured. + 2. **Operating System Configuration** : Some configuration features like CPU + isolation,Memory allocation,IRQ affinity,Device assignment for VM,Tickless, + TSC,Idle,_RCU_NOCB_,Disable the RT throttling,NUMA can be configured. + 3. **Performance/Latency Tuning** : Application level configurations like + timers,Making vfio MSI interrupt as non-threaded,Cache Allocation + Technology(CAT) enabling can be tuned to improve the NFV + performance/latency. + +===================== +Features to be tested +===================== + +The tests that need to be conducted to make sure that latency is addressed are: +1. Timer test +2. Device Interrupt Test +3. Packet forwarding (DPDK OVS) +4. Packet Forwarding (SR-IOV) +5. Bare-metal Packet Forwarding + +============ +Dependencies +============ + +1. OPNFV Project: “Characterize vSwitch Performance for Telco NFV Use Cases” + (VSPERF) for performance evaluation of ivshmem vs. vhost-user. +2. OPNFV Project: “Pharos” for Test Bed Infrastructure, and possibly + “Yardstick” for infrastructure verification. +3. There are currently no similar projects underway in OPNFV or in an upstream + project +4. The relevant upstream project to be influenced here is QEMU/KVM and + libvirt. +5. In terms of HW dependencies, the aim is to use standard IA Server hardware + for this project, as provided by OPNFV Pharos. + +========= +Reference +========= + +https://wiki.opnfv.org/display/kvm/ diff --git a/docs/userguide/abstract.rst b/docs/userguide/abstract.rst new file mode 100644 index 000000000..8c36c268f --- /dev/null +++ b/docs/userguide/abstract.rst @@ -0,0 +1,16 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +======== +Abstract +======== + +In KVM4NFV project, we focus on the KVM hypervisor to enhance it for NFV, +by looking at the following areas initially- + +* Minimal Interrupt latency variation for data plane VNFs: + * Minimal Timing Variation for Timing correctness of real-time VNFs + * Minimal packet latency variation for data-plane VNFs +* Inter-VM communication +* Fast live migration diff --git a/docs/userguide/common.platform.render.rst b/docs/userguide/common.platform.render.rst new file mode 100644 index 000000000..486ca469f --- /dev/null +++ b/docs/userguide/common.platform.render.rst @@ -0,0 +1,15 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +================================ +Using common platform components +================================ + +This section outlines basic usage principals and methods for some of the +commonly deployed components of supported OPNFV scenario's in Colorado. +The subsections provide an outline of how these components are commonly +used and how to address them in an OPNFV deployment.The components derive +from autonomous upstream communities and where possible this guide will +provide direction to the relevant documentation made available by those +communities to better help you navigate the OPNFV deployment. diff --git a/docs/userguide/feature.userguide.render.rst b/docs/userguide/feature.userguide.render.rst new file mode 100644 index 000000000..d903f0711 --- /dev/null +++ b/docs/userguide/feature.userguide.render.rst @@ -0,0 +1,14 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +========================== +Using Colorado Features +========================== + +The following sections of the user guide provide feature specific usage +guidelines and references for KVM4NFV CICD project. + +* /docs/userguide/low_latency.userguide.rst +* /docs/userguide/live_migration.userguide.rst +* /docs/userguide/tuning.userguide.rst diff --git a/docs/userguide/index.rst b/docs/userguide/index.rst new file mode 100644 index 000000000..55042ec04 --- /dev/null +++ b/docs/userguide/index.rst @@ -0,0 +1,20 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +**************** +OPNFV User Guide +**************** +Colorado 1.0 +------------ + +.. toctree:: + :maxdepth: 2 + + ./abstract.rst + ./introduction.rst + ./common.platform.render.rst + ./feature.userguide.render.rst + ./low_latency.userguide.rst + ./live_migration.userguide.rst + ./tuning.userguide.rst diff --git a/docs/userguide/introduction.rst b/docs/userguide/introduction.rst new file mode 100644 index 000000000..501d6391b --- /dev/null +++ b/docs/userguide/introduction.rst @@ -0,0 +1,53 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +======== +Overview +======== + +The project "NFV Hypervisors-KVM" makes collaborative efforts to enable NFV +features for existing hypervisors, which are not necessarily designed or +targeted to meet the requirements for the NFVI.The KVM4NFV CICD scenario +consists of Continuous Integration builds, deployments and testing +combinations of virtual infrastructure components. + +KVM4NFV Features +================ + +Using this project, the following areas are targeted- + +* Minimal Interrupt latency variation for data plane VNFs: + * Minimal Timing Variation for Timing correctness of real-time VNFs + * Minimal packet latency variation for data-plane VNFs +* Inter-VM communication +* Fast live migration + +Some of the above items would require software development and/or specific +hardware features, and some need just configurations information for the +system (hardware, BIOS, OS, etc.). + +We include a requirements gathering stage as a formal part of the project. +For each subproject, we will start with an organized requirement stage so +that we can determine specific use cases (e.g. what kind of VMs should be +live migrated) and requirements (e.g. interrupt latency, jitters, Mpps, +migration-time, down-time, etc.) to set out the performance goals. + +Potential future projects would include: + +* Dynamic scaling (via scale-out) using VM instantiation +* Fast live migration for SR-IOV + +The user guide outlines how to work with key components and features in +the platform, each feature description section will indicate the scenarios +that provide the components and configurations required to use it. + +The configuration guide details which scenarios are best for you and how to +install and configure them. + +General usage guidelines +======================== + +The user guide for KVM4NFV CICD features and capabilities provide step by step +instructions for using features that have been configured according to the +installation and configuration instructions. diff --git a/docs/all/live_migration.rst b/docs/userguide/live_migration.userguide.rst similarity index 82% rename from docs/all/live_migration.rst rename to docs/userguide/live_migration.userguide.rst index 4af19b6f4..9fa9b82fd 100644 --- a/docs/all/live_migration.rst +++ b/docs/userguide/live_migration.userguide.rst @@ -1,13 +1,13 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. + .. http://creativecommons.org/licenses/by/4.0 -.. (c) Fast Live Migration =================== -The NFV project requires fast live migration. The specific requirement is total -live migration time < 2Sec, while keeping the VM down time < 10ms when running -DPDK L2 forwarding workload. +The NFV project requires fast live migration. The specific requirement is +total live migration time < 2Sec, while keeping the VM down time < 10ms when +running DPDK L2 forwarding workload. We measured the baseline data of migrating an idle 8GiB guest running a DPDK L2 forwarding work load and observed that the total live migration time was 2271ms @@ -50,9 +50,10 @@ a. Delay non-emergency operations is completed the VM down time is reduced to about 5-7ms. b. Optimize zero page checking Currently QEMU uses the SSE2 instruction to optimize the zero pages - checking. The SSE2 instruction can process 16 bytes per instruction. By using - the AVX2 instruction, we can process 32 bytes per instruction. Testingt shows - that using AVX2 can speed up the zero pages checking process by about 25%. + checking. The SSE2 instruction can process 16 bytes per instruction. + By using the AVX2 instruction, we can process 32 bytes per instruction. + Testing shows that using AVX2 can speed up the zero pages checking process + by about 25%. c. Remove unnecessary context synchronization. The CPU context was being synchronized twice during live migration. Removing this unnecessary synchronization shortened the VM downtime by about 100us. @@ -69,10 +70,18 @@ OS: RHEL 7.1 Kernel: 4.2 QEMU v2.4.0 -Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) +Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit +X540-AT2 (rev 01) QEMU parameters: :: - /root/qemu.git/x86_64-softmmu/qemu-system-x86_64-enable-kvm -cpu host -smp 4 –device virtio-net-pci,netdev=net1,mac=52:54:00:12:34:56 –netdev type=tap,id=net1,script=/etc/kvm/qemu-ifup,downscript=no,vhost=on–device virtio-net-pci,netdev=net2,mac=54:54:00:12:34:56 –netdevtype=tap,id=net2,script=/etc/kvm/qemu-ifup2,downscript=no,vhost=on -balloon virtio -m 8192-monitor stdio /mnt/liang/ia32e_rhel6u5.qcow +${qemu} -smp ${guest_cpus} -monitor unix:${qmp_sock},server,nowait -daemonize \ +-cpu host,migratable=off,+invtsc,+tsc-deadline,pmu=off \ +-realtime mlock=on -mem-prealloc -enable-kvm -m 1G \ +-mem-path /mnt/hugetlbfs-1g \ +-drive file=/root/minimal-centos1.qcow2,cache=none,aio=threads \ +-netdev user,id=guest0,hostfwd=tcp:5555-:22 \ +-device virtio-net-pci,netdev=guest0 \ +-nographic -serial /dev/null -parallel /dev/null Network connection diff --git a/docs/all/lmdowntime.jpg b/docs/userguide/lmdowntime.jpg similarity index 100% rename from docs/all/lmdowntime.jpg rename to docs/userguide/lmdowntime.jpg diff --git a/docs/all/lmnetwork.jpg b/docs/userguide/lmnetwork.jpg similarity index 100% rename from docs/all/lmnetwork.jpg rename to docs/userguide/lmnetwork.jpg diff --git a/docs/all/lmtotaltime.jpg b/docs/userguide/lmtotaltime.jpg similarity index 100% rename from docs/all/lmtotaltime.jpg rename to docs/userguide/lmtotaltime.jpg diff --git a/docs/userguide/low_latency.userguide.rst b/docs/userguide/low_latency.userguide.rst new file mode 100644 index 000000000..df4581506 --- /dev/null +++ b/docs/userguide/low_latency.userguide.rst @@ -0,0 +1,68 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +Low Latency Environment +======================= + +Achieving low latency with the KVM4NFV project requires setting up a special +test environment. This environment includes the BIOS settings, kernel +configuration, kernel parameters and the run-time environment. + +Hardware Environment Description +-------------------------------- + +BIOS setup plays an important role in achieving real-time latency. A collection +of relevant settings, used on the platform where the baseline performance data +was collected, is detailed below: + +CPU Features +~~~~~~~~~~~~ + +Some special CPU features like TSC-deadline timer, invariant TSC and Process +posted interrupts, etc, are helpful for latency reduction. + +CPU Topology +~~~~~~~~~~~~ + +NUMA topology is also important for latency reduction. + +BIOS Setup +~~~~~~~~~~ + +Careful BIOS setup is important in achieving real time latency. Different +platforms have different BIOS setups, below are the important BIOS settings on +the platform used to collect the baseline performance data. + +Software Environment Setup +-------------------------- +Both the host and the guest environment need to be configured properly to +reduce latency variations. Below are some suggested kernel configurations. +The ci/envs/ directory gives detailed implementation on how to setup the +environment. + +Kernel Parameter +~~~~~~~~~~~~~~~~ + +Please check the default kernel configuration in the source code at: +kernel/arch/x86/configs/opnfv.config. + +Below is host kernel boot line example: +:: +isolcpus=11-15,31-35 nohz_full=11-15,31-35 rcu_nocbs=11-15,31-35 +iommu=pt intel_iommu=on default_hugepagesz=1G hugepagesz=1G mce=off idle=poll +intel_pstate=disable processor.max_cstate=1 pcie_asmp=off tsc=reliable + +Below is guest kernel boot line example +:: +isolcpus=1 nohz_full=1 rcu_nocbs=1 mce=off idle=poll default_hugepagesz=1G +hugepagesz=1G + +Please refer to `tunning.userguide` for more explanation. + +Run-time Environment Setup +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Not only are special kernel parameters needed but a special run-time +environment is also required. Please refer to `tunning.userguide` for +more explanation. diff --git a/docs/userguide/openstack.rst b/docs/userguide/openstack.rst new file mode 100644 index 000000000..bd1919991 --- /dev/null +++ b/docs/userguide/openstack.rst @@ -0,0 +1,51 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. http://creativecommons.org/licenses/by/4.0 + +-------------------------------- +Colorado OpenStack User Guide +-------------------------------- + +OpenStack is a cloud operating system developed and released by the +`OpenStack project `_. OpenStack is used in OPNFV +for controlling pools of compute, storage, and networking resources in a Pharos +compliant infrastructure. + +OpenStack is used in Colorado to manage tenants (known in OpenStack as +projects),users, services, images, flavours, and quotas across the Pharos +infrastructure.The OpenStack interface provides the primary interface for an +operational Colorado deployment and it is from the "horizon console" that an +OPNFV user will perform the majority of administrative and operational +activities on the deployment. + +OpenStack references +-------------------- + +The `OpenStack user guide `_ provides +details and descriptions of how to configure and interact with the OpenStack +deployment.This guide can be used by lab engineers and operators to tune the +OpenStack deployment to your liking. + +Once you have configured OpenStack to your purposes, or the Colorado +deployment meets your needs as deployed, an operator, or administrator, will +find the best guidance for working with OpenStack in the +`OpenStack administration guide `_. + +Connecting to the OpenStack instance +------------------------------------ + +Once familiar with the basic of working with OpenStack you will want to connect +to the OpenStack instance via the Horizon Console. The Horizon console provide +a Web based GUI that will allow you operate the deployment. +To do this you should open a browser on the JumpHost to the following address +and enter the username and password: + + + http://{Controller-VIP}:80/index.html> + username: admin + password: admin + +Other methods of interacting with and configuring OpenStack,, like the REST API +and CLI are also available in the Colorado deployment, see the +`OpenStack administration guide `_ +for more information on using those interfaces. diff --git a/docs/all/tuning.rst b/docs/userguide/tuning.userguide.rst similarity index 70% rename from docs/all/tuning.rst rename to docs/userguide/tuning.userguide.rst index 760861b8b..3673ae2d4 100644 --- a/docs/all/tuning.rst +++ b/docs/userguide/tuning.userguide.rst @@ -1,13 +1,13 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. + .. http://creativecommons.org/licenses/by/4.0 -.. (c) Low Latency Tunning Suggestion ============================== -The correct configuration is critical for improving the NFV performance/latency. -Even working on the same codebase, configurations can cause wildly different -performance/latency results. +The correct configuration is critical for improving the NFV +performance/latency.Even working on the same codebase, configurations can cause +wildly different performance/latency results. There are many combinations of configurations, from hardware configuration to Operating System configuration and application level configuration. And there @@ -24,10 +24,10 @@ but others may not be configurable (e.g. SMI on most platforms). * **Power management:** Most power management related features save power at the expensive of latency. These features include: Intel®Turbo Boost Technology, - Enhanced Intel®SpeedStep, Processor C state and P state. Normally they should - be disabled but, depending on the real-time application design and latency - requirements, there might be some features that can be enabled if the impact on - deterministic execution of the workload is small. + Enhanced Intel®SpeedStep, Processor C state and P state. Normally they + should be disabled but, depending on the real-time application design and + latency requirements, there might be some features that can be enabled if + the impact on deterministic execution of the workload is small. * **Hyper-Threading:** The logic cores that share resource with other logic cores can introduce @@ -41,7 +41,8 @@ but others may not be configurable (e.g. SMI on most platforms). * **SMI (System Management Interrupt):** SMI runs outside of the kernel code and can potentially cause latency. It is a pity there is no simple way to disable it. Some vendors may - provide related switches in BIOS but most machines do not have this capability. + provide related switches in BIOS but most machines do not have this + capability. Operating System Configuration ------------------------------ @@ -54,32 +55,32 @@ Operating System Configuration for more information. * **Memory allocation:** - Memory shoud be reserved for realtime applications and usually hugepage should - be used to reduce page fauts/TLB misses. + Memory shoud be reserved for realtime applications and usually hugepage + should be used to reduce page fauts/TLB misses. * **IRQ affinity:** All the non-realtime IRQs should be affinitized to non realtime CPUs to - reduce the impact on realtime CPUs. Some OS distributions contain an irqbalance - daemon which balances the IRQs among all the cores dynamically. It should be - disabled as well. + reduce the impact on realtime CPUs. Some OS distributions contain an + irqbalance daemon which balances the IRQs among all the cores dynamically. + It should be disabled as well. * **Device assignment for VM:** - If a device is used in a VM, then device passthrough is desirable. In this case, - the IOMMU should be enabled. + If a device is used in a VM, then device passthrough is desirable. In this + case,the IOMMU should be enabled. * **Tickless:** - Frequent clock ticks cause latency. CONFIG_NOHZ_FULL should be enabled in the - linux kernel. With CONFIG_NOHZ_FULL, the physical CPU will trigger many fewer - clock tick interrupts(currently, 1 tick per second). This can reduce latency - because each host timer interrupt triggers a VM exit from guest to host which - causes performance/latency impacts. + Frequent clock ticks cause latency. CONFIG_NOHZ_FULL should be enabled in + the linux kernel. With CONFIG_NOHZ_FULL, the physical CPU will trigger many + fewer clock tick interrupts(currently, 1 tick per second). This can reduce + latency because each host timer interrupt triggers a VM exit from guest to + host which causes performance/latency impacts. * **TSC:** Mark TSC clock source as reliable. A TSC clock source that seems to be - unreliable causes the kernel to continuously enable the clock source watchdog - to check if TSC frequency is still correct. On recent Intel platforms with - Constant TSC/Invariant TSC/Synchronized TSC, the TSC is reliable so the - watchdog is useless but cause latency. + unreliable causes the kernel to continuously enable the clock source + watchdog to check if TSC frequency is still correct. On recent Intel + platforms with Constant TSC/Invariant TSC/Synchronized TSC, the TSC is + reliable so the watchdog is useless but cause latency. * **Idle:** The poll option forces a polling idle loop that can slightly improve the @@ -92,9 +93,9 @@ Operating System Configuration * **Disable the RT throttling:** RT Throttling is a Linux kernel mechanism that - occurs when a process or thread uses 100% of the core, leaving no resources for - the Linux scheduler to execute the kernel/housekeeping tasks. RT Throttling - increases the latency so should be disabled. + occurs when a process or thread uses 100% of the core, leaving no resources + for the Linux scheduler to execute the kernel/housekeeping tasks. RT + Throttling increases the latency so should be disabled. * **NUMA configuration:** To achieve the best latency. CPU/Memory and device allocated for realtime -- 2.16.6