summaryrefslogtreecommitdiffstats
path: root/docs/requirements/vswitchperf_ltp.rst
blob: 14303de53f0df24d8d461d72bc6cc1fea95d832f (plain)
1
2
3
4
5
6
7
8
9
10
11
@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
}
#!/usr/bin/python
##############################################################################
# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

import os
import yaml

if __name__ == "__main__":
    network_config_file = os.environ["NETWORK"]
    network_config = yaml.safe_load(open(network_config_file, "r"))
    os.system(
        "sudo ovs-vsctl --may-exist add-port br-external mgmt_vnic -- set Interface mgmt_vnic type=internal")   # noqa
    os.system("sudo ip addr flush mgmt_vnic")
    os.system("sudo ip link set mgmt_vnic up")
    for sys_intf in network_config["sys_intf_mappings"]:
        if sys_intf["name"] == "mgmt" and sys_intf.get("vlan_tag"):
            os.system(
                "sudo ovs-vsctl set port mgmt_vnic tag=%s" %
                sys_intf["vlan_tag"])

    for net_info in network_config["ip_settings"]:
        if net_info["name"] == "mgmt":
            mgmt_ip_range_end = net_info["ip_ranges"][0][1]
            mgmt_netmask = net_info["cidr"].split('/')[1]
            os.system(
                r"sudo ip addr add %s/%s dev mgmt_vnic" %
                (mgmt_ip_range_end, mgmt_netmask))
href='#n464'>464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
.. 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.

.. 3.1

*****************************
VSPERF LEVEL TEST PLAN (LTP)
*****************************

===============
Introduction
===============

The objective of the OPNFV project titled
**Characterize vSwitch Performance for Telco NFV Use Cases**, is to
evaluate the performance of virtual switches to identify its suitability for a
Telco Network Function Virtualization (NFV) environment. The intention of this
Level Test Plan (LTP) document is to specify the scope, approach, resources,
and schedule of the virtual switch performance benchmarking activities in
OPNFV. The test cases will be identified in a separate document called the
Level Test Design (LTD) document.

This document is currently in draft form.

.. 3.1.1


.. _doc-id:

Document identifier
=========================

The document id will be used to uniquely identify versions of the LTP. The
format for the document id will be: OPNFV\_vswitchperf\_LTP\_REL\_STATUS, where
by the status is one of: draft, reviewed, corrected or final. The document id
for this version of the LTP is: OPNFV\_vswitchperf\_LTP\_Colorado\_REVIEWED.

.. 3.1.2

.. _scope:

Scope
==========

The main purpose of this project is to specify a suite of
performance tests in order to objectively measure the current packet
transfer characteristics of a virtual switch in the NFVI. The intent of
the project is to facilitate the performance testing of any virtual switch.
Thus, a generic suite of tests shall be developed, with no hard dependencies to
a single implementation. In addition, the test case suite shall be
architecture independent.

The test cases developed in this project shall not form part of a
separate test framework, all of these tests may be inserted into the
Continuous Integration Test Framework and/or the Platform Functionality
Test Framework - if a vSwitch becomes a standard component of an OPNFV
release.

.. 3.1.3

References
===============

*  `RFC 1242 Benchmarking Terminology for Network Interconnection
   Devices <http://www.ietf.org/rfc/rfc1242.txt>`__
*  `RFC 2544 Benchmarking Methodology for Network Interconnect
   Devices <http://www.ietf.org/rfc/rfc2544.txt>`__
*  `RFC 2285 Benchmarking Terminology for LAN Switching
   Devices <http://www.ietf.org/rfc/rfc2285.txt>`__
*  `RFC 2889 Benchmarking Methodology for LAN Switching
   Devices <http://www.ietf.org/rfc/rfc2889.txt>`__
*  `RFC 3918 Methodology for IP Multicast
   Benchmarking <http://www.ietf.org/rfc/rfc3918.txt>`__
*  `RFC 4737 Packet Reordering
   Metrics <http://www.ietf.org/rfc/rfc4737.txt>`__
*  `RFC 5481 Packet Delay Variation Applicability
   Statement <http://www.ietf.org/rfc/rfc5481.txt>`__
*  `RFC 6201 Device Reset
   Characterization <http://tools.ietf.org/html/rfc6201>`__

.. 3.1.4

Level in the overall sequence
===============================
The level of testing conducted by vswitchperf in the overall testing sequence (among
all the testing projects in OPNFV) is the performance benchmarking of a
specific component (the vswitch) in the OPNFV platfrom. It's expected that this
testing will follow on from the functional and integration testing conducted by
other testing projects in OPNFV, namely Functest and Yardstick.

.. 3.1.5

Test classes and overall test conditions
=========================================
A benchmark is defined by the IETF as: A standardized test that serves as a
basis for performance evaluation and comparison. It's important to note that
benchmarks are not Functional tests. They do not provide PASS/FAIL criteria,
and most importantly ARE NOT performed on live networks, or performed with live
network traffic.

In order to determine the packet transfer characteristics of a virtual switch,
the benchmarking tests will be broken down into the following categories:

- **Throughput Tests** to measure the maximum forwarding rate (in
  frames per second or fps) and bit rate (in Mbps) for a constant load
  (as defined by `RFC1242 <https://www.rfc-editor.org/rfc/rfc1242.txt>`__)
  without traffic loss.
- **Packet and Frame Delay Tests** to measure average, min and max
  packet and frame delay for constant loads.
- **Stream Performance Tests** (TCP, UDP) to measure bulk data transfer
  performance, i.e. how fast systems can send and receive data through
  the virtual switch.
- **Request/Response Performance** Tests (TCP, UDP) the measure the
  transaction rate through the virtual switch.
- **Packet Delay Tests** to understand latency distribution for
  different packet sizes and over an extended test run to uncover
  outliers.
- **Scalability Tests** to understand how the virtual switch performs
  as the number of flows, active ports, complexity of the forwarding
  logic's configuration... it has to deal with increases.
- **Control Path and Datapath Coupling** Tests, to understand how
  closely coupled the datapath and the control path are as well as the
  effect of this coupling on the performance of the DUT.
- **CPU and Memory Consumption Tests** to understand the virtual
  switch’s footprint on the system, this includes:

  * CPU core utilization.
  * CPU cache utilization.
  * Memory footprint.
  * System bus (QPI, PCI, ..) utilization.
  * Memory lanes utilization.
  * CPU cycles consumed per packet.
  * Time To Establish Flows Tests.

- **Noisy Neighbour Tests**, to understand the effects of resource
  sharing on the performance of a virtual switch.

**Note:** some of the tests above can be conducted simultaneously where
the combined results would be insightful, for example Packet/Frame Delay
and Scalability.



.. 3.2

.. _details-of-LTP:

===================================
Details of the Level Test Plan
===================================

This section describes the following items:
* Test items and their identifiers (TestItems_)
* Test Traceability Matrix (TestMatrix_)
* Features to be tested (FeaturesToBeTested_)
* Features not to be tested (FeaturesNotToBeTested_)
* Approach (Approach_)
* Item pass/fail criteria (PassFailCriteria_)
* Suspension criteria and resumption requirements (SuspensionResumptionReqs_)

.. 3.2.1

.. _TestItems:

Test items and their identifiers
==================================
The test item/application vsperf is trying to test are virtual switches and in
particular their performance in an nfv environment. vsperf will first try to
measure the maximum achievable performance by a virtual switch and then it will
focus in on usecases that are as close to real life deployment scenarios as
possible.

.. 3.2.2

.. _TestMatrix:

Test Traceability Matrix
==========================
vswitchperf leverages the "3x3" matrix (introduced in
https://tools.ietf.org/html/draft-ietf-bmwg-virtual-net-02) to achieve test
traceability. The matrix was expanded to 3x4 to accommodate scale metrics when
displaying the coverage of many metrics/benchmarks). Test case covreage in the
LTD is tracked using the following catagories:


+---------------+-------------+------------+---------------+-------------+
|               |             |            |               |             |
|               |   SPEED     |  ACCURACY  |  RELIABILITY  |    SCALE    |
|               |             |            |               |             |
+---------------+-------------+------------+---------------+-------------+
|               |             |            |               |             |
|  Activation   |      X      |     X      |       X       |      X      |
|               |             |            |               |             |
+---------------+-------------+------------+---------------+-------------+
|               |             |            |               |             |
|  Operation    |      X      |      X     |       X       |      X      |
|               |             |            |               |             |
+---------------+-------------+------------+---------------+-------------+
|               |             |            |               |             |
| De-activation |             |            |               |             |
|               |             |            |               |             |
+---------------+-------------+------------+---------------+-------------+

X = denotes a test catagory that has 1 or more test cases defined.

.. 3.2.3

.. _FeaturesToBeTested:

Features to be tested
==========================

Characterizing virtual switches (i.e. Device Under Test (DUT) in this document)
includes measuring the following performance metrics:

- **Throughput** as defined by `RFC1242
  <https://www.rfc-editor.org/rfc/rfc1242.txt>`__: The maximum rate at which
  **none** of the offered frames are dropped by the DUT. The maximum frame
  rate and bit rate that can be transmitted by the DUT without any error
  should be recorded. Note there is an equivalent bit rate and a specific
  layer at which the payloads contribute to the bits. Errors and
  improperly formed frames or packets are dropped.
- **Packet delay** introduced by the DUT and its cumulative effect on
  E2E networks. Frame delay can be measured equivalently.
- **Packet delay variation**: measured from the perspective of the
  VNF/application. Packet delay variation is sometimes called "jitter".
  However, we will avoid the term "jitter" as the term holds different
  meaning to different groups of people. In this document we will
  simply use the term packet delay variation. The preferred form for this
  metric is the PDV form of delay variation defined in `RFC5481
  <https://www.rfc-editor.org/rfc/rfc5481.txt>`__. The most relevant
  measurement of PDV considers the delay variation of a single user flow,
  as this will be relevant to the size of end-system buffers to compensate
  for delay variation. The measurement system's ability to store the
  delays of individual packets in the flow of interest is a key factor
  that determines the specific measurement method. At the outset, it is
  ideal to view the complete PDV distribution. Systems that can capture
  and store packets and their delays have the freedom to calculate the
  reference minimum delay and to determine various quantiles of the PDV
  distribution accurately (in post-measurement processing routines).
  Systems without storage must apply algorithms to calculate delay and
  statistical measurements on the fly. For example, a system may store
  temporary estimates of the mimimum delay and the set of (100) packets
  with the longest delays during measurement (to calculate a high quantile,
  and update these sets with new values periodically.
  In some cases, a limited number of delay histogram bins will be
  available, and the bin limits will need to be set using results from
  repeated experiments. See section 8 of `RFC5481
  <https://www.rfc-editor.org/rfc/rfc5481.txt>`__.
- **Packet loss** (within a configured waiting time at the receiver): All
  packets sent to the DUT should be accounted for.
- **Burst behaviour**: measures the ability of the DUT to buffer packets.
- **Packet re-ordering**: measures the ability of the device under test to
  maintain sending order throughout transfer to the destination.
- **Packet correctness**: packets or Frames must be well-formed, in that
  they include all required fields, conform to length requirements, pass
  integrity checks, etc.
- **Availability and capacity** of the DUT i.e. when the DUT is fully “up”
  and connected, following measurements should be captured for
  DUT without any network packet load:

  - Includes average power consumption of the CPUs (in various power states) and
    system over specified period of time. Time period should not be less
    than 60 seconds.
  - Includes average per core CPU utilization over specified period of time.
    Time period should not be less than 60 seconds.
  - Includes the number of NIC interfaces supported.
  - Includes headroom of VM workload processing cores (i.e. available
    for applications).

.. 3.2.4

.. _FeaturesNotToBeTested:

Features not to be tested
==========================
vsperf doesn't intend to define or perform any functional tests. The aim is to
focus on performance.

.. 3.2.5

.. _Approach:

Approach
==============
The testing approach adoped by the vswitchperf project is black box testing,
meaning the test inputs can be generated and the outputs captured and
completely evaluated from the outside of the System Under Test. Some metrics
can be collected on the SUT, such as cpu or memory utilization if the
collection has no/minimal impact on benchmark.
This section will look at the deployment scenarios and the general methodology
used by vswitchperf. In addition, this section will also specify the details of
the Test Report that must be collected for each of the test cases.

.. 3.2.5.1

Deployment Scenarios
--------------------------
The following represents possible deployment test scenarios which can
help to determine the performance of both the virtual switch and the
datapaths to physical ports (to NICs) and to logical ports (to VNFs):

.. 3.2.5.1.1

Physical port → vSwitch → physical port
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: console

                                                            _
       +--------------------------------------------------+  |
       |              +--------------------+              |  |
       |              |                    |              |  |
       |              |                    v              |  |  Host
       |   +--------------+            +--------------+   |  |
       |   |   phy port   |  vSwitch   |   phy port   |   |  |
       +---+--------------+------------+--------------+---+ _|
                  ^                           :
                  |                           |
                  :                           v
       +--------------------------------------------------+
       |                                                  |
       |                traffic generator                 |
       |                                                  |
       +--------------------------------------------------+

.. 3.2.5.1.2

Physical port → vSwitch → VNF → vSwitch → physical port
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: console

                                                             _
       +---------------------------------------------------+  |
       |                                                   |  |
       |   +-------------------------------------------+   |  |
       |   |                 Application               |   |  |
       |   +-------------------------------------------+   |  |
       |       ^                                  :        |  |
       |       |                                  |        |  |  Guest
       |       :                                  v        |  |
       |   +---------------+           +---------------+   |  |
       |   | logical port 0|           | logical port 1|   |  |
       +---+---------------+-----------+---------------+---+ _|
               ^                                  :
               |                                  |
               :                                  v         _
       +---+---------------+----------+---------------+---+  |
       |   | logical port 0|          | logical port 1|   |  |
       |   +---------------+          +---------------+   |  |
       |       ^                                  :       |  |
       |       |                                  |       |  |  Host
       |       :                                  v       |  |
       |   +--------------+            +--------------+   |  |
       |   |   phy port   |  vSwitch   |   phy port   |   |  |
       +---+--------------+------------+--------------+---+ _|
                  ^                           :
                  |                           |
                  :                           v
       +--------------------------------------------------+
       |                                                  |
       |                traffic generator                 |
       |                                                  |
       +--------------------------------------------------+

.. 3.2.5.1.3

Physical port → vSwitch → VNF → vSwitch → VNF → vSwitch → physical port
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                       _
    +----------------------+  +----------------------+  |
    |   Guest 1            |  |   Guest 2            |  |
    |   +---------------+  |  |   +---------------+  |  |
    |   |  Application  |  |  |   |  Application  |  |  |
    |   +---------------+  |  |   +---------------+  |  |
    |       ^       |      |  |       ^       |      |  |
    |       |       v      |  |       |       v      |  |  Guests
    |   +---------------+  |  |   +---------------+  |  |
    |   | logical ports |  |  |   | logical ports |  |  |
    |   |   0       1   |  |  |   |   0       1   |  |  |
    +---+---------------+--+  +---+---------------+--+ _|
            ^       :                 ^       :
            |       |                 |       |
            :       v                 :       v        _
    +---+---------------+---------+---------------+--+  |
    |   |   0       1   |         |   3       4   |  |  |
    |   | logical ports |         | logical ports |  |  |
    |   +---------------+         +---------------+  |  |
    |       ^       |                 ^       |      |  |  Host
    |       |       L-----------------+       v      |  |
    |   +--------------+          +--------------+   |  |
    |   |   phy ports  | vSwitch  |   phy ports  |   |  |
    +---+--------------+----------+--------------+---+ _|
            ^       ^                 :       :
            |       |                 |       |
            :       :                 v       v
    +--------------------------------------------------+
    |                                                  |
    |                traffic generator                 |
    |                                                  |
    +--------------------------------------------------+

.. 3.2.5.1.4

Physical port → VNF → vSwitch → VNF → physical port
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                        _
    +----------------------+  +----------------------+   |
    |   Guest 1            |  |   Guest 2            |   |
    |+-------------------+ |  | +-------------------+|   |
    ||     Application   | |  | |     Application   ||   |
    |+-------------------+ |  | +-------------------+|   |
    |       ^       |      |  |       ^       |      |   |  Guests
    |       |       v      |  |       |       v      |   |
    |+-------------------+ |  | +-------------------+|   |
    ||   logical ports   | |  | |   logical ports   ||   |
    ||  0              1 | |  | | 0              1  ||   |
    ++--------------------++  ++--------------------++  _|
        ^              :          ^              :
    (PCI passthrough)  |          |     (PCI passthrough)
        |              v          :              |      _
    +--------++------------+-+------------++---------+   |
    |   |    ||        0   | |    1       ||     |   |   |
    |   |    ||logical port| |logical port||     |   |   |
    |   |    |+------------+ +------------+|     |   |   |
    |   |    |     |                 ^     |     |   |   |
    |   |    |     L-----------------+     |     |   |   |
    |   |    |                             |     |   |   |  Host
    |   |    |           vSwitch           |     |   |   |
    |   |    +-----------------------------+     |   |   |
    |   |                                        |   |   |
    |   |                                        v   |   |
    | +--------------+              +--------------+ |   |
    | | phy port/VF  |              | phy port/VF  | |   |
    +-+--------------+--------------+--------------+-+  _|
        ^                                        :
        |                                        |
        :                                        v
    +--------------------------------------------------+
    |                                                  |
    |                traffic generator                 |
    |                                                  |
    +--------------------------------------------------+

.. 3.2.5.1.5

Physical port → vSwitch → VNF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                          _
    +---------------------------------------------------+  |
    |                                                   |  |
    |   +-------------------------------------------+   |  |
    |   |                 Application               |   |  |
    |   +-------------------------------------------+   |  |
    |       ^                                           |  |
    |       |                                           |  |  Guest
    |       :                                           |  |
    |   +---------------+                               |  |
    |   | logical port 0|                               |  |
    +---+---------------+-------------------------------+ _|
            ^
            |
            :                                            _
    +---+---------------+------------------------------+  |
    |   | logical port 0|                              |  |
    |   +---------------+                              |  |
    |       ^                                          |  |
    |       |                                          |  |  Host
    |       :                                          |  |
    |   +--------------+                               |  |
    |   |   phy port   |  vSwitch                      |  |
    +---+--------------+------------ -------------- ---+ _|
               ^
               |
               :
    +--------------------------------------------------+
    |                                                  |
    |                traffic generator                 |
    |                                                  |
    +--------------------------------------------------+

.. 3.2.5.1.6

VNF → vSwitch → physical port
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                          _
    +---------------------------------------------------+  |
    |                                                   |  |
    |   +-------------------------------------------+   |  |
    |   |                 Application               |   |  |
    |   +-------------------------------------------+   |  |
    |                                          :        |  |
    |                                          |        |  |  Guest
    |                                          v        |  |
    |                               +---------------+   |  |
    |                               | logical port  |   |  |
    +-------------------------------+---------------+---+ _|
                                               :
                                               |
                                               v         _
    +------------------------------+---------------+---+  |
    |                              | logical port  |   |  |
    |                              +---------------+   |  |
    |                                          :       |  |
    |                                          |       |  |  Host
    |                                          v       |  |
    |                               +--------------+   |  |
    |                     vSwitch   |   phy port   |   |  |
    +-------------------------------+--------------+---+ _|
                                           :
                                           |
                                           v
    +--------------------------------------------------+
    |                                                  |
    |                traffic generator                 |
    |                                                  |
    +--------------------------------------------------+

.. 3.2.5.1.7

VNF → vSwitch → VNF → vSwitch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                             _
    +-------------------------+  +-------------------------+  |
    |   Guest 1               |  |   Guest 2               |  |
    |   +-----------------+   |  |   +-----------------+   |  |
    |   |   Application   |   |  |   |   Application   |   |  |
    |   +-----------------+   |  |   +-----------------+   |  |
    |                :        |  |       ^                 |  |
    |                |        |  |       |                 |  |  Guest
    |                v        |  |       :                 |  |
    |     +---------------+   |  |   +---------------+     |  |
    |     | logical port 0|   |  |   | logical port 0|     |  |
    +-----+---------------+---+  +---+---------------+-----+ _|
                    :                    ^
                    |                    |
                    v                    :                    _
    +----+---------------+------------+---------------+-----+  |
    |    |     port 0    |            |     port 1    |     |  |
    |    +---------------+            +---------------+     |  |
    |              :                    ^                   |  |
    |              |                    |                   |  |  Host
    |              +--------------------+                   |  |
    |                                                       |  |
    |                     vswitch                           |  |
    +-------------------------------------------------------+ _|

.. 3.2.5.1.8

HOST 1(Physical port → virtual switch → VNF → virtual switch → Physical port)
→ HOST 2(Physical port → virtual switch → VNF → virtual switch → Physical port)

HOST 1 (PVP) → HOST 2 (PVP)
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: console

                                                       _
    +----------------------+  +----------------------+  |
    |   Guest 1            |  |   Guest 2            |  |
    |   +---------------+  |  |   +---------------+  |  |
    |   |  Application  |  |  |   |  Application  |  |  |
    |   +---------------+  |  |   +---------------+  |  |
    |       ^       |      |  |       ^       |      |  |
    |       |       v      |  |       |       v      |  |  Guests
    |   +---------------+  |  |   +---------------+  |  |
    |   | logical ports |  |  |   | logical ports |  |  |
    |   |   0       1   |  |  |   |   0       1   |  |  |
    +---+---------------+--+  +---+---------------+--+ _|
            ^       :                 ^       :
            |       |                 |       |
            :       v                 :       v        _
    +---+---------------+--+  +---+---------------+--+  |
    |   |   0       1   |  |  |   |   3       4   |  |  |
    |   | logical ports |  |  |   | logical ports |  |  |
    |   +---------------+  |  |   +---------------+  |  |
    |       ^       |      |  |       ^       |      |  |  Hosts
    |       |       v      |  |       |       v      |  |
    |   +--------------+   |  |   +--------------+   |  |
    |   |   phy ports  |   |  |   |   phy ports  |   |  |
    +---+--------------+---+  +---+--------------+---+ _|
            ^       :                 :       :
            |       +-----------------+       |
            :                                 v
    +--------------------------------------------------+
    |                                                  |
    |                traffic generator                 |
    |                                                  |
    +--------------------------------------------------+



**Note:** For tests where the traffic generator and/or measurement
receiver are implemented on VM and connected to the virtual switch
through vNIC, the issues of shared resources and interactions between
the measurement devices and the device under test must be considered.

**Note:** Some RFC 2889 tests require a full-mesh sending and receiving
pattern involving more than two ports. This possibility is illustrated in the
Physical port → vSwitch → VNF → vSwitch → VNF → vSwitch → physical port
diagram above (with 2 sending and 2 receiving ports, though all ports
could be used bi-directionally).

**Note:** When Deployment Scenarios are used in RFC 2889 address learning
or cache capacity testing, an additional port from the vSwitch must be
connected to the test device. This port is used to listen for flooded
frames.

.. 3.2.5.2

General Methodology:
--------------------------
To establish the baseline performance of the virtual switch, tests would
initially be run with a simple workload in the VNF (the recommended
simple workload VNF would be `DPDK <http://www.dpdk.org/>`__'s testpmd
application forwarding packets in a VM or vloop\_vnf a simple kernel
module that forwards traffic between two network interfaces inside the
virtualized environment while bypassing the networking stack).
Subsequently, the tests would also be executed with a real Telco
workload running in the VNF, which would exercise the virtual switch in
the context of higher level Telco NFV use cases, and prove that its
underlying characteristics and behaviour can be measured and validated.
Suitable real Telco workload VNFs are yet to be identified.

.. 3.2.5.2.1

Default Test Parameters
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The following list identifies the default parameters for suite of
tests:

-  Reference application: Simple forwarding or Open Source VNF.
-  Frame size (bytes): 64, 128, 256, 512, 1024, 1280, 1518, 2K, 4k OR
   Packet size based on use-case (e.g. RTP 64B, 256B) OR Mix of packet sizes as
   maintained by the Functest project <https://wiki.opnfv.org/traffic_profile_management>.
-  Reordering check: Tests should confirm that packets within a flow are
   not reordered.
-  Duplex: Unidirectional / Bidirectional. Default: Full duplex with
   traffic transmitting in both directions, as network traffic generally
   does not flow in a single direction. By default the data rate of
   transmitted traffic should be the same in both directions, please
   note that asymmetric traffic (e.g. downlink-heavy) tests will be
   mentioned explicitly for the relevant test cases.
-  Number of Flows: Default for non scalability tests is a single flow.
   For scalability tests the goal is to test with maximum supported
   flows but where possible will test up to 10 Million flows. Start with
   a single flow and scale up. By default flows should be added
   sequentially, tests that add flows simultaneously will explicitly
   call out their flow addition behaviour. Packets are generated across
   the flows uniformly with no burstiness. For multi-core tests should
   consider the number of packet flows based on vSwitch/VNF multi-thread
   implementation and behavior.

-  Traffic Types: UDP, SCTP, RTP, GTP and UDP traffic.
-  Deployment scenarios are:
-  Physical → virtual switch → physical.
-  Physical → virtual switch → VNF → virtual switch → physical.
-  Physical → virtual switch → VNF → virtual switch → VNF → virtual
   switch → physical.
-  Physical → VNF → virtual switch → VNF → physical.
-  Physical → virtual switch → VNF.
-  VNF → virtual switch → Physical.
-  VNF → virtual switch → VNF.

Tests MUST have these parameters unless otherwise stated. **Test cases
with non default parameters will be stated explicitly**.

**Note**: For throughput tests unless stated otherwise, test
configurations should ensure that traffic traverses the installed flows
through the virtual switch, i.e. flows are installed and have an appropriate
time out that doesn't expire before packet transmission starts.

.. 3.2.5.2.2

Flow Classification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Virtual switches classify packets into flows by processing and matching
particular header fields in the packet/frame and/or the input port where
the packets/frames arrived. The vSwitch then carries out an action on
the group of packets that match the classification parameters. Thus a
flow is considered to be a sequence of packets that have a shared set of
header field values or have arrived on the same port and have the same
action applied to them. Performance results can vary based on the
parameters the vSwitch uses to match for a flow. The recommended flow
classification parameters for L3 vSwitch performance tests are: the
input port, the source IP address, the destination IP address and the
Ethernet protocol type field. It is essential to increase the flow
time-out time on a vSwitch before conducting any performance tests that
do not measure the flow set-up time. Normally the first packet of a
particular flow will install the flow in the vSwitch which adds an
additional latency, subsequent packets of the same flow are not subject
to this latency if the flow is already installed on the vSwitch.

.. 3.2.5.2.3

Test Priority
~~~~~~~~~~~~~~~~~~~~~

Tests will be assigned a priority in order to determine which tests
should be implemented immediately and which tests implementations
can be deferred.

Priority can be of following types: - Urgent: Must be implemented
immediately. - High: Must be implemented in the next release. - Medium:
May be implemented after the release. - Low: May or may not be
implemented at all.

.. 3.2.5.2.4

SUT Setup
~~~~~~~~~~~~~~~~~~

The SUT should be configured to its "default" state. The
SUT's configuration or set-up must not change between tests in any way
other than what is required to do the test. All supported protocols must
be configured and enabled for each test set up.

.. 3.2.5.2.5

Port Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~

The DUT should be configured with n ports where
n is a multiple of 2. Half of the ports on the DUT should be used as
ingress ports and the other half of the ports on the DUT should be used
as egress ports. Where a DUT has more than 2 ports, the ingress data
streams should be set-up so that they transmit packets to the egress
ports in sequence so that there is an even distribution of traffic
across ports. For example, if a DUT has 4 ports 0(ingress), 1(ingress),
2(egress) and 3(egress), the traffic stream directed at port 0 should
output a packet to port 2 followed by a packet to port 3. The traffic
stream directed at port 1 should also output a packet to port 2 followed
by a packet to port 3.

.. 3.2.5.2.6

Frame Formats
~~~~~~~~~~~~~~~~~~~~~

**Frame formats Layer 2 (data link layer) protocols**

-  Ethernet II

.. code-block:: console

     +---------------------------+-----------+
     | Ethernet Header | Payload | Check Sum |
     +-----------------+---------+-----------+
     |_________________|_________|___________|
           14 Bytes     46 - 1500   4 Bytes
                          Bytes


**Layer 3 (network layer) protocols**

-  IPv4

.. code-block:: console

     +-----------------+-----------+---------+-----------+
     | Ethernet Header | IP Header | Payload | Checksum  |
     +-----------------+-----------+---------+-----------+
     |_________________|___________|_________|___________|
           14 Bytes       20 bytes  26 - 1480   4 Bytes
                                      Bytes

-  IPv6

.. code-block:: console

     +-----------------+-----------+---------+-----------+
     | Ethernet Header | IP Header | Payload | Checksum  |
     +-----------------+-----------+---------+-----------+
     |_________________|___________|_________|___________|
           14 Bytes       40 bytes  26 - 1460   4 Bytes
                                      Bytes

**Layer 4 (transport layer) protocols**

  - TCP
  - UDP
  - SCTP

.. code-block:: console

     +-----------------+-----------+-----------------+---------+-----------+
     | Ethernet Header | IP Header | Layer 4 Header  | Payload | Checksum  |
     +-----------------+-----------+-----------------+---------+-----------+
     |_________________|___________|_________________|_________|___________|
           14 Bytes      40 bytes      20 Bytes       6 - 1460   4 Bytes
                                                       Bytes


**Layer 5 (application layer) protocols**

  - RTP
  - GTP

.. code-block:: console

     +-----------------+-----------+-----------------+---------+-----------+
     | Ethernet Header | IP Header | Layer 4 Header  | Payload | Checksum  |
     +-----------------+-----------+-----------------+---------+-----------+
     |_________________|___________|_________________|_________|___________|
           14 Bytes      20 bytes     20 Bytes        >= 6 Bytes   4 Bytes

.. 3.2.5.2.7

Packet Throughput
~~~~~~~~~~~~~~~~~~~~~~~~~
There is a difference between an Ethernet frame,
an IP packet, and a UDP datagram. In the seven-layer OSI model of
computer networking, packet refers to a data unit at layer 3 (network
layer). The correct term for a data unit at layer 2 (data link layer) is
a frame, and at layer 4 (transport layer) is a segment or datagram.

Important concepts related to 10GbE performance are frame rate and
throughput. The MAC bit rate of 10GbE, defined in the IEEE standard 802
.3ae, is 10 billion bits per second. Frame rate is based on the bit rate
and frame format definitions. Throughput, defined in IETF RFC 1242, is
the highest rate at which the system under test can forward the offered
load, without loss.

The frame rate for 10GbE is determined by a formula that divides the 10
billion bits per second by the preamble + frame length + inter-frame
gap.

The maximum frame rate is calculated using the minimum values of the
following parameters, as described in the IEEE 802 .3ae standard:

-  Preamble: 8 bytes \* 8 = 64 bits
-  Frame Length: 64 bytes (minimum) \* 8 = 512 bits
-  Inter-frame Gap: 12 bytes (minimum) \* 8 = 96 bits

Therefore, Maximum Frame Rate (64B Frames)
= MAC Transmit Bit Rate / (Preamble + Frame Length + Inter-frame Gap)
= 10,000,000,000 / (64 + 512 + 96)
= 10,000,000,000 / 672
= 14,880,952.38 frame per second (fps)

.. 3.2.5.3

RFCs for testing virtual switch performance
--------------------------------------------------

The starting point for defining the suite of tests for benchmarking the
performance of a virtual switch is to take existing RFCs and standards
that were designed to test their physical counterparts and adapting them
for testing virtual switches. The rationale behind this is to establish
a fair comparison between the performance of virtual and physical
switches. This section outlines the RFCs that are used by this
specification.

.. 3.2.5.3.1

RFC 1242 Benchmarking Terminology for Network Interconnection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Devices RFC 1242 defines the terminology that is used in describing
performance benchmarking tests and their results. Definitions and
discussions covered include: Back-to-back, bridge, bridge/router,
constant load, data link frame size, frame loss rate, inter frame gap,
latency, and many more.

.. 3.2.5.3.2

RFC 2544 Benchmarking Methodology for Network Interconnect Devices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 2544 outlines a benchmarking methodology for network Interconnect
Devices. The methodology results in performance metrics such as latency,
frame loss percentage, and maximum data throughput.

In this document network “throughput” (measured in millions of frames
per second) is based on RFC 2544, unless otherwise noted. Frame size
refers to Ethernet frames ranging from smallest frames of 64 bytes to
largest frames of 9K bytes.

Types of tests are:

1. Throughput test defines the maximum number of frames per second
   that can be transmitted without any error, or 0% loss ratio.
   In some Throughput tests (and those tests with long duration),
   evaluation of an additional frame loss ratio is suggested. The
   current ratio (10^-7 %) is based on understanding the typical
   user-to-user packet loss ratio needed for good application
   performance and recognizing that a single transfer through a
   vswitch must contribute a tiny fraction of user-to-user loss.
   Further, the ratio 10^-7 % also recognizes practical limitations
   when measuring loss ratio.

2. Latency test measures the time required for a frame to travel from
   the originating device through the network to the destination device.
   Please note that RFC2544 Latency measurement will be superseded with
   a measurement of average latency over all successfully transferred
   packets or frames.

3. Frame loss test measures the network’s
   response in overload conditions - a critical indicator of the
   network’s ability to support real-time applications in which a
   large amount of frame loss will rapidly degrade service quality.

4. Burst test assesses the buffering capability of a virtual switch. It
   measures the maximum number of frames received at full line rate
   before a frame is lost. In carrier Ethernet networks, this
   measurement validates the excess information rate (EIR) as defined in
   many SLAs.

5. System recovery to characterize speed of recovery from an overload
   condition.

6. Reset to characterize speed of recovery from device or software
   reset. This type of test has been updated by `RFC6201
   <https://www.rfc-editor.org/rfc/rfc6201.txt>`__ as such,
   the methodology defined by this specification will be that of RFC 6201.

Although not included in the defined RFC 2544 standard, another crucial
measurement in Ethernet networking is packet delay variation. The
definition set out by this specification comes from
`RFC5481 <https://www.rfc-editor.org/rfc/rfc5481.txt>`__.

.. 3.2.5.3.3

RFC 2285 Benchmarking Terminology for LAN Switching Devices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 2285 defines the terminology that is used to describe the
terminology for benchmarking a LAN switching device. It extends RFC
1242 and defines: DUTs, SUTs, Traffic orientation and distribution,
bursts, loads, forwarding rates, etc.

.. 3.2.5.3.4

RFC 2889 Benchmarking Methodology for LAN Switching
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 2889 outlines a benchmarking methodology for LAN switching, it
extends RFC 2544. The outlined methodology gathers performance
metrics for forwarding, congestion control, latency, address handling
and finally filtering.

.. 3.2.5.3.5

RFC 3918 Methodology for IP Multicast Benchmarking
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 3918 outlines a methodology for IP Multicast benchmarking.

.. 3.2.5.3.6

RFC 4737 Packet Reordering Metrics
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 4737 describes metrics for identifying and counting re-ordered
packets within a stream, and metrics to measure the extent each
packet has been re-ordered.

.. 3.2.5.3.7

RFC 5481 Packet Delay Variation Applicability Statement
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 5481 defined two common, but different forms of delay variation
metrics, and compares the metrics over a range of networking
circumstances and tasks. The most suitable form for vSwitch
benchmarking is the "PDV" form.

.. 3.2.5.3.8

RFC 6201 Device Reset Characterization
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RFC 6201 extends the methodology for characterizing the speed of
recovery of the DUT from device or software reset described in RFC
2544.

.. 3.2.6:

.. _PassFailCriteria:

Item pass/fail criteria
=========================

vswitchperf does not specify Pass/Fail criteria for the tests in terms of a
threshold, as benchmarks do not (and should not do this). The results/metrics
for a test are simply reported. If it had to be defined, a test is considered
to have passed if it succesfully completed and a relavent metric was
recorded/reported for the SUT.

.. 3.2.7:

.. _SuspensionResumptionReqs:

Suspension criteria and resumption requirements
================================================
In the case of a throughput test, a test should be suspended if a virtual
switch is failing to forward any traffic. A test should be restarted from a
clean state if the intention is to carry out the test again.

.. 3.2.8:

.. _TestDelierables:

Test deliverables
==================
Each test should produce a test report that details SUT information as well as
the test results. There are a number of parameters related to the system, DUT
and tests that can affect the repeatability of a test results and should be
recorded. In order to minimise the variation in the results of a test,
it is recommended that the test report includes the following information:

-  Hardware details including:

   -  Platform details.
   -  Processor details.
   -  Memory information (see below)
   -  Number of enabled cores.
   -  Number of cores used for the test.
   -  Number of physical NICs, as well as their details (manufacturer,
      versions, type and the PCI slot they are plugged into).
   -  NIC interrupt configuration.
   -  BIOS version, release date and any configurations that were
      modified.

-  Software details including:

   -  OS version (for host and VNF)
   -  Kernel version (for host and VNF)
   -  GRUB boot parameters (for host and VNF).
   -  Hypervisor details (Type and version).
   -  Selected vSwitch, version number or commit id used.
   -  vSwitch launch command line if it has been parameterised.
   -  Memory allocation to the vSwitch – which NUMA node it is using,
      and how many memory channels.
   -  Where the vswitch is built from source: compiler details including
      versions and the flags that were used to compile the vSwitch.
   -  DPDK or any other SW dependency version number or commit id used.
   -  Memory allocation to a VM - if it's from Hugpages/elsewhere.
   -  VM storage type: snapshot/independent persistent/independent
      non-persistent.
   -  Number of VMs.
   -  Number of Virtual NICs (vNICs), versions, type and driver.
   -  Number of virtual CPUs and their core affinity on the host.
   -  Number vNIC interrupt configuration.
   -  Thread affinitization for the applications (including the vSwitch
      itself) on the host.
   -  Details of Resource isolation, such as CPUs designated for
      Host/Kernel (isolcpu) and CPUs designated for specific processes
      (taskset).

-  Memory Details

   -  Total memory
   -  Type of memory
   -  Used memory
   -  Active memory
   -  Inactive memory
   -  Free memory
   -  Buffer memory
   -  Swap cache
   -  Total swap
   -  Used swap
   -  Free swap

-  Test duration.
-  Number of flows.
-  Traffic Information:

   -  Traffic type - UDP, TCP, IMIX / Other.
   -  Packet Sizes.

-  Deployment Scenario.

**Note**: Tests that require additional parameters to be recorded will
explicitly specify this.


.. 3.3:

.. _TestManagement:

Test management
=================
This section will detail the test activities that will be conducted by vsperf
as well as the infrastructure that will be used to complete the tests in OPNFV.

.. 3.3.1:

Planned activities and tasks; test progression
=================================================
A key consideration when conducting any sort of benchmark is trying to
ensure the consistency and repeatability of test results between runs.
When benchmarking the performance of a virtual switch there are many
factors that can affect the consistency of results. This section
describes these factors and the measures that can be taken to limit
their effects. In addition, this section will outline some system tests
to validate the platform and the VNF before conducting any vSwitch
benchmarking tests.

**System Isolation:**

When conducting a benchmarking test on any SUT, it is essential to limit
(and if reasonable, eliminate) any noise that may interfere with the
accuracy of the metrics collected by the test. This noise may be
introduced by other hardware or software (OS, other applications), and
can result in significantly varying performance metrics being collected
between consecutive runs of the same test. In the case of characterizing
the performance of a virtual switch, there are a number of configuration
parameters that can help increase the repeatability and stability of
test results, including:

-  OS/GRUB configuration:

   -  maxcpus = n where n >= 0; limits the kernel to using 'n'
      processors. Only use exactly what you need.
   -  isolcpus: Isolate CPUs from the general scheduler. Isolate all
      CPUs bar one which will be used by the OS.
   -  use taskset to affinitize the forwarding application and the VNFs
      onto isolated cores. VNFs and the vSwitch should be allocated
      their own cores, i.e. must not share the same cores. vCPUs for the
      VNF should be affinitized to individual cores also.
   -  Limit the amount of background applications that are running and
      set OS to boot to runlevel 3. Make sure to kill any unnecessary
      system processes/daemons.
   -  Only enable hardware that you need to use for your test – to
      ensure there are no other interrupts on the system.
   -  Configure NIC interrupts to only use the cores that are not
      allocated to any other process (VNF/vSwitch).

-  NUMA configuration: Any unused sockets in a multi-socket system
   should be disabled.
-  CPU pinning: The vSwitch and the VNF should each be affinitized to
   separate logical cores using a combination of maxcpus, isolcpus and
   taskset.
-  BIOS configuration: BIOS should be configured for performance where
   an explicit option exists, sleep states should be disabled, any
   virtualization optimization technologies should be enabled, and
   hyperthreading should also be enabled, turbo boost and overclocking
   should be disabled.

**System Validation:**

System validation is broken down into two sub-categories: Platform
validation and VNF validation. The validation test itself involves
verifying the forwarding capability and stability for the sub-system
under test. The rationale behind system validation is two fold. Firstly
to give a tester confidence in the stability of the platform or VNF that
is being tested; and secondly to provide base performance comparison
points to understand the overhead introduced by the virtual switch.

* Benchmark platform forwarding capability: This is an OPTIONAL test
  used to verify the platform and measure the base performance (maximum
  forwarding rate in fps and latency) that can be achieved by the
  platform without a vSwitch or a VNF. The following diagram outlines
  the set-up for benchmarking Platform forwarding capability:

  .. code-block:: console

                                                            __
       +--------------------------------------------------+   |
       |   +------------------------------------------+   |   |
       |   |                                          |   |   |
       |   |          l2fw or DPDK L2FWD app          |   |  Host
       |   |                                          |   |   |
       |   +------------------------------------------+   |   |
       |   |                 NIC                      |   |   |
       +---+------------------------------------------+---+ __|
                  ^                           :
                  |                           |
                  :                           v
       +--------------------------------------------------+
       |                                                  |
       |                traffic generator                 |
       |                                                  |
       +--------------------------------------------------+

* Benchmark VNF forwarding capability: This test is used to verify
  the VNF and measure the base performance (maximum forwarding rate in
  fps and latency) that can be achieved by the VNF without a vSwitch.
  The performance metrics collected by this test will serve as a key
  comparison point for NIC passthrough technologies and vSwitches. VNF
  in this context refers to the hypervisor and the VM. The following
  diagram outlines the set-up for benchmarking VNF forwarding
  capability:

  .. code-block:: console

                                                            __
       +--------------------------------------------------+   |
       |   +------------------------------------------+   |   |
       |   |                                          |   |   |
       |   |                 VNF                      |   |   |
       |   |                                          |   |   |
       |   +------------------------------------------+   |   |
       |   |          Passthrough/SR-IOV              |   |  Host
       |   +------------------------------------------+   |   |
       |   |                 NIC                      |   |   |
       +---+------------------------------------------+---+ __|
                  ^                           :
                  |                           |
                  :                           v
       +--------------------------------------------------+
       |                                                  |
       |                traffic generator                 |
       |                                                  |
       +--------------------------------------------------+


**Methodology to benchmark Platform/VNF forwarding capability**


The recommended methodology for the platform/VNF validation and
benchmark is: - Run `RFC2889 <https://www.rfc-editor.org/rfc/rfc2289.txt>`__
Maximum Forwarding Rate test, this test will produce maximum
forwarding rate and latency results that will serve as the
expected values. These expected values can be used in
subsequent steps or compared with in subsequent validation tests. -
Transmit bidirectional traffic at line rate/max forwarding rate
(whichever is higher) for at least 72 hours, measure throughput (fps)
and latency. - Note: Traffic should be bidirectional. - Establish a
baseline forwarding rate for what the platform can achieve. - Additional
validation: After the test has completed for 72 hours run bidirectional
traffic at the maximum forwarding rate once more to see if the system is
still functional and measure throughput (fps) and latency. Compare the
measure the new obtained values with the expected values.

**NOTE 1**: How the Platform is configured for its forwarding capability
test (BIOS settings, GRUB configuration, runlevel...) is how the
platform should be configured for every test after this

**NOTE 2**: How the VNF is configured for its forwarding capability test
(# of vCPUs, vNICs, Memory, affinitization…) is how it should be
configured for every test that uses a VNF after this.

**Methodology to benchmark the VNF to vSwitch to VNF deployment scenario**

vsperf has identified the following concerns when benchmarking the VNF to
vSwitch to VNF deployment scenario:

* The accuracy of the timing synchronization between VNFs/VMs.
* The clock accuracy of a VNF/VM if they were to be used as traffic generators.
* VNF traffic generator/receiver may be using resources of the system under
  test, causing at least three forms of workload to increase as the traffic
  load increases (generation, switching, receiving).

The recommendation from vsperf is that tests for this sceanario must
include an external HW traffic generator to act as the tester/traffic transmitter
and receiver. The perscribed methodology to benchmark this deployment scanrio with
an external tester involves the following three steps:

#. Determine the forwarding capability and latency through the virtual interface
connected to the VNF/VM.

.. Figure:: vm2vm_virtual_interface_benchmark.png

   Virtual interfaces performance benchmark

#. Determine the forwarding capability and latency through the VNF/hypervisor.

.. Figure:: vm2vm_hypervisor_benchmark.png

   Hypervisor performance benchmark

#. Determine the forwarding capability and latency for the VNF to vSwitch to VNF
   taking the information from the previous two steps into account.

.. Figure:: vm2vm_benchmark.png

   VNF to vSwitch to VNF performance benchmark

vsperf also identified an alternative configuration for the final step:

.. Figure:: vm2vm_alternative_benchmark.png

   VNF to vSwitch to VNF alternative performance benchmark

.. 3.3.2:

Environment/infrastructure
============================
Intel is providing a hosted test-bed with nine bare-metal environments
allocated to different OPNFV projects. Currently a number of servers in
`Intel POD 3 <https://wiki.opnfv.org/display/pharos/Intel+Pod3>`__ are
allocated to vsperf:

  * pod3-wcp-node3 and pod3-wcp-node4 which are used for CI jobs.
  * pod3-node6 which is used as a vsperf sandbox environment.

vsperf CI
---------
vsperf CI jobs are broken down into:

  * Daily job:

    * Runs everyday takes about 10 hours to complete.
    * TESTCASES_DAILY='phy2phy_tput back2back phy2phy_tput_mod_vlan
      phy2phy_scalability pvp_tput pvp_back2back pvvp_tput pvvp_back2back'.
    * TESTPARAM_DAILY='--test-params TRAFFICGEN_PKT_SIZES=(64,128,512,1024,1518)'.

  * Merge job:

    * Runs whenever patches are merged to master.
    * Runs a basic Sanity test.

  * Verify job:

    * Runs every time a patch is pushed to gerrit.
    * Builds documentation.

Scripts:
--------
There are 2 scripts that are part of VSPERFs CI:

  * build-vsperf.sh: Lives in the VSPERF repository in the ci/ directory and is
    used to run vsperf with the appropriate cli parameters.
  * vswitchperf.yml: YAML description of our jenkins job. lives in the RELENG
    repository.

More info on vsperf CI can be found here:
https://wiki.opnfv.org/display/vsperf/VSPERF+CI

.. 3.3.3:

Responsibilities and authority
===============================
The group responsible for managing, designing, preparing and executing the
tests listed in the LTD are the vsperf committers and contributors. The vsperf
committers and contributors should work with the relavent OPNFV projects to
ensure that the infrastructure is in place for testing vswitches, and that the
results are published to common end point (a results database).