CSIT-618 Release report update VII 30/7730/6
authorPeter Mikus <pmikus@cisco.com>
Mon, 24 Jul 2017 12:22:02 +0000 (14:22 +0200)
committerPeter Mikus <pmikus@cisco.com>
Mon, 24 Jul 2017 13:30:55 +0000 (15:30 +0200)
Change-Id: Ide7771b59cc3ee7619502a6805c8401528a8c874
Signed-off-by: Peter Mikus <pmikus@cisco.com>
docs/report/vpp_functional_tests/csit_release_notes.rst
docs/report/vpp_performance_tests/packet_latency_graphs/l2.rst
docs/report/vpp_performance_tests/packet_throughput_graphs/ipsec.rst
docs/report/vpp_performance_tests/packet_throughput_graphs/l2.rst
resources/tools/report_gen/run_report.sh

index fd71d78..08fe870 100644 (file)
@@ -21,7 +21,7 @@ Changes in CSIT |release|
 
    - Complete CSIT framework code revision and optimizations as descried
      on CSIT wiki page
-     _`Design_Optimizations <https://wiki.fd.io/view/CSIT/Design_Optimizations>`_;
+     `Design_Optimizations <https://wiki.fd.io/view/CSIT/Design_Optimizations>`_;
 
    - For more detail see the CSIT Framework Design section in this
      report;
index c46fd03..d6e76a7 100644 (file)
@@ -11,9 +11,15 @@ VPP packet latency in 1t1c setup (1thread, 1core) is presented in the graph belo
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-ndrdisc-lat50.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel1-ndrdisc-lat50.html"></iframe>
 
-*Figure 1. VPP 1thread 1core - packet latency for Phy-to-Phy L2 Ethernet Switching.*
+*Figure 1a. VPP 1thread 1core - packet latency for Phy-to-Phy L2 Ethernet Switching.*
+
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel2-ndrdisc-lat50.html"></iframe>
+
+*Figure 1b. VPP 1thread 1core - packet latency for Phy-to-Phy L2 Ethernet Switching.*
 
 CSIT source code for the test cases used for above plots can be found in CSIT
 git repository:
@@ -25,9 +31,15 @@ VPP packet latency in 2t2c setup (2thread, 2core) is presented in the graph belo
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-ndrdisc-lat50.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel1-ndrdisc-lat50.html"></iframe>
+
+*Figure 2a. VPP 2threads 2cores - packet latency for Phy-to-Phy L2 Ethernet Switching.*
+
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel2-ndrdisc-lat50.html"></iframe>
 
-*Figure 2. VPP 2threads 2cores - packet latency for Phy-to-Phy L2 Ethernet Switching.*
+*Figure 2b. VPP 2threads 2cores - packet latency for Phy-to-Phy L2 Ethernet Switching.*
 
 CSIT source code for the test cases used for above plots can be found in CSIT
 git repository:
index ebd7875..eba3a40 100644 (file)
@@ -10,11 +10,6 @@ Performance is reported for VPP running in multiple configurations of
 VPP worker thread(s), a.k.a. VPP data plane thread(s), and their
 physical CPU core(s) placement.
 
-Note: only 1,000 scale IPSec tunnel test cases are plotted. Single IPSec
-tunnel test cases are listed in regex outputs, but marked {NOT PLOTTED}
-due to the current limitation of auto-plotting scripts. For all test
-result data please refere to **Detailed Test Results** section.
-
 NDR Throughput
 ~~~~~~~~~~~~~~
 
index 37ac157..4acc65a 100644 (file)
@@ -15,9 +15,16 @@ in the graph below.
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-ndrdisc.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel1-ndrdisc.html"></iframe>
 
-*Figure 1. VPP 1thread 1core - NDR Throughput for Phy-to-Phy L2 Ethernet
+*Figure 1a. VPP 1thread 1core - NDR Throughput for Phy-to-Phy L2 Ethernet
+Switching.*
+
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel2-ndrdisc.html"></iframe>
+
+*Figure 1b. VPP 1thread 1core - NDR Throughput for Phy-to-Phy L2 Ethernet
 Switching.*
 
 CSIT source code for the test cases used for above plots can be found in CSIT
@@ -31,9 +38,16 @@ in the graph below.
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-ndrdisc.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel1-ndrdisc.html"></iframe>
+
+*Figure 2a. VPP 2threads 2cores - NDR Throughput for Phy-to-Phy L2 Ethernet
+Switching.*
+
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel2-ndrdisc.html"></iframe>
 
-*Figure 2. VPP 2threads 2cores - NDR Throughput for Phy-to-Phy L2 Ethernet
+*Figure 2b. VPP 2threads 2cores - NDR Throughput for Phy-to-Phy L2 Ethernet
 Switching.*
 
 CSIT source code for the test cases used for above plots can be found in CSIT
@@ -50,9 +64,16 @@ in the graph below. PDR measured for 0.5% packet loss ratio.
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-pdrdisc.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel1-pdrdisc.html"></iframe>
 
-*Figure 3. VPP 1thread 1core - PDR Throughput for Phy-to-Phy L2 Ethernet
+*Figure 3a. VPP 1thread 1core - PDR Throughput for Phy-to-Phy L2 Ethernet
+Switching.*
+
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-1t1c-l2-sel2-pdrdisc.html"></iframe>
+
+*Figure 3b. VPP 1thread 1core - PDR Throughput for Phy-to-Phy L2 Ethernet
 Switching.*
 
 CSIT source code for the test cases used for above plots can be found in CSIT
@@ -66,13 +87,12 @@ in the graph below. PDR measured for 0.5% packet loss ratio.
 
 .. raw:: html
 
-    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-pdrdisc.html"></iframe>
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel1-pdrdisc.html"></iframe>
 
-*Figure 4. VPP 2thread 2core - PDR Throughput for Phy-to-Phy L2 Ethernet
+*Figure 4a. VPP 2thread 2core - PDR Throughput for Phy-to-Phy L2 Ethernet
 Switching.*
 
-CSIT source code for the test cases used for above plots can be found in CSIT
-git repository:
+.. raw:: html
+
+    <iframe width="700" height="1000" frameborder="0" scrolling="no" src="../../_static/vpp/64B-2t2c-l2-sel2-pdrdisc.html"></iframe>
 
-.. program-output:: cd ../../ && set -x && cd tests/vpp/perf/l2 && grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl50-state(ful|less)-flows10k.*|oacl50-state(ful|less)-flows10k.*|eth.*)*pdrdisc" *
-   :shell:
index 9076526..2737373 100755 (executable)
@@ -3,7 +3,7 @@
 set -x
 
 # Build locally without jenkins integrations
-DEBUG=0
+DEBUG=1
 
 # Script directory
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
@@ -55,8 +55,8 @@ blds=${JOB[PERF,VPP,BLD]}
 for i in ${blds[@]}; do
     curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,VPP]}/${i}/robot/report/output_perf_data.xml \
         --output ${DIR[PLOT,VPP]}/${JOB[PERF,VPP]}-${i}.xml
-    curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,VPP]}/${i}/robot/report/output_perf_data.json \
-        --output ${DIR[PLOT,VPP]}/${JOB[PERF,VPP]}-${i}.json
+    #curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,VPP]}/${i}/robot/report/output_perf_data.json \
+    #    --output ${DIR[PLOT,VPP]}/${JOB[PERF,VPP]}-${i}.json
     if [[ ${DEBUG} -eq 0 ]] ;
     then
         curl --fail --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,VPP]}/${i}/robot/report/\*zip\*/robot-plugin.zip \
@@ -81,8 +81,8 @@ blds=${JOB[PERF,DPDK,BLD]}
 for i in ${blds[@]}; do
     curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,DPDK]}/${i}/robot/report/output_perf_data.xml \
         --output ${DIR[PLOT,DPDK]}/${JOB[PERF,DPDK]}-${i}.xml
-    curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,DPDK]}/${i}/robot/report/output_perf_data.json \
-        --output ${DIR[PLOT,DPDK]}/${JOB[PERF,DPDK]}-${i}.json
+    #curl --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,DPDK]}/${i}/robot/report/output_perf_data.json \
+    #    --output ${DIR[PLOT,DPDK]}/${JOB[PERF,DPDK]}-${i}.json
     if [[ ${DEBUG} -eq 0 ]] ;
     then
         curl --fail --silent ${URL[JENKINS,CSIT]}/${JOB[PERF,DPDK]}/${i}/robot/report/\*zip\*/robot-plugin.zip \
@@ -196,9 +196,12 @@ then
 fi
 
 # Generate tables for performance improvements
-./run_improvments_tables.py \
-    --input ${DIR[DTR,PERF,VPP,IMPRV]} \
-    --output ${DIR[DTR,PERF,VPP,IMPRV]}
+if [[ ${DEBUG} -eq 0 ]] ;
+then
+    ./run_improvments_tables.py \
+        --input ${DIR[DTR,PERF,VPP,IMPRV]} \
+        --output ${DIR[DTR,PERF,VPP,IMPRV]}
+fi
 
 # Delete temporary json files
 find ${DIR[RST]} -name "*.json" -type f -delete
@@ -228,25 +231,45 @@ _EOF
 
 # Plot packets per second
 
-# VPP L2
+# VPP L2 sel1
 
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-ndrdisc \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel1-ndrdisc \
     --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-ndrdisc \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel1-ndrdisc \
     --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
 
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-pdrdisc \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel1-pdrdisc \
     --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-pdrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-pdrdisc \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel1-pdrdisc \
     --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-pdrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]'
+
+# VPP L2 sel2
+
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel2-ndrdisc \
+    --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --lower 0 --upper 8000000
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel2-ndrdisc \
+    --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --lower 5000000 --upper 12000000
+
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel2-pdrdisc \
+    --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-pdrdisc" \
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --lower 0 --upper 8000000
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel2-pdrdisc \
+    --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-pdrdisc" \
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --lower 5000000 --upper 12000000
 
 # VPP IP4
 
@@ -430,16 +453,27 @@ python run_plot.py --input ${DIR[PLOT,DPDK]} \
 
 # Plot latency
 
-# VPP L2
+# VPP L2 sel1
+
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel1-ndrdisc-lat50 \
+    --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
+python run_plot.py --input ${DIR[PLOT,VPP]} \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel1-ndrdisc-lat50 \
+    --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
+    --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
+
+# VPP L2 sel2
 
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-ndrdisc-lat50 \
+    --output ${DIR[STATIC,VPP]}/64B-1t1c-l2-sel2-ndrdisc-lat50 \
     --title "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
 python run_plot.py --input ${DIR[PLOT,VPP]} \
-    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-ndrdisc-lat50 \
+    --output ${DIR[STATIC,VPP]}/64B-2t2c-l2-sel2-ndrdisc-lat50 \
     --title "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" \
-    --xpath '//*[@framesize="64B" and (contains(@tags,"BASE") or (contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
+    --xpath '//*[@framesize="64B" and ((contains(@tags,"FEATURE") and contains(@tags,"ACL50") and contains(@tags,"10k_FLOWS"))) and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and (contains(@tags,"L2BDMACSTAT") or contains(@tags,"L2BDMACLRN") or contains(@tags,"L2XCFWD")) and not(contains(@tags,"VHOST"))]' --latency lat_50
 
 # VPP IP4
 

©2016 FD.io a Linux Foundation Collaborative Project. All Rights Reserved.
Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
Please see our privacy policy and terms of use.