diff options
Diffstat (limited to 'netperf-2.4.4/doc/netperf.texi')
-rw-r--r-- | netperf-2.4.4/doc/netperf.texi | 2822 |
1 files changed, 0 insertions, 2822 deletions
diff --git a/netperf-2.4.4/doc/netperf.texi b/netperf-2.4.4/doc/netperf.texi deleted file mode 100644 index b4961fd..0000000 --- a/netperf-2.4.4/doc/netperf.texi +++ /dev/null @@ -1,2822 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename netperf.info -@settitle Care and Feeding of Netperf 2.4.X -@c %**end of header - -@copying -This is Rick Jones' feeble attempt at a Texinfo-based manual for the -netperf benchmark. - -Copyright @copyright{} 2005-2007 Hewlett-Packard Company -@quotation -Permission is granted to copy, distribute and/or modify this document -per the terms of the netperf source licence, a copy of which can be -found in the file @file{COPYING} of the basic netperf distribution. -@end quotation -@end copying - -@titlepage -@title Care and Feeding of Netperf -@subtitle Versions 2.4.3 and Later -@author Rick Jones @email{rick.jones2@@hp.com} -@c this is here to start the copyright page -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@c begin with a table of contents -@contents - -@ifnottex -@node Top, Introduction, (dir), (dir) -@top Netperf Manual - -@insertcopying -@end ifnottex - -@menu -* Introduction:: An introduction to netperf - what it is and whatit is not. -* Installing Netperf:: How to go about installing netperf. -* The Design of Netperf:: -* Global Command-line Options:: -* Using Netperf to Measure Bulk Data Transfer:: -* Using Netperf to Measure Request/Response :: -* Using Netperf to Measure Aggregate Performance:: -* Using Netperf to Measure Bidirectional Transfer:: -* Other Netperf Tests:: -* Address Resolution:: -* Enhancing Netperf:: -* Netperf4:: -* Concept Index:: -* Option Index:: - -@detailmenu - --- The Detailed Node Listing --- - -Introduction - -* Conventions:: - -Installing Netperf - -* Getting Netperf Bits:: -* Installing Netperf Bits:: -* Verifying Installation:: - -The Design of Netperf - -* CPU Utilization:: - -Global Command-line Options - -* Command-line Options Syntax:: -* Global Options:: - -Using Netperf to Measure Bulk Data Transfer - -* Issues in Bulk Transfer:: -* Options common to TCP UDP and SCTP tests:: - -Options common to TCP UDP and SCTP tests - -* TCP_STREAM:: -* TCP_MAERTS:: -* TCP_SENDFILE:: -* UDP_STREAM:: -* XTI_TCP_STREAM:: -* XTI_UDP_STREAM:: -* SCTP_STREAM:: -* DLCO_STREAM:: -* DLCL_STREAM:: -* STREAM_STREAM:: -* DG_STREAM:: - -Using Netperf to Measure Request/Response - -* Issues in Request/Response:: -* Options Common to TCP UDP and SCTP _RR tests:: - -Options Common to TCP UDP and SCTP _RR tests - -* TCP_RR:: -* TCP_CC:: -* TCP_CRR:: -* UDP_RR:: -* XTI_TCP_RR:: -* XTI_TCP_CC:: -* XTI_TCP_CRR:: -* XTI_UDP_RR:: -* DLCL_RR:: -* DLCO_RR:: -* SCTP_RR:: - -Using Netperf to Measure Aggregate Performance - -* Running Concurrent Netperf Tests:: -* Using --enable-burst:: - -Using Netperf to Measure Bidirectional Transfer - -* Bidirectional Transfer with Concurrent Tests:: -* Bidirectional Transfer with TCP_RR:: - -Other Netperf Tests - -* CPU rate calibration:: - -@end detailmenu -@end menu - -@node Introduction, Installing Netperf, Top, Top -@chapter Introduction - -@cindex Introduction - -Netperf is a benchmark that can be use to measure various aspect of -networking performance. The primary foci are bulk (aka -unidirectional) data transfer and request/response performance using -either TCP or UDP and the Berkeley Sockets interface. As of this -writing, the tests available either unconditionally or conditionally -include: - -@itemize @bullet -@item -TCP and UDP unidirectional transfer and request/response over IPv4 and -IPv6 using the Sockets interface. -@item -TCP and UDP unidirectional transfer and request/response over IPv4 -using the XTI interface. -@item -Link-level unidirectional transfer and request/response using the DLPI -interface. -@item -Unix domain sockets -@item -SCTP unidirectional transfer and request/response over IPv4 and IPv6 -using the sockets interface. -@end itemize - -While not every revision of netperf will work on every platform -listed, the intention is that at least some version of netperf will -work on the following platforms: - -@itemize @bullet -@item -Unix - at least all the major variants. -@item -Linux -@item -Windows -@item -OpenVMS -@item -Others -@end itemize - -Netperf is maintained and informally supported primarily by Rick -Jones, who can perhaps be best described as Netperf Contributing -Editor. Non-trivial and very appreciated assistance comes from others -in the network performance community, who are too numerous to mention -here. While it is often used by them, netperf is NOT supported via any -of the formal Hewlett-Packard support channels. You should feel free -to make enhancements and modifications to netperf to suit your -nefarious porpoises, so long as you stay within the guidelines of the -netperf copyright. If you feel so inclined, you can send your changes -to -@email{netperf-feedback@@netperf.org,netperf-feedback} for possible -inclusion into subsequent versions of netperf. - -If you would prefer to make contributions to networking benchmark -using certified ``open source'' license, please considuer netperf4, -which is distributed under the terms of the GPL. - -The @email{netperf-talk@@netperf.org,netperf-talk} mailing list is -available to discuss the care and feeding of netperf with others who -share your interest in network performance benchmarking. The -netperf-talk mailing list is a closed list and you must first -subscribe by sending email to -@email{netperf-talk-request@@netperf.org,netperf-talk-request}. - - -@menu -* Conventions:: -@end menu - -@node Conventions, , Introduction, Introduction -@section Conventions - -A @dfn{sizespec} is a one or two item, comma-separated list used as an -argument to a command-line option that can set one or two, related -netperf parameters. If you wish to set both parameters to separate -values, items should be separated by a comma: - -@example -parameter1,parameter2 -@end example - -If you wish to set the first parameter without altering the value of -the second from its default, you should follow the first item with a -comma: - -@example -parameter1, -@end example - - -Likewise, precede the item with a comma if you wish to set only the -second parameter: - -@example -,parameter2 -@end example - -An item with no commas: - -@example -parameter1and2 -@end example - -will set both parameters to the same value. This last mode is one of -the most frequently used. - -There is another variant of the comma-separated, two-item list called -a @dfn{optionspec} which is like a sizespec with the exception that a -single item with no comma: - -@example -parameter1 -@end example - -will only set the value of the first parameter and will leave the -second parameter at its default value. - -Netperf has two types of command-line options. The first are global -command line options. They are essentially any option not tied to a -particular test or group of tests. An example of a global -command-line option is the one which sets the test type - @option{-t}. - -The second type of options are test-specific options. These are -options which are only applicable to a particular test or set of -tests. An example of a test-specific option would be the send socket -buffer size for a TCP_STREAM test. - -Global command-line options are specified first with test-specific -options following after a @code{--} as in: - -@example -netperf <global> -- <test-specific> -@end example - - -@node Installing Netperf, The Design of Netperf, Introduction, Top -@chapter Installing Netperf - -@cindex Installation - -Netperf's primary form of distribution is source code. This allows -installation on systems other than those to which the authors have -ready access and thus the ability to create binaries. There are two -styles of netperf installation. The first runs the netperf server -program - netserver - as a child of inetd. This requires the -installer to have sufficient privileges to edit the files -@file{/etc/services} and @file{/etc/inetd.conf} or their -platform-specific equivalents. - -The second style is to run netserver as a standalone daemon. This -second method does not require edit privileges on @file{/etc/services} -and @file{/etc/inetd.conf} but does mean you must remember to run the -netserver program explicitly after every system reboot. - -This manual assumes that those wishing to measure networking -performance already know how to use anonymous FTP and/or a web -browser. It is also expected that you have at least a passing -familiarity with the networking protocols and interfaces involved. In -all honesty, if you do not have such familiarity, likely as not you -have some experience to gain before attempting network performance -measurements. The excellent texts by authors such as Stevens, Fenner -and Rudoff and/or Stallings would be good starting points. There are -likely other excellent sources out there as well. - -@menu -* Getting Netperf Bits:: -* Installing Netperf Bits:: -* Verifying Installation:: -@end menu - -@node Getting Netperf Bits, Installing Netperf Bits, Installing Netperf, Installing Netperf -@section Getting Netperf Bits - -Gzipped tar files of netperf sources can be retrieved via -@uref{ftp://ftp.netperf.org/netperf,anonymous FTP} -for ``released'' versions of the bits. Pre-release versions of the -bits can be retrieved via anonymous FTP from the -@uref{ftp://ftp.netperf.org/netperf/experimental,experimental} subdirectory. - -For convenience and ease of remembering, a link to the download site -is provided via the -@uref{http://www.netperf.org/, NetperfPage} - -The bits corresponding to each discrete release of netperf are -@uref{http://www.netperf.org/svn/netperf2/tags,tagged} for retrieval -via subversion. For example, there is a tag for the first version -corresponding to this version of the manual - -@uref{http://www.netperf.org/svn/netperf2/tags/netperf-2.4.3,netperf -2.4.3}. Those wishing to be on the bleeding edge of netperf -development can use subversion to grab the -@uref{http://www.netperf.org/svn/netperf2/trunk,top of trunk}. - -There are likely other places around the Internet from which one can -download netperf bits. These may be simple mirrors of the main -netperf site, or they may be local variants on netperf. As with -anything one downloads from the Internet, take care to make sure it is -what you really wanted and isn't some malicious Trojan or whatnot. -Caveat downloader. - -As a general rule, binaries of netperf and netserver are not -distributed from ftp.netperf.org. From time to time a kind soul or -souls has packaged netperf as a Debian package available via the -apt-get mechanism or as an RPM. I would be most interested in -learning how to enhance the makefiles to make that easier for people, -and perhaps to generate HP-UX swinstall``depots.'' - -@node Installing Netperf Bits, Verifying Installation, Getting Netperf Bits, Installing Netperf -@section Installing Netperf - -Once you have downloaded the tar file of netperf sources onto your -system(s), it is necessary to unpack the tar file, cd to the netperf -directory, run configure and then make. Most of the time it should be -sufficient to just: - -@example -gzcat <netperf-version>.tar.gz | tar xf - -cd <netperf-version> -./configure -make -make install -@end example - -Most of the ``usual'' configure script options should be present -dealing with where to install binaries and whatnot. -@example -./configure --help -@end example -should list all of those and more. - -@vindex --enable-cpuutil, Configure -If the netperf configure script does not know how to automagically -detect which CPU utilization mechanism to use on your platform you may -want to add a @code{--enable-cpuutil=mumble} option to the configure -command. If you have knowledge and/or experience to contribute to -that area, feel free to contact @email{netperf-feedback@@netperf.org}. - -@vindex --enable-xti, Configure -@vindex --enable-unix, Configure -@vindex --enable-dlpi, Configure -@vindex --enable-sctp, Configure -Similarly, if you want tests using the XTI interface, Unix Domain -Sockets, DLPI or SCTP it will be necessary to add one or more -@code{--enable-[xti|unix|dlpi|sctp]=yes} options to the configure -command. As of this writing, the configure script will not include -those tests automagically. - -On some platforms, it may be necessary to precede the configure -command with a CFLAGS and/or LIBS variable as the netperf configure -script is not yet smart enough to set them itself. Whenever possible, -these requirements will be found in @file{README.@var{platform}} files. -Expertise and assistance in making that more automagical in the -configure script would be most welcome. - -@cindex Limiting Bandwidth -@cindex Bandwidth Limitation -@vindex --enable-intervals, Configure -@vindex --enable-histogram, Configure -Other optional configure-time settings include -@code{--enable-intervals=yes} to give netperf the ability to ``pace'' -its _STREAM tests and @code{--enable-histogram=yes} to have netperf -keep a histogram of interesting times. Each of these will have some -effect on the measured result. If your system supports -@code{gethrtime()} the effect of the histogram measurement should be -minimized but probably still measurable. For example, the histogram -of a netperf TCP_RR test will be of the individual transaction times: -@example -netperf -t TCP_RR -H lag -v 2 -TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : histogram -Local /Remote -Socket Size Request Resp. Elapsed Trans. -Send Recv Size Size Time Rate -bytes Bytes bytes bytes secs. per sec - -16384 87380 1 1 10.00 3538.82 -32768 32768 -Alignment Offset -Local Remote Local Remote -Send Recv Send Recv - 8 0 0 0 -Histogram of request/response times -UNIT_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 -TEN_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 -HUNDRED_USEC : 0: 34480: 111: 13: 12: 6: 9: 3: 4: 7 -UNIT_MSEC : 0: 60: 50: 51: 44: 44: 72: 119: 100: 101 -TEN_MSEC : 0: 105: 0: 0: 0: 0: 0: 0: 0: 0 -HUNDRED_MSEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 -UNIT_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 -TEN_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 ->100_SECS: 0 -HIST_TOTAL: 35391 -@end example - -Long-time users of netperf will notice the expansion of the main test -header. This stems from the merging-in of IPv6 with the standard IPv4 -tests and the addition of code to specify addressing information for -both sides of the data connection. - -The histogram you see above is basically a base-10 log histogram where -we can see that most of the transaction times were on the order of one -hundred to one-hundred, ninety-nine microseconds, but they were -occasionally as long as ten to nineteen milliseconds - -The @option{--enable-demo=yes} configure option will cause code to be -included to report interim results during a test run. The rate at -which interim results are reported can then be controlled via the -global @option{-D} option. Here is an example of --enable-demo mode -output: - -@example -src/netperf -D 1.35 -H lag -f M -TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : demo -Interim result: 9.66 MBytes/s over 1.67 seconds -Interim result: 9.64 MBytes/s over 1.35 seconds -Interim result: 9.58 MBytes/s over 1.36 seconds -Interim result: 9.51 MBytes/s over 1.36 seconds -Interim result: 9.71 MBytes/s over 1.35 seconds -Interim result: 9.66 MBytes/s over 1.36 seconds -Interim result: 9.61 MBytes/s over 1.36 seconds -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. MBytes/sec - - 32768 16384 16384 10.00 9.61 -@end example - -Notice how the units of the interim result track that requested by the -@option{-f} option. Also notice that sometimes the interval will be -longer than the value specified in the @option{-D} option. This is -normal and stems from how demo mode is implemented without relying on -interval timers, but by calculating how many units of work must be -performed to take at least the desired interval. - -As of this writing, a @code{make install} will not actually update the -files @file{/etc/services} and/or @file{/etc/inetd.conf} or their -platform-specific equivalents. It remains necessary to perform that -bit of installation magic by hand. Patches to the makefile sources to -effect an automagic editing of the necessary files to have netperf -installed as a child of inetd would be most welcome. - -Starting the netserver as a standalone daemon should be as easy as: -@example -$ netserver -Starting netserver at port 12865 -Starting netserver at hostname 0.0.0.0 port 12865 and family 0 -@end example - -Over time the specifics of the messages netserver prints to the screen -may change but the gist will remain the same. - -If the compilation of netperf or netserver happens to fail, feel free -to contact @email{netperf-feedback@@netperf.org} or join and ask in -@email{netperf-talk@@netperf.org}. However, it is quite important -that you include the actual compilation errors and perhaps even the -configure log in your email. Otherwise, it will be that much more -difficult for someone to assist you. - -@node Verifying Installation, , Installing Netperf Bits, Installing Netperf -@section Verifying Installation - -Basically, once netperf is installed and netserver is configured as a -child of inetd, or launched as a standalone daemon, simply typing: -@example -netperf -@end example -should result in output similar to the following: -@example -$ netperf -TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost.localdomain (127.0.0.1) port 0 AF_INET -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. 10^6bits/sec - - 87380 16384 16384 10.00 2997.84 -@end example - - -@node The Design of Netperf, Global Command-line Options, Installing Netperf, Top -@chapter The Design of Netperf - -@cindex Design of Netperf - -Netperf is designed around a basic client-server model. There are -two executables - netperf and netserver. Generally you will only -execute the netperf program, with the netserver program being invoked -by the remote system's inetd or equivalent. -When you execute netperf, the first that that will happen is the -establishment of a control connection to the remote system. This -connection will be used to pass test configuration information and -results to and from the remote system. Regardless of the type of test -to be run, the control connection will be a TCP connection using BSD -sockets. The control connection can use either IPv4 or IPv6. - -Once the control connection is up and the configuration information -has been passed, a separate ``data'' connection will be opened for the -measurement itself using the API's and protocols appropriate for the -specified test. When the test is completed, the data connection will -be torn-down and results from the netserver will be passed-back via the -control connection and combined with netperf's result for display to -the user. - -Netperf places no traffic on the control connection while a test is in -progress. Certain TCP options, such as SO_KEEPALIVE, if set as your -systems' default, may put packets out on the control connection while -a test is in progress. Generally speaking this will have no effect on -the results. - -@menu -* CPU Utilization:: -@end menu - -@cindex CPU Utilization -@node CPU Utilization, , The Design of Netperf, The Design of Netperf -@section CPU Utilization - -CPU utilization is an important, and alas all-too infrequently -reported component of networking performance. Unfortunately, it can -be one of the most difficult metrics to measure accurately as many -systems offer mechanisms that are at best il-suited to measuring CPU -utilization in high interrupt rate (eg networking) situations. - -CPU utilization in netperf is reported as a value between 0 and 100% -regardless of the number of CPUs involved. In addition to CPU -utilization, netperf will report a metric called a @dfn{service -demand}. The service demand is the normalization of CPU utilization -and work performed. For a _STREAM test it is the microseconds of CPU -time consumed to transfer on KB (K == 1024) of data. For a _RR test -it is the microseconds of CPU time consumed processing a single -transaction. For both CPU utilization and service demand, lower is -better. - -Service demand can be particularly useful when trying to gauge the -effect of a performance change. It is essentially a measure of -efficiency, with smaller values being more efficient. - -Netperf is coded to be able to use one of several, generally -platform-specific CPU utilization measurement mechanisms. Single -letter codes will be included in the CPU portion of the test banner to -indicate which mechanism was used on each of the local (netperf) and -remote (netserver) system. - -As of this writing those codes are: - -@table @code -@item U -The CPU utilization measurement mechanism was unknown to netperf or -netperf/netserver was not compiled to include CPU utilization -measurements. The code for the null CPU utilization mechanism can be -found in @file{src/netcpu_none.c}. -@item I -An HP-UX-specific CPU utilization mechanism whereby the kernel -incremented a per-CPU counter by one for each trip through the idle -loop. This mechanism was only available on specially-compiled HP-UX -kernels prior to HP-UX 10 and is mentioned here only for the sake of -historical completeness and perhaps as a suggestion to those who might -be altering other operating systems. While rather simple, perhaps even -simplistic, this mechanism was quite robust and was not affected by -the concerns of statistical methods, or methods attempting to track -time in each of user, kernel, interrupt and idle modes which require -quite careful accounting. It can be thought-of as the in-kernel -version of the looper @code{L} mechanism without the context switch -overhead. This mechanism required calibration. -@item P -An HP-UX-specific CPU utilization mechanism whereby the kernel -keeps-track of time (in the form of CPU cycles) spent in the kernel -idle loop (HP-UX 10.0 to 11.23 inclusive), or where the kernel keeps -track of time spent in idle, user, kernel and interrupt processing -(HP-UX 11.23 and later). The former requires calibration, the latter -does not. Values in either case are retrieved via one of the pstat(2) -family of calls, hence the use of the letter @code{P}. The code for -these mechanisms is found in @file{src/netcpu_pstat.c} and -@file{src/netcpu_pstatnew.c} respectively. -@item K -A Solaris-specific CPU utilization mechanism where by the kernel -keeps track of ticks (eg HZ) spent in the idle loop. This method is -statistical and is known to be inaccurate when the interrupt rate is -above epsilon as time spent processing interrupts is not subtracted -from idle. The value is retrieved via a kstat() call - hence the use -of the letter @code{K}. Since this mechanism uses units of ticks (HZ) -the calibration value should invariably match HZ. (Eg 100) The code -for this mechanism is implemented in @file{src/netcpu_kstat.c}. -@item M -A Solaris-specific mechanism available on Solaris 10 and latter which -uses the new microstate accounting mechanisms. There are two, alas, -overlapping, mechanisms. The first tracks nanoseconds spent in user, -kernel, and idle modes. The second mechanism tracks nanoseconds spent -in interrupt. Since the mechanisms overlap, netperf goes through some -hand-waving to try to ``fix'' the problem. Since the accuracy of the -handwaving cannot be completely determined, one must presume that -while better than the @code{K} mechanism, this mechanism too is not -without issues. The values are retrieved via kstat() calls, but the -letter code is set to @code{M} to distinguish this mechanism from the -even less accurate @code{K} mechanism. The code for this mechanism is -implemented in @file{src/netcpu_kstat10.c}. -@item L -A mechanism based on ``looper''or ``soaker'' processes which sit in -tight loops counting as fast as they possibly can. This mechanism -starts a looper process for each known CPU on the system. The effect -of processor hyperthreading on the mechanism is not yet known. This -mechanism definitely requires calibration. The code for the -``looper''mechanism can be found in @file{src/netcpu_looper.c} -@item N -A Microsoft Windows-specific mechanism, the code for which can be -found in @file{src/netcpu_ntperf.c}. This mechanism too is based on -what appears to be a form of micro-state accounting and requires no -calibration. On laptops, or other systems which may dynamically alter -the CPU frequency to minimize power consumtion, it has been suggested -that this mechanism may become slightly confsed, in which case using -BIOS settings to disable the power saving would be indicated. - -@item S -This mechanism uses @file{/proc/stat} on Linux to retrieve time -(ticks) spent in idle mode. It is thought but not known to be -reasonably accurate. The code for this mechanism can be found in -@file{src/netcpu_procstat.c}. -@item C -A mechanism somewhat similar to @code{S} but using the sysctl() call -on BSD-like Operating systems (*BSD and MacOS X). The code for this -mechanism can be found in @file{src/netcpu_sysctl.c}. -@item Others -Other mechanisms included in netperf in the past have included using -the times() and getrusage() calls. These calls are actually rather -poorly suited to the task of measuring CPU overhead for networking as -they tend to be process-specific and much network-related processing -can happen outside the context of a process, in places where it is not -a given it will be charged to the correct, or even a process. They -are mentioned here as a warning to anyone seeing those mechanisms used -in other networking benchmarks. These mechanisms are not available in -netperf 2.4.0 and later. -@end table - - - -For many platforms, the configure script will chose the best available -CPU utilization mechanism. However, some platforms have no -particularly good mechanisms. On those platforms, it is probably best -to use the ``LOOPER'' mechanism which is basically some number of -processes (as many as there are processors) sitting in tight little -loops counting as fast as they can. The rate at which the loopers -count when the system is believed to be idle is compared with the rate -when the system is running netperf and the ratio is used to compute -CPU utilization. - -In the past, netperf included some mechanisms that only reported CPU -time charged to the calling process. Those mechanisms have been -removed from netperf versions 2.4.0 and later because they are -hopelessly inaccurate. Networking can and often results in CPU time -being spent in places - such as interrupt contexts - that do not get -charged to a or the correct process. - -In fact, time spent in the processing of interrupts is a common issue -for many CPU utilization mechanisms. In particular, the ``PSTAT'' -mechanism was eventually known to have problems accounting for certain -interrupt time prior to HP-UX 11.11 (11iv1). HP-UX 11iv1 and later -are known to be good. The ``KSTAT'' mechanism is known to have -problems on all versions of Solaris up to and including Solaris 10. -Even the microstate accounting available via kstat in Solaris 10 has -issues, though perhaps not as bad as those of prior versions. - -The /proc/stat mechanism under Linux is in what the author would -consider an ``uncertain'' category as it appears to be statistical, -which may also have issues with time spent processing interrupts. - -In summary, be sure to ``sanity-check'' the CPU utilization figures -with other mechanisms. However, platform tools such as top, vmstat or -mpstat are often based on the same mechanisms used by netperf. - -@node Global Command-line Options, Using Netperf to Measure Bulk Data Transfer, The Design of Netperf, Top -@chapter Global Command-line Options - -This section describes each of the global command-line options -available in the netperf and netserver binaries. Essentially, it is -an expanded version of the usage information displayed by netperf or -netserver when invoked with the @option{-h} global command-line -option. - -@menu -* Command-line Options Syntax:: -* Global Options:: -@end menu - -@node Command-line Options Syntax, Global Options, Global Command-line Options, Global Command-line Options -@comment node-name, next, previous, up -@section Command-line Options Syntax - -Revision 1.8 of netperf introduced enough new functionality to overrun -the English alphabet for mnemonic command-line option names, and the -author was not and is not quite ready to switch to the contemporary -@option{--mumble} style of command-line options. (Call him a Luddite). - -For this reason, the command-line options were split into two parts - -the first are the global command-line options. They are options that -affect nearly any and every test type of netperf. The second type are -the test-specific command-line options. Both are entered on the same -command line, but they must be separated from one another by a @code{--} -for correct parsing. Global command-line options come first, followed -by the @code{--} and then test-specific command-line options. If there -are no test-specific options to be set, the @code{--} may be omitted. If -there are no global command-line options to be set, test-specific -options must still be preceded by a @code{--}. For example: -@example -netperf <global> -- <test-specific> -@end example -sets both global and test-specific options: -@example -netperf <global> -@end example -sets just global options and: -@example -netperf -- <test-specific> -@end example -sets just test-specific options. - -@node Global Options, , Command-line Options Syntax, Global Command-line Options -@comment node-name, next, previous, up -@section Global Options - -@table @code -@vindex -a, Global -@item -a <sizespec> -This option allows you to alter the alignment of the buffers used in -the sending and receiving calls on the local system.. Changing the -alignment of the buffers can force the system to use different copy -schemes, which can have a measurable effect on performance. If the -page size for the system were 4096 bytes, and you want to pass -page-aligned buffers beginning on page boundaries, you could use -@samp{-a 4096}. By default the units are bytes, but suffix of ``G,'' -``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20 (MB) or -2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k'' will specify -units of 10^9, 10^6 or 10^3 bytes respectively. [Default: 8 bytes] - -@vindex -A, Global -@item -A <sizespec> -This option is identical to the @option{-a} option with the difference -being it affects alignments for the remote system. - -@vindex -b, Global -@item -b <size> -This option is only present when netperf has been configure with ---enable-intervals=yes prior to compilation. It sets the size of the -burst of send calls in a _STREAM test. When used in conjunction with -the @option{-w} option it can cause the rate at which data is sent to -be ``paced.'' - -@vindex -B, Global -@item -B <string> -This option will cause @option{<string>} to be appended to the brief -(see -P) output of netperf. - -@vindex -c, Global -@item -c [rate] -This option will ask that CPU utilization and service demand be -calculated for the local system. For those CPU utilization mechanisms -requiring calibration, the options rate parameter may be specified to -preclude running another calibration step, saving 40 seconds of time. -For those CPU utilization mechanisms requiring no calibration, the -optional rate parameter will be utterly and completely ignored. -[Default: no CPU measurements] - -@vindex -C, Global -@item -C [rate] -This option requests CPU utilization and service demand calculations -for the remote system. It is otherwise identical to the @option{-c} -option. - -@vindex -d, Global -@item -d -Each instance of this option will increase the quantity of debugging -output displayed during a test. If the debugging output level is set -high enough, it may have a measurable effect on performance. -Debugging information for the local system is printed to stdout. -Debugging information for the remote system is sent by default to the -file @file{/tmp/netperf.debug}. [Default: no debugging output] - -@vindex -D, Global -@item -D [interval,units] -This option is only available when netperf is configured with ---enable-demo=yes. When set, it will cause netperf to emit periodic -reports of performance during the run. [@var{interval},@var{units}] -follow the semantics of an optionspec. If specified, -@var{interval} gives the minimum interval in real seconds, it does not -have to be whole seconds. The @var{units} value can be used for the -first guess as to how many units of work (bytes or transactions) must -be done to take at least @var{interval} seconds. If omitted, -@var{interval} defaults to one second and @var{units} to values -specific to each test type. - -@vindex -f, Global -@item -f G|M|K|g|m|k -This option can be used to change the reporting units for _STREAM -tests. Arguments of ``G,'' ``M,'' or ``K'' will set the units to -2^30, 2^20 or 2^10 bytes/s respectively (EG power of two GB, MB or -KB). Arguments of ``g,'' ``,m'' or ``k'' will set the units to 10^9, -10^6 or 10^3 bits/s respectively. [Default: 'm' or 10^6 bits/s] - -@vindex -F, Global -@item -F <fillfile> -This option specified the file from which send which buffers will be -pre-filled . While the buffers will contain data from the specified -file, the file is not fully transfered to the remote system as the -receiving end of the test will not write the contents of what it -receives to a file. This can be used to pre-fill the send buffers -with data having different compressibility and so is useful when -measuring performance over mechanisms which perform compression. - -While optional for most tests, this option is required for a test -utilizing the sendfile() or related calls because sendfile tests need -a name of a file to reference. - -@vindex -h, Global -@item -h -This option causes netperf to display its usage string and exit to the -exclusion of all else. - -@vindex -H, Global -@item -H <optionspec> -This option will set the name of the remote system and or the address -family used for the control connection. For example: -@example --H linger,4 -@end example -will set the name of the remote system to ``tardy'' and tells netperf to -use IPv4 addressing only. -@example --H ,6 -@end example -will leave the name of the remote system at its default, and request -that only IPv6 addresses be used for the control connection. -@example --H lag -@end example -will set the name of the remote system to ``lag'' and leave the -address family to AF_UNSPEC which means selection of IPv4 vs IPv6 is -left to the system's address resolution. - -A value of ``inet'' can be used in place of ``4'' to request IPv4 only -addressing. Similarly, a value of ``inet6'' can be used in place of -``6'' to request IPv6 only addressing. A value of ``0'' can be used -to request either IPv4 or IPv6 addressing as name resolution dictates. - -By default, the options set with the global @option{-H} option are -inherited by the test for its data connection, unless a test-specific -@option{-H} option is specified. - -If a @option{-H} option follows either the @option{-4} or @option{-6} -options, the family setting specified with the -H option will override -the @option{-4} or @option{-6} options for the remote address -family. If no address family is specified, settings from a previous -@option{-4} or @option{-6} option will remain. In a nutshell, the -last explicit global command-line option wins. - -[Default: ``localhost'' for the remote name/IP address and ``0'' (eg -AF_UNSPEC) for the remote address family.] - -@vindex -I, Global -@item -I <optionspec> -This option enables the calculation of confidence intervals and sets -the confidence and width parameters with the first have of the -optionspec being either 99 or 95 for 99% or 95% confidence -respectively. The second value of the optionspec specifies the width -of the desired confidence interval. For example -@example --I 99,5 -@end example -asks netperf to be 99% confident that the measured mean values for -throughput and CPU utilization are within +/- 2.5% of the ``real'' -mean values. If the @option{-i} option is specified and the -@option{-I} option is omitted, the confidence defaults to 99% and the -width to 5% (giving +/- 2.5%) - -If netperf calculates that the desired confidence intervals have not -been met, it emits a noticeable warning that cannot be suppressed with -the @option{-P} or @option{-v} options: - -@example -netperf -H tardy.cup -i 3 -I 99,5 -TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to tardy.cup.hp.com (15.244.44.58) port 0 AF_INET : +/-2.5% @ 99% conf. -!!! WARNING -!!! Desired confidence was not achieved within the specified iterations. -!!! This implies that there was variability in the test environment that -!!! must be investigated before going further. -!!! Confidence intervals: Throughput : 6.8% -!!! Local CPU util : 0.0% -!!! Remote CPU util : 0.0% - -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. 10^6bits/sec - - 32768 16384 16384 10.01 40.23 -@end example - -Where we see that netperf did not meet the desired convidence -intervals. Instead of being 99% confident it was within +/- 2.5% of -the real mean value of throughput it is only confident it was within -+/-3.4%. In this example, increasing the @option{-i} option -(described below) and/or increasing the iteration length with the -@option{-l} option might resolve the situation. - -@vindex -i, Global -@item -i <sizespec> -This option enables the calculation of confidence intervals and sets -the minimum and maximum number of iterations to run in attempting to -achieve the desired confidence interval. The first value sets the -maximum number of iterations to run, the second, the minimum. The -maximum number of iterations is silently capped at 30 and the minimum -is silently floored at 3. Netperf repeats the measurement the minimum -number of iterations and continues until it reaches either the -desired confidence interval, or the maximum number of iterations, -whichever comes first. - -If the @option{-I} option is specified and the @option{-i} option -omitted the maximum number of iterations is set to 10 and the minimum -to three. - -If netperf determines that the desired confidence intervals have not -been met, it emits a noticeable warning. - -The total test time will be somewhere between the minimum and maximum -number of iterations multiplied by the test length supplied by the -@option{-l} option. - -@vindex -l, Global -@item -l testlen -This option controls the length of any @b{one} iteration of the requested -test. A positive value for @var{testlen} will run each iteration of -the test for at least @var{testlen} seconds. A negative value for -@var{testlen} will run each iteration for the absolute value of -@var{testlen} transactions for a _RR test or bytes for a _STREAM test. -Certain tests, notably those using UDP can only be timed, they cannot -be limited by transaction or byte count. - -In some situations, individual iterations of a test may run for longer -for the number of seconds specified by the @option{-l} option. In -particular, this may occur for those tests where the socket buffer -size(s) are significantly longer than the bandwidthXdelay product of -the link(s) over which the data connection passes, or those tests -where there may be non-trivial numbers of retransmissions. - -If confidence intervals are enabled via either @option{-I} or -@option{-i} the total length of the netperf test will be somewhere -between the minimum and maximum iteration count multiplied by -@var{testlen}. - -@vindex -L, Global -@item -L <optionspec> -This option is identical to the @option{-H} option with the difference -being it sets the _local_ hostname/IP and/or address family -information. This option is generally unnecessary, but can be useful -when you wish to make sure that the netperf control and data -connections go via different paths. It can also come-in handy if one -is trying to run netperf through those evil, end-to-end breaking -things known as firewalls. - -[Default: 0.0.0.0 (eg INADDR_ANY) for IPv4 and ::0 for IPv6 for the -local name. AF_UNSPEC for the local address family.] - -@vindex -n, Global -@item -n numcpus -This option tells netperf how many CPUs it should ass-u-me are active -on the system running netperf. In particular, this is used for the -@ref{CPU Utilization,CPU utilization} and service demand calculations. -On certain systems, netperf is able to determine the number of CPU's -automagically. This option will override any number netperf might be -able to determine on its own. - -Note that this option does _not_ set the number of CPUs on the system -running netserver. When netperf/netserver cannot automagically -determine the number of CPUs that can only be set for netserver via a -netserver @option{-n} command-line option. - -@vindex -N, Global -@item -N -This option tells netperf to forego establishing a control -connection. This makes it is possible to run some limited netperf -tests without a corresponding netserver on the remote system. - -With this option set, the test to be run is to get all the addressing -information it needs to establish its data connection from the command -line or internal defaults. If not otherwise specified by -test-specific command line options, the data connection for a -``STREAM'' or ``SENDFILE'' test will be to the ``discard'' port, an -``RR'' test will be to the ``echo'' port, and a ``MEARTS'' test will -be to the chargen port. - -The response size of an ``RR'' test will be silently set to be the -same as the request size. Otherwise the test would hang if the -response size was larger than the request size, or would report an -incorrect, inflated transaction rate if the response size was less -than the request size. - -Since there is no control connection when this option is specified, it -is not possible to set ``remote'' properties such as socket buffer -size and the like via the netperf command line. Nor is it possible to -retrieve such interesting remote information as CPU utilization. -These items will be set to values which when displayed should make it -immediately obvious that was the case. - -The only way to change remote characteristics such as socket buffer -size or to obtain information such as CPU utilization is to employ -platform-specific methods on the remote system. Frankly, if one has -access to the remote system to employ those methods one aught to be -able to run a netserver there. However, that ability may not be -present in certain ``support'' situations, hence the addition of this -option. - -Added in netperf 2.4.3. - -@vindex -o, Global -@item -o <sizespec> -The value(s) passed-in with this option will be used as an offset -added to the alignment specified with the @option{-a} option. For -example: -@example --o 3 -a 4096 -@end example -will cause the buffers passed to the local send and receive calls to -begin three bytes past an address aligned to 4096 bytes. [Default: 0 -bytes] - -@vindex -O, Global -@item -O <sizespec> -This option behaves just as the @option{-o} option but on the remote -system and in conjunction with the @option{-A} option. [Default: 0 -bytes] - -@vindex -p, Global -@item -p <optionspec> -The first value of the optionspec passed-in with this option tells -netperf the port number at which it should expect the remote netserver -to be listening for control connections. The second value of the -optionspec will request netperf to bind to that local port number -before establishing the control connection. For example -@example --p 12345 -@end example -tells netperf that the remote netserver is listening on port 12345 and -leaves selection of the local port number for the control connection -up to the local TCP/IP stack whereas -@example --p ,32109 -@end example -leaves the remote netserver port at the default value of 12865 and -causes netperf to bind to the local port number 32109 before -connecting to the remote netserver. - -In general, setting the local port number is only necessary when one -is looking to run netperf through those evil, end-to-end breaking -things known as firewalls. - -@vindex -P, Global -@item -P 0|1 -A value of ``1'' for the @option{-P} option will enable display of -the test banner. A value of ``0'' will disable display of the test -banner. One might want to disable display of the test banner when -running the same basic test type (eg TCP_STREAM) multiple times in -succession where the test banners would then simply be redundant and -unnecessarily clutter the output. [Default: 1 - display test banners] - -@vindex -t, Global -@item -t testname -This option is used to tell netperf which test you wish to run. As of -this writing, valid values for @var{testname} include: -@itemize -@item -@ref{TCP_STREAM}, @ref{TCP_MAERTS}, @ref{TCP_SENDFILE}, @ref{TCP_RR}, @ref{TCP_CRR}, @ref{TCP_CC} -@item -@ref{UDP_STREAM}, @ref{UDP_RR} -@item -@ref{XTI_TCP_STREAM}, @ref{XTI_TCP_RR}, @ref{XTI_TCP_CRR}, @ref{XTI_TCP_CC} -@item -@ref{XTI_UDP_STREAM}, @ref{XTI_UDP_RR} -@item -@ref{SCTP_STREAM}, @ref{SCTP_RR} -@item -@ref{DLCO_STREAM}, @ref{DLCO_RR}, @ref{DLCL_STREAM}, @ref{DLCL_RR} -@item -@ref{Other Netperf Tests,LOC_CPU}, @ref{Other Netperf Tests,REM_CPU} -@end itemize -Not all tests are always compiled into netperf. In particular, the -``XTI,'' ``SCTP,'' ``UNIX,'' and ``DL*'' tests are only included in -netperf when configured with -@option{--enable-[xti|sctp|unix|dlpi]=yes}. - -Netperf only runs one type of test no matter how many @option{-t} -options may be present on the command-line. The last @option{-t} -global command-line option will determine the test to be -run. [Default: TCP_STREAM] - -@vindex -v, Global -@item -v verbosity -This option controls how verbose netperf will be in its output, and is -often used in conjunction with the @option{-P} option. If the -verbosity is set to a value of ``0'' then only the test's SFM (Single -Figure of Merit) is displayed. If local @ref{CPU Utilization,CPU -utilization} is requested via the @option{-c} option then the SFM is -the local service demand. Othersise, if remote CPU utilization is -requested via the @option{-C} option then the SFM is the remote -service demand. If neither local nor remote CPU utilization are -requested the SFM will be the measured throughput or transaction rate -as implied by the test specified with the @option{-t} option. - -If the verbosity level is set to ``1'' then the ``normal'' netperf -result output for each test is displayed. - -If the verbosity level is set to ``2'' then ``extra'' information will -be displayed. This may include, but is not limited to the number of -send or recv calls made and the average number of bytes per send or -recv call, or a histogram of the time spent in each send() call or for -each transaction if netperf was configured with -@option{--enable-histogram=yes}. [Default: 1 - normal verbosity] - -@vindex -w, Global -@item -w time -If netperf was configured with @option{--enable-intervals=yes} then -this value will set the inter-burst time to time milliseconds, and the -@option{-b} option will set the number of sends per burst. The actual -inter-burst time may vary depending on the system's timer resolution. - -@vindex -W, Global -@item -W <sizespec> -This option controls the number of buffers in the send (first or only -value) and or receive (second or only value) buffer rings. Unlike -some benchmarks, netperf does not continuously send or receive from a -single buffer. Instead it rotates through a ring of -buffers. [Default: One more than the size of the send or receive -socket buffer sizes (@option{-s} and/or @option{-S} options) divided -by the send @option{-m} or receive @option{-M} buffer size -respectively] - -@vindex -4, Global -@item -4 -Specifying this option will set both the local and remote address -families to AF_INET - that is use only IPv4 addresses on the control -connection. This can be overridden by a subsequent @option{-6}, -@option{-H} or @option{-L} option. Basically, the last option -explicitly specifying an address family wins. Unless overridden by a -test-specific option, this will be inherited for the data connection -as well. - -@vindex -6, Global -@item -6 -Specifying this option will set both local and and remote address -families to AF_INET6 - that is use only IPv6 addresses on the control -connection. This can be overridden by a subsequent @option{-4}, -@option{-H} or @option{-L} option. Basically, the last address family -explicitly specified wins. Unless overridden by a test-specific -option, this will be inherited for the data connection as well. - -@end table - - -@node Using Netperf to Measure Bulk Data Transfer, Using Netperf to Measure Request/Response , Global Command-line Options, Top -@chapter Using Netperf to Measure Bulk Data Transfer - -The most commonly measured aspect of networked system performance is -that of bulk or unidirectional transfer performance. Everyone wants -to know how many bits or bytes per second they can push across the -network. The netperf convention for a bulk data transfer test name is -to tack a ``_STREAM'' suffix to a test name. - -@menu -* Issues in Bulk Transfer:: -* Options common to TCP UDP and SCTP tests:: -@end menu - -@node Issues in Bulk Transfer, Options common to TCP UDP and SCTP tests, Using Netperf to Measure Bulk Data Transfer, Using Netperf to Measure Bulk Data Transfer -@comment node-name, next, previous, up -@section Issues in Bulk Transfer - -There are any number of things which can affect the performance of a -bulk transfer test. - -Certainly, absent compression, bulk-transfer tests can be limited by -the speed of the slowest link in the path from the source to the -destination. If testing over a gigabit link, you will not see more -than a gigabit :) Such situations can be described as being -@dfn{network-limited} or @dfn{NIC-limited}. - -CPU utilization can also affect the results of a bulk-transfer test. -If the networking stack requires a certain number of instructions or -CPU cycles per KB of data transferred, and the CPU is limited in the -number of instructions or cycles it can provide, then the transfer can -be described as being @dfn{CPU-bound}. - -A bulk-transfer test can be CPU bound even when netperf reports less -than 100% CPU utilization. This can happen on an MP system where one -or more of the CPUs saturate at 100% but other CPU's remain idle. -Typically, a single flow of data, such as that from a single instance -of a netperf _STREAM test cannot make use of much more than the power -of one CPU. Exceptions to this generally occur when netperf and/or -netserver run on CPU(s) other than the CPU(s) taking interrupts from -the NIC(s). - -Distance and the speed-of-light can affect performance for a -bulk-transfer; often this can be mitigated by using larger windows. -One common limit to the performance of a transport using window-based -flow-control is: -@example -Throughput <= WindowSize/RoundTripTime -@end example -As the sender can only have a window's-worth of data outstanding on -the network at any one time, and the soonest the sender can receive a -window update from the receiver is one RoundTripTime (RTT). TCP and -SCTP are examples of such protocols. - -Packet losses and their effects can be particularly bad for -performance. This is especially true if the packet losses result in -retransmission timeouts for the protocol(s) involved. By the time a -retransmission timeout has happened, the flow or connection has sat -idle for a considerable length of time. - -On many platforms, some variant on the @command{netstat} command can -be used to retrieve statistics about packet loss and -retransmission. For example: -@example -netstat -p tcp -@end example -will retrieve TCP statistics on the HP-UX Operating System. On other -platforms, it may not be possible to retrieve statistics for a -specific protocol and something like: -@example -netstat -s -@end example -would be used instead. - -Many times, such network statistics are keep since the time the stack -started, and we are only really interested in statistics from when -netperf was running. In such situations something along the lines of: -@example -netstat -p tcp > before -netperf -t TCP_mumble... -netstat -p tcp > after -@end example -is indicated. The -@uref{ftp://ftp.cup.hp.com/dist/networking/tools/,beforeafter} utility -can be used to subtract the statistics in @file{before} from the -statistics in @file{after} -@example -beforeafter before after > delta -@end example -and then one can look at the statistics in @file{delta}. Beforeafter -is distributed in source form so one can compile it on the platofrm(s) -of interest. - -While it was written with HP-UX's netstat in mind, the -@uref{ftp://ftp.cup.hp.com/dist/networking/briefs/annotated_netstat.txt,annotated -netstat} writeup may be helpful with other platforms as well. - -@node Options common to TCP UDP and SCTP tests, , Issues in Bulk Transfer, Using Netperf to Measure Bulk Data Transfer -@comment node-name, next, previous, up -@section Options common to TCP UDP and SCTP tests - -Many ``test-specific'' options are actually common across the -different tests. For those tests involving TCP, UDP and SCTP, whether -using the BSD Sockets or the XTI interface those common options -include: - -@table @code -@vindex -h, Test-specific -@item -h -Display the test-suite-specific usage string and exit. For a TCP_ or -UDP_ test this will be the usage string from the source file -nettest_bsd.c. For an XTI_ test, this will be the usage string from -the source file nettest_xti.c. For an SCTP test, this will be the -usage string from the source file nettest_sctp.c. - -@item -H <optionspec> -Normally, the remote hostname|IP and address family information is -inherited from the settings for the control connection (eg global -command-line @option{-H}, @option{-4} and/or @option{-6} options). -The test-specific @option{-H} will override those settings for the -data (aka test) connection only. Settings for the control connection -are left unchanged. - -@vindex -L, Test-specific -@item -L <optionspec> -The test-specific @option{-L} option is identical to the test-specific -@option{-H} option except it affects the local hostname|IP and address -family information. As with its global command-line counterpart, this -is generally only useful when measuring though those evil, end-to-end -breaking things called firewalls. - -@vindex -m, Test-specific -@item -m bytes -Set the size of the buffer passed-in to the ``send'' calls of a -_STREAM test. Note that this may have only an indirect effect on the -size of the packets sent over the network, and certain Layer 4 -protocols do _not_ preserve or enforce message boundaries, so setting -@option{-m} for the send size does not necessarily mean the receiver -will receive that many bytes at any one time. By default the units are -bytes, but suffix of ``G,'' ``M,'' or ``K'' will specify the units to -be 2^30 (GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' -``m'' or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes -respectively. For example: -@example -@code{-m 32K} -@end example -will set the size to 32KB or 32768 bytes. [Default: the local send -socket buffer size for the connection - either the system's default or -the value set via the @option{-s} option.] - -@vindex -M, Test-specific -@item -M bytes -Set the size of the buffer passed-in to the ``recv'' calls of a -_STREAM test. This will be an upper bound on the number of bytes -received per receive call. By default the units are bytes, but suffix -of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20 -(MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k'' -will specify units of 10^9, 10^6 or 10^3 bytes respectively. For -example: -@example -@code{-M 32K} -@end example -will set the size to 32KB or 32768 bytes. [Default: the remote receive -socket buffer size for the data connection - either the system's -default or the value set via the @option{-S} option.] - -@vindex -P, Test-specific -@item -P <optionspec> -Set the local and/or remote port numbers for the data connection. - -@vindex -s, Test-specific -@item -s <sizespec> -This option sets the local send and receive socket buffer sizes for -the data connection to the value(s) specified. Often, this will -affect the advertised and/or effective TCP or other window, but on -some platforms it may not. By default the units are bytes, but suffix -of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20 -(MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k'' -will specify units of 10^9, 10^6 or 10^3 bytes respectively. For -example: -@example -@code{-s 128K} -@end example -Will request the local send and receive socket buffer sizes to be -128KB or 131072 bytes. - -While the historic expectation is that setting the socket buffer size -has a direct effect on say the TCP window, today that may not hold -true for all stacks. Further, while the historic expectation is that -the value specified in a setsockopt() call will be the value returned -via a getsockopt() call, at least one stack is known to deliberately -ignore history. When running under Windows a value of 0 may be used -which will be an indication to the stack the user wants to enable a -form of copy avoidance. [Default: -1 - use the system's default socket -buffer sizes] - -@vindex -S Test-specific -@item -S <sizespec> -This option sets the remote send and/or receive socket buffer sizes -for the data connection to the value(s) specified. Often, this -will affect the advertised and/or effective TCP or other window, but -on some platforms it may not. By default the units are bytes, but -suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 -(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' -or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes respectively. -For example: -@example -@code{-s 128K} -@end example -Will request the local send and receive socket buffer sizes to be -128KB or 131072 bytes. - -While the historic expectation is that setting the socket buffer size -has a direct effect on say the TCP window, today that may not hold -true for all stacks. Further, while the historic expectation is that -the value specified in a setsockopt() call will be the value returned -via a getsockopt() call, at least one stack is known to deliberately -ignore history. When running under Windows a value of 0 may be used -which will be an indication to the stack the user wants to enable a -form of copy avoidance. [Default: -1 - use the system's default socket -buffer sizes] - -@vindex -4, Test-specific -@item -4 -Set the local and remote address family for the data connection to -AF_INET - ie use IPv4 addressing only. Just as with their global -command-line counterparts the last of the @option{-4}, @option{-6}, -@option{-H} or @option{-L} option wins for their respective address -families. - -@vindex -6, Test-specific -@item -6 -This option is identical to its @option{-4} cousin, but requests IPv6 -addresses for the local and remote ends of the data connection. - -@end table - - -@menu -* TCP_STREAM:: -* TCP_MAERTS:: -* TCP_SENDFILE:: -* UDP_STREAM:: -* XTI_TCP_STREAM:: -* XTI_UDP_STREAM:: -* SCTP_STREAM:: -* DLCO_STREAM:: -* DLCL_STREAM:: -* STREAM_STREAM:: -* DG_STREAM:: -@end menu - -@node TCP_STREAM, TCP_MAERTS, Options common to TCP UDP and SCTP tests, Options common to TCP UDP and SCTP tests -@subsection TCP_STREAM - -The TCP_STREAM test is the default test in netperf. It is quite -simple, transferring some quantity of data from the system running -netperf to the system running netserver. While time spent -establishing the connection is not included in the throughput -calculation, time spent flushing the last of the data to the remote at -the end of the test is. This is how netperf knows that all the data -it sent was received by the remote. In addition to the @ref{Options -common to TCP UDP and SCTP tests,options common to STREAM tests}, the -following test-specific options can be included to possibly alter the -behavior of the test: - -@table @code -@item -C -This option will set TCP_CORK mode on the data connection on those -systems where TCP_CORK is defined (typically Linux). A full -description of TCP_CORK is beyond the scope of this manual, but in a -nutshell it forces sub-MSS sends to be buffered so every segment sent -is Maximum Segment Size (MSS) unless the application performs an -explicit flush operation or the connection is closed. At present -netperf does not perform any explicit flush operations. Setting -TCP_CORK may improve the bitrate of tests where the ``send size'' -(@option{-m} option) is smaller than the MSS. It should also improve -(make smaller) the service demand. - -The Linux tcp(7) manpage states that TCP_CORK cannot be used in -conjunction with TCP_NODELAY (set via the @option{-d} option), however -netperf does not validate command-line options to enforce that. - -@item -D -This option will set TCP_NODELAY on the data connection on those -systems where TCP_NODELAY is defined. This disables something known -as the Nagle Algorithm, which is intended to make the segments TCP -sends as large as reasonably possible. Setting TCP_NODELAY for a -TCP_STREAM test should either have no effect when the send size -(@option{-m} option) is larger than the MSS or will decrease reported -bitrate and increase service demand when the send size is smaller than -the MSS. This stems from TCP_NODELAY causing each sub-MSS send to be -its own TCP segment rather than being aggregated with other small -sends. This means more trips up and down the protocol stack per KB of -data transferred, which means greater CPU utilization. - -If setting TCP_NODELAY with @option{-D} affects throughput and/or -service demand for tests where the send size (@option{-m}) is larger -than the MSS it suggests the TCP/IP stack's implementation of the -Nagle Algorithm _may_ be broken, perhaps interpreting the Nagle -Algorithm on a segment by segment basis rather than the proper user -send by user send basis. However, a better test of this can be -achieved with the @ref{TCP_RR} test. - -@end table - -Here is an example of a basic TCP_STREAM test, in this case from a -Debian Linux (2.6 kernel) system to an HP-UX 11iv2 (HP-UX 11.23) -system: - -@example -$ netperf -H lag -TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. 10^6bits/sec - - 32768 16384 16384 10.00 80.42 -@end example - -We see that the default receive socket buffer size for the receiver -(lag - HP-UX 11.23) is 32768 bytes, and the default socket send buffer -size for the sender (Debian 2.6 kernel) is 16384 bytes. Througput is -expressed as 10^6 (aka Mega) bits per second, and the test ran for 10 -seconds. IPv4 addresses (AF_INET) were used. - -@node TCP_MAERTS, TCP_SENDFILE, TCP_STREAM, Options common to TCP UDP and SCTP tests -@comment node-name, next, previous, up -@subsection TCP_MAERTS - -A TCP_MAERTS (MAERTS is STREAM backwards) test is ``just like'' a -@ref{TCP_STREAM} test except the data flows from the netserver to the -netperf. The global command-line @option{-F} option is ignored for -this test type. The test-specific command-line @option{-C} option is -ignored for this test type. - -Here is an example of a TCP_MAERTS test between the same two systems -as in the example for the @ref{TCP_STREAM} test. This time we request -larger socket buffers with @option{-s} and @option{-S} options: - -@example -$ netperf -H lag -t TCP_MAERTS -- -s 128K -S 128K -TCP MAERTS TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. 10^6bits/sec - -221184 131072 131072 10.03 81.14 -@end example - -Where we see that Linux, unlike HP-UX, may not return the same value -in a getsockopt() as was requested in the prior setsockopt(). - -This test is included more for benchmarking convenience than anything -else. - -@node TCP_SENDFILE, UDP_STREAM, TCP_MAERTS, Options common to TCP UDP and SCTP tests -@comment node-name, next, previous, up -@subsection TCP_SENDFILE - -The TCP_SENDFILE test is ``just like'' a @ref{TCP_STREAM} test except -netperf the platform's @code{sendfile()} call instead of calling -@code{send()}. Often this results in a @dfn{zero-copy} operation -where data is sent directly from the filesystem buffer cache. This -_should_ result in lower CPU utilization and possibly higher -throughput. If it does not, then you may want to contact your -vendor(s) because they have a problem on their hands. - -Zero-copy mechanisms may also alter the characteristics (size and -number of buffers per) of packets passed to the NIC. In many stacks, -when a copy is performed, the stack can ``reserve'' space at the -beginning of the destination buffer for things like TCP, IP and Link -headers. This then has the packet contained in a single buffer which -can be easier to DMA to the NIC. When no copy is performed, there is -no opportunity to reserve space for headers and so a packet will be -contained in two or more buffers. - -The @ref{Global Options,global @option{-F} option} is required for this test and it must -specify a file of at least the size of the send ring (@xref{Global -Options,the global @option{-W} option}.) multiplied by the send size -(@xref{Options common to TCP UDP and SCTP tests,the test-specific -@option{-m} option}.). All other TCP-specific options are available -and optional. - -In this first example: -@example -$ netperf -H lag -F ../src/netperf -t TCP_SENDFILE -- -s 128K -S 128K -TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET -alloc_sendfile_buf_ring: specified file too small. -file must be larger than send_width * send_size -@end example - -we see what happens when the file is too small. Here: - -@example -$ ../src/netperf -H lag -F /boot/vmlinuz-2.6.8-1-686 -t TCP_SENDFILE -- -s 128K -S 128K -TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET -Recv Send Send -Socket Socket Message Elapsed -Size Size Size Time Throughput -bytes bytes bytes secs. 10^6bits/sec - -131072 221184 221184 10.02 81.83 -@end example - -we resolve that issue by selecting a larger file. - - -@node UDP_STREAM, XTI_TCP_STREAM, TCP_SENDFILE, Options common to TCP UDP and SCTP tests -@subsection UDP_STREAM - -A UDP_STREAM test is similar to a @ref{TCP_STREAM} test except UDP is -used as the transport rather than TCP. - -@cindex Limiting Bandwidth -A UDP_STREAM test has no end-to-end flow control - UDP provides none -and neither does netperf. However, if you wish, you can configure -netperf with @code{--enable-intervals=yes} to enable the global -command-line @option{-b} and @option{-w} options to pace bursts of -traffic onto the network. - -This has a number of implications. - -The biggest of these implications is the data which is sent might not -be received by the remote. For this reason, the output of a -UDP_STREAM test shows both the sending and receiving throughput. On -some platforms, it may be possible for the sending throughput to be -reported as a value greater than the maximum rate of the link. This -is common when the CPU(s) are faster than the network and there is no -@dfn{intra-stack} flow-control. - -Here is an example of a UDP_STREAM test between two systems connected -by a 10 Gigabit Ethernet link: -@example -$ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 32768 -UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET -Socket Message Elapsed Messages -Size Size Time Okay Errors Throughput -bytes bytes secs # # 10^6bits/sec - -124928 32768 10.00 105672 0 2770.20 -135168 10.00 104844 2748.50 - -@end example - -The first line of numbers are statistics from the sending (netperf) -side. The second line of numbers are from the receiving (netserver) -side. In this case, 105672 - 104844 or 828 messages did not make it -all the way to the remote netserver process. - -If the value of the @option{-m} option is larger than the local send -socket buffer size (@option{-s} option) netperf will likely abort with -an error message about how the send call failed: - -@example -netperf -t UDP_STREAM -H 192.168.2.125 -UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET -udp_send: data send error: Message too long -@end example - -If the value of the @option{-m} option is larger than the remote -socket receive buffer, the reported receive throughput will likely be -zero as the remote UDP will discard the messages as being too large to -fit into the socket buffer. - -@example -$ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 65000 -S 32768 -UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET -Socket Message Elapsed Messages -Size Size Time Okay Errors Throughput -bytes bytes secs # # 10^6bits/sec - -124928 65000 10.00 53595 0 2786.99 - 65536 10.00 0 0.00 -@end example - -The example above was between a pair of systems running a ``Linux'' -kernel. Notice that the remote Linux system returned a value larger -than that passed-in to the @option{-S} option. In fact, this value -was larger than the message size set with the @option{-m} option. -That the remote socket buffer size is reported as 65536 bytes would -suggest to any sane person that a message of 65000 bytes would fit, -but the socket isn't _really_ 65536 bytes, even though Linux is -telling us so. Go figure. - -@node XTI_TCP_STREAM, XTI_UDP_STREAM, UDP_STREAM, Options common to TCP UDP and SCTP tests -@subsection XTI_TCP_STREAM - -An XTI_TCP_STREAM test is simply a @ref{TCP_STREAM} test using the XTI -rather than BSD Sockets interface. The test-specific @option{-X -<devspec>} option can be used to specify the name of the local and/or -remote XTI device files, which is required by the @code{t_open()} call -made by netperf XTI tests. - -The XTI_TCP_STREAM test is only present if netperf was configured with -@code{--enable-xti=yes}. The remote netserver must have also been -configured with @code{--enable-xti=yes}. - -@node XTI_UDP_STREAM, SCTP_STREAM, XTI_TCP_STREAM, Options common to TCP UDP and SCTP tests -@subsection XTI_UDP_STREAM - -An XTI_UDP_STREAM test is simply a @ref{UDP_STREAM} test using the XTI -rather than BSD Sockets Interface. The test-specific @option{-X -<devspec>} option can be used to specify the name of the local and/or -remote XTI device files, which is required by the @code{t_open()} call -made by netperf XTI tests. - -The XTI_UDP_STREAM test is only present if netperf was configured with -@code{--enable-xti=yes}. The remote netserver must have also been -configured with @code{--enable-xti=yes}. - -@node SCTP_STREAM, DLCO_STREAM, XTI_UDP_STREAM, Options common to TCP UDP and SCTP tests -@subsection SCTP_STREAM - -An SCTP_STREAM test is essentially a @ref{TCP_STREAM} test using the SCTP -rather than TCP. The @option{-D} option will set SCTP_NODELAY, which -is much like the TCP_NODELAY option for TCP. The @option{-C} option -is not applicable to an SCTP test as there is no corresponding -SCTP_CORK option. The author is still figuring-out what the -test-specific @option{-N} option does :) - -The SCTP_STREAM test is only present if netperf was configured with -@code{--enable-sctp=yes}. The remote netserver must have also been -configured with @code{--enable-sctp=yes}. - -@node DLCO_STREAM, DLCL_STREAM, SCTP_STREAM, Options common to TCP UDP and SCTP tests -@subsection DLCO_STREAM - -A DLPI Connection Oriented Stream (DLCO_STREAM) test is very similar -in concept to a @ref{TCP_STREAM} test. Both use reliable, -connection-oriented protocols. The DLPI test differs from the TCP -test in that its protocol operates only at the link-level and does not -include TCP-style segmentation and reassembly. This last difference -means that the value passed-in with the @option{-m} option must be -less than the interface MTU. Otherwise, the @option{-m} and -@option{-M} options are just like their TCP/UDP/SCTP counterparts. - -Other DLPI-specific options include: - -@table @code -@item -D <devspec> -This option is used to provide the fully-qualified names for the local -and/or remote DPLI device files. The syntax is otherwise identical to -that of a @dfn{sizespec}. -@item -p <ppaspec> -This option is used to specify the local and/or remote DLPI PPA(s). -The PPA is used to identify the interface over which traffic is to be -sent/received. The syntax of a @dfn{ppaspec} is otherwise the same as -a @dfn{sizespec}. -@item -s sap -This option specifies the 802.2 SAP for the test. A SAP is somewhat -like either the port field of a TCP or UDP header or the protocol -field of an IP header. The specified SAP should not conflict with any -other active SAPs on the specified PPA's (@option{-p} option). -@item -w <sizespec> -This option specifies the local send and receive window sizes in units -of frames on those platforms which support setting such things. -@item -W <sizespec> -This option specifies the remote send and receive window sizes in -units of frames on those platforms which support setting such things. -@end table - -The DLCO_STREAM test is only present if netperf was configured with -@code{--enable-dlpi=yes}. The remote netserver must have also been -configured with @code{--enable-dlpi=yes}. - - -@node DLCL_STREAM, STREAM_STREAM, DLCO_STREAM, Options common to TCP UDP and SCTP tests -@subsection DLCL_STREAM - -A DLPI ConnectionLess Stream (DLCL_STREAM) test is analogous to a -@ref{UDP_STREAM} test in that both make use of unreliable/best-effort, -connection-less transports. The DLCL_STREAM test differs from the -@ref{UDP_STREAM} test in that the message size (@option{-m} option) must -always be less than the link MTU as there is no IP-like fragmentation -and reassembly available and netperf does not presume to provide one. - -The test-specific command-line options for a DLCL_STREAM test are the -same as those for a @ref{DLCO_STREAM} test. - -The DLCL_STREAM test is only present if netperf was configured with -@code{--enable-dlpi=yes}. The remote netserver must have also been -configured with @code{--enable-dlpi=yes}. - -@node STREAM_STREAM, DG_STREAM, DLCL_STREAM, Options common to TCP UDP and SCTP tests -@comment node-name, next, previous, up -@subsection STREAM_STREAM - -A Unix Domain Stream Socket Stream test (STREAM_STREAM) is similar in -concept to a @ref{TCP_STREAM} test, but using Unix Domain sockets. It is, -naturally, limited to intra-machine traffic. A STREAM_STREAM test -shares the @option{-m}, @option{-M}, @option{-s} and @option{-S} -options of the other _STREAM tests. In a STREAM_STREAM test the -@option{-p} option sets the directory in which the pipes will be -created rather than setting a port number. The default is to create -the pipes in the system default for the @code{tempnam()} call. - -The STREAM_STREAM test is only present if netperf was configured with -@code{--enable-unix=yes}. The remote netserver must have also been -configured with @code{--enable-unix=yes}. - -@node DG_STREAM, , STREAM_STREAM, Options common to TCP UDP and SCTP tests -@comment node-name, next, previous, up -@subsection DG_STREAM - -A Unix Domain Datagram Socket Stream test (SG_STREAM) is very much -like a @ref{TCP_STREAM} test except that message boundaries are preserved. -In this way, it may also be considered similar to certain flavors of -SCTP test which can also preserve message boundaries. - -All the options of a @ref{STREAM_STREAM} test are applicable to a DG_STREAM -test. - -The DG_STREAM test is only present if netperf was configured with -@code{--enable-unix=yes}. The remote netserver must have also been -configured with @code{--enable-unix=yes}. - - -@node Using Netperf to Measure Request/Response , Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Bulk Data Transfer, Top -@chapter Using Netperf to Measure Request/Response - -Request/response performance is often overlooked, yet it is just as -important as bulk-transfer performance. While things like larger -socket buffers and TCP windows can cover a multitude of latency and -even path-length sins, they cannot easily hide from a request/response -test. The convention for a request/response test is to have a _RR -suffix. There are however a few ``request/response'' tests that have -other suffixes. - -A request/response test, particularly synchronous, one transaction at -at time test such as those found in netperf, is particularly sensitive -to the path-length of the networking stack. An _RR test can also -uncover those platforms where the NIC's are strapped by default with -overbearing interrupt avoidance settings in an attempt to increase the -bulk-transfer performance (or rather, decrease the CPU utilization of -a bulk-transfer test). This sensitivity is most acute for small -request and response sizes, such as the single-byte default for a -netperf _RR test. - -While a bulk-transfer test reports its results in units of bits or -bytes transfered per second, a mumble_RR test reports transactions per -second where a transaction is defined as the completed exchange of a -request and a response. One can invert the transaction rate to arrive -at the average round-trip latency. If one is confident about the -symmetry of the connection, the average one-way latency can be taken -as one-half the average round-trip latency. Netperf does not do -either of these on its own but leaves them as exercises to the -benchmarker. - -@menu -* Issues in Request/Response:: -* Options Common to TCP UDP and SCTP _RR tests:: -@end menu - -@node Issues in Request/Response, Options Common to TCP UDP and SCTP _RR tests, Using Netperf to Measure Request/Response , Using Netperf to Measure Request/Response -@comment node-name, next, previous, up -@section Issues in Reqeust/Response - -Most if not all the @ref{Issues in Bulk Transfer} apply to -request/response. The issue of round-trip latency is even more -important as netperf generally only has one transaction outstanding at -a time. - -A single instance of a one transaction outstanding _RR test should -_never_ completely saturate the CPU of a system. If testing between -otherwise evenly matched systems, the symmetric nature of a _RR test -with equal request and response sizes should result in equal CPU -loading on both systems. However, this may not hold true on MP -systems, particularly if one CPU binds the netperf and netserver -differently via the global @option{-T} option. - -For smaller request and response sizes packet loss is a bigger issue -as there is no opportunity for a @dfn{fast retransmit} or -retransmission prior to a retransmission timer expiring. - -Certain NICs have ways to minimize the number of interrupts sent to -the host. If these are strapped badly they can significantly reduce -the performance of something like a single-byte request/response test. -Such setups are distinguised by seriously low reported CPU utilization -and what seems like a low (even if in the thousands) transaction per -second rate. Also, if you run such an OS/driver combination on faster -or slower hardware and do not see a corresponding change in the -transaction rate, chances are good that the drvier is strapping the -NIC with aggressive interrupt avoidance settings. Good for bulk -throughput, but bad for latency. - -Some drivers may try to automagically adjust the interrupt avoidance -settings. If they are not terribly good at it, you will see -considerable run-to-run variation in reported transaction rates. -Particularly if you ``mix-up'' _STREAM and _RR tests. - - -@node Options Common to TCP UDP and SCTP _RR tests, , Issues in Request/Response, Using Netperf to Measure Request/Response -@comment node-name, next, previous, up -@section Options Common to TCP UDP and SCTP _RR tests - -Many ``test-specific'' options are actually common across the -different tests. For those tests involving TCP, UDP and SCTP, whether -using the BSD Sockets or the XTI interface those common options -include: - -@table @code -@vindex -h, Test-specific -@item -h -Display the test-suite-specific usage string and exit. For a TCP_ or -UDP_ test this will be the usage string from the source file -@file{nettest_bsd.c}. For an XTI_ test, this will be the usage string -from the source file @file{src/nettest_xti.c}. For an SCTP test, this -will be the usage string from the source file -@file{src/nettest_sctp.c}. - -@vindex -H, Test-specific -@item -H <optionspec> -Normally, the remote hostname|IP and address family information is -inherited from the settings for the control connection (eg global -command-line @option{-H}, @option{-4} and/or @option{-6} options. -The test-specific @option{-H} will override those settings for the -data (aka test) connection only. Settings for the control connection -are left unchanged. This might be used to cause the control and data -connections to take different paths through the network. - -@vindex -L, Test-specific -@item -L <optionspec> -The test-specific @option{-L} option is identical to the test-specific -@option{-H} option except it affects the local hostname|IP and address -family information. As with its global command-line counterpart, this -is generally only useful when measuring though those evil, end-to-end -breaking things called firewalls. - -@vindex -P, Test-specific -@item -P <optionspec> -Set the local and/or remote port numbers for the data connection. - -@vindex -r, Test-specific -@item -r <sizespec> -This option sets the request (first value) and/or response (second -value) sizes for an _RR test. By default the units are bytes, but a -suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 -(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' -or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes -respectively. For example: -@example -@code{-r 128,16K} -@end example -Will set the request size to 128 bytes and the response size to 16 KB -or 16384 bytes. [Default: 1 - a single-byte request and response ] - -@vindex -s, Test-specific -@item -s <sizespec> -This option sets the local send and receive socket buffer sizes for -the data connection to the value(s) specified. Often, this will -affect the advertised and/or effective TCP or other window, but on -some platforms it may not. By default the units are bytes, but a -suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 -(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' -or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes -respectively. For example: -@example -@code{-s 128K} -@end example -Will request the local send and receive socket buffer sizes to be -128KB or 131072 bytes. - -While the historic expectation is that setting the socket buffer size -has a direct effect on say the TCP window, today that may not hold -true for all stacks. When running under Windows a value of 0 may be -used which will be an indication to the stack the user wants to enable -a form of copy avoidance. [Default: -1 - use the system's default -socket buffer sizes] - -@vindex -S, Test-specific -@item -S <sizespec> -This option sets the remote send and/or receive socket buffer sizes -for the data connection to the value(s) specified. Often, this -will affect the advertised and/or effective TCP or other window, but -on some platforms it may not. By default the units are bytes, but a -suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 -(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' -or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes respectively. -For example: -@example -@code{-s 128K} -@end example -Will request the local send and receive socket buffer sizes to be -128KB or 131072 bytes. - -While the historic expectation is that setting the socket buffer size -has a direct effect on say the TCP window, today that may not hold -true for all stacks. When running under Windows a value of 0 may be -used which will be an indication to the stack the user wants to enable -a form of copy avoidance. [Default: -1 - use the system's default -socket buffer sizes] - -@vindex -4, Test-specific -@item -4 -Set the local and remote address family for the data connection to -AF_INET - ie use IPv4 addressing only. Just as with their global -command-line counterparts the last of the @option{-4}, @option{-6}, -@option{-H} or @option{-L} option wins for their respective address -families. - -@vindex -6 Test-specific -@item -6 -This option is identical to its @option{-4} cousin, but requests IPv6 -addresses for the local and remote ends of the data connection. - -@end table - -@menu -* TCP_RR:: -* TCP_CC:: -* TCP_CRR:: -* UDP_RR:: -* XTI_TCP_RR:: -* XTI_TCP_CC:: -* XTI_TCP_CRR:: -* XTI_UDP_RR:: -* DLCL_RR:: -* DLCO_RR:: -* SCTP_RR:: -@end menu - -@node TCP_RR, TCP_CC, Options Common to TCP UDP and SCTP _RR tests, Options Common to TCP UDP and SCTP _RR tests -@cindex Measuring Latency -@cindex Latency, Request-Response -@subsection TCP_RR - -A TCP_RR (TCP Request/Response) test is requested by passing a value -of ``TCP_RR'' to the global @option{-t} command-line option. A TCP_RR -test can be though-of as a user-space to user-space @code{ping} with -no think time - it is a synchronous, one transaction at a time, -request/response test. - -The transaction rate is the number of complete transactions exchanged -divided by the length of time it took to perform those transactions. - -If the two Systems Under Test are otherwise identical, a TCP_RR test -with the same request and response size should be symmetric - it -should not matter which way the test is run, and the CPU utilization -measured should be virtually the same on each system. If not, it -suggests that the CPU utilization mechanism being used may have some, -well, issues measuring CPU utilization completely and accurately. - -Time to establish the TCP connection is not counted in the result. If -you want connection setup overheads included, you should consider the -TCP_CC or TCP_CRR tests. - -If specifying the @option{-D} option to set TCP_NODELAY and disable -the Nagle Algorithm increases the transaction rate reported by a -TCP_RR test, it implies the stack(s) over which the TCP_RR test is -running have a broken implementation of the Nagle Algorithm. Likely -as not they are interpreting Nagle on a segment by segment basis -rather than a user send by user send basis. You should contact your -stack vendor(s) to report the problem to them. - -Here is an example of two systems running a basic TCP_RR test over a -10 Gigabit Ethernet link: - -@example -netperf -t TCP_RR -H 192.168.2.125 -TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET -Local /Remote -Socket Size Request Resp. Elapsed Trans. -Send Recv Size Size Time Rate -bytes Bytes bytes bytes secs. per sec - -16384 87380 1 1 10.00 29150.15 -16384 87380 -@end example - -In this example the request and response sizes were one byte, the -socket buffers were left at their defaults, and the test ran for all -of 10 seconds. The transaction per second rate was rather good :) - -@node TCP_CC, TCP_CRR, TCP_RR, Options Common to TCP UDP and SCTP _RR tests -@cindex Connection Latency -@cindex Latency, Connection Establishment -@subsection TCP_CC - -A TCP_CC (TCP Connect/Close) test is requested by passing a value of -``TCP_CC'' to the global @option{-t} option. A TCP_CC test simply -measures how fast the pair of systems can open and close connections -between one another in a synchronous (one at a time) manner. While -this is considered an _RR test, no request or response is exchanged -over the connection. - -@cindex Port Reuse -@cindex TIME_WAIT -The issue of TIME_WAIT reuse is an important one for a TCP_CC test. -Basically, TIME_WAIT reuse is when a pair of systems churn through -connections fast enough that they wrap the 16-bit port number space in -less time than the length of the TIME_WAIT state. While it is indeed -theoretically possible to ``reuse'' a connection in TIME_WAIT, the -conditions under which such reuse is possible are rather rare. An -attempt to reuse a connection in TIME_WAIT can result in a non-trivial -delay in connection establishment. - -Basically, any time the connection churn rate approaches: - -Sizeof(clientportspace) / Lengthof(TIME_WAIT) - -there is the risk of TIME_WAIT reuse. To minimize the chances of this -happening, netperf will by default select its own client port numbers -from the range of 5000 to 65535. On systems with a 60 second -TIME_WAIT state, this should allow roughly 1000 transactions per -second. The size of the client port space used by netperf can be -controlled via the test-specific @option{-p} option, which takes a -@dfn{sizespec} as a value setting the minimum (first value) and -maximum (second value) port numbers used by netperf at the client end. - -Since no requests or responses are exchanged during a TCP_CC test, -only the @option{-H}, @option{-L}, @option{-4} and @option{-6} of the -``common'' test-specific options are likely to have an effect, if any, -on the results. The @option{-s} and @option{-S} options _may_ have -some effect if they alter the number and/or type of options carried in -the TCP SYNchronize segments. The @option{-P} and @option{-r} -options are utterly ignored. - -Since connection establishment and tear-down for TCP is not symmetric, -a TCP_CC test is not symmetric in its loading of the two systems under -test. - -@node TCP_CRR, UDP_RR, TCP_CC, Options Common to TCP UDP and SCTP _RR tests -@cindex Latency, Connection Establishment -@cindex Latency, Request-Response -@subsection TCP_CRR - -The TCP Connect/Request/Response (TCP_CRR) test is requested by -passing a value of ``TCP_CRR'' to the global @option{-t} command-line -option. A TCP_RR test is like a merger of a TCP_RR and TCP_CC test -which measures the performance of establishing a connection, exchanging -a single request/response transaction, and tearing-down that -connection. This is very much like what happens in an HTTP 1.0 or -HTTP 1.1 connection when HTTP Keepalives are not used. In fact, the -TCP_CRR test was added to netperf to simulate just that. - -Since a request and response are exchanged the @option{-r}, -@option{-s} and @option{-S} options can have an effect on the -performance. - -The issue of TIME_WAIT reuse exists for the TCP_CRR test just as it -does for the TCP_CC test. Similarly, since connection establishment -and tear-down is not symmetric, a TCP_CRR test is not symmetric even -when the request and response sizes are the same. - -@node UDP_RR, XTI_TCP_RR, TCP_CRR, Options Common to TCP UDP and SCTP _RR tests -@cindex Latency, Request-Response -@cindex Packet Loss -@subsection UDP_RR - -A UDP Request/Response (UDP_RR) test is requested by passing a value -of ``UDP_RR'' to a global @option{-t} option. It is very much the -same as a TCP_RR test except UDP is used rather than TCP. - -UDP does not provide for retransmission of lost UDP datagrams, and -netperf does not add anything for that either. This means that if -_any_ request or response is lost, the exchange of requests and -responses will stop from that point until the test timer expires. -Netperf will not really ``know'' this has happened - the only symptom -will be a low transaction per second rate. - -The netperf side of a UDP_RR test will call @code{connect()} on its -data socket and thenceforth use the @code{send()} and @code{recv()} -socket calls. The netserver side of a UDP_RR test will not call -@code{connect()} and will use @code{recvfrom()} and @code{sendto()} -calls. This means that even if the request and response sizes are the -same, a UDP_RR test is _not_ symmetric in its loading of the two -systems under test. - -Here is an example of a UDP_RR test between two otherwise -identical two-CPU systems joined via a 1 Gigabit Ethernet network: - -@example -$ netperf -T 1 -H 192.168.1.213 -t UDP_RR -c -C -UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.213 (192.168.1.213) port 0 AF_INET -Local /Remote -Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem -Send Recv Size Size Time Rate local remote local remote -bytes bytes bytes bytes secs. per sec % I % I us/Tr us/Tr - -65535 65535 1 1 10.01 15262.48 13.90 16.11 18.221 21.116 -65535 65535 -@end example - -This example includes the @option{-c} and @option{-C} options to -enable CPU utilization reporting and shows the asymmetry in CPU -loading. The @option{-T} option was used to make sure netperf and -netserver ran on a given CPU and did not move around during the test. - -@node XTI_TCP_RR, XTI_TCP_CC, UDP_RR, Options Common to TCP UDP and SCTP _RR tests -@cindex Latency, Request-Response -@subsection XTI_TCP_RR - -An XTI_TCP_RR test is essentially the same as a @ref{TCP_RR} test only -using the XTI rather than BSD Sockets interface. It is requested by -passing a value of ``XTI_TCP_RR'' to the @option{-t} global -command-line option. - -The test-specific options for an XTI_TCP_RR test are the same as those -for a TCP_RR test with the addition of the @option{-X <devspec>} option to -specify the names of the local and/or remote XTI device file(s). - -@node XTI_TCP_CC, XTI_TCP_CRR, XTI_TCP_RR, Options Common to TCP UDP and SCTP _RR tests -@comment node-name, next, previous, up -@cindex Latency, Connection Establishment -@subsection XTI_TCP_CC - -@node XTI_TCP_CRR, XTI_UDP_RR, XTI_TCP_CC, Options Common to TCP UDP and SCTP _RR tests -@comment node-name, next, previous, up -@cindex Latency, Connection Establishment -@cindex Latency, Request-Response -@subsection XTI_TCP_CRR - -@node XTI_UDP_RR, DLCL_RR, XTI_TCP_CRR, Options Common to TCP UDP and SCTP _RR tests -@cindex Latency, Request-Response -@subsection XTI_UDP_RR - -An XTI_UDP_RR test is essentially the same as a UDP_RR test only using -the XTI rather than BSD Sockets interface. It is requested by passing -a value of ``XTI_UDP_RR'' to the @option{-t} global command-line -option. - -The test-specific options for an XTI_UDP_RR test are the same as those -for a UDP_RR test with the addition of the @option{-X <devspec>} -option to specify the name of the local and/or remote XTI device -file(s). - -@node DLCL_RR, DLCO_RR, XTI_UDP_RR, Options Common to TCP UDP and SCTP _RR tests -@comment node-name, next, previous, up -@cindex Latency, Request-Response -@subsection DLCL_RR - -@node DLCO_RR, SCTP_RR, DLCL_RR, Options Common to TCP UDP and SCTP _RR tests -@comment node-name, next, previous, up -@cindex Latency, Request-Response -@subsection DLCO_RR - -@node SCTP_RR, , DLCO_RR, Options Common to TCP UDP and SCTP _RR tests -@comment node-name, next, previous, up -@cindex Latency, Request-Response -@subsection SCTP_RR - -@node Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Bidirectional Transfer, Using Netperf to Measure Request/Response , Top -@comment node-name, next, previous, up -@cindex Aggregate Performance -@vindex --enable-burst, Configure -@chapter Using Netperf to Measure Aggregate Performance - -@ref{Netperf4,Netperf4} is the preferred benchmark to use when one -wants to measure aggregate performance because netperf has no support -for explicit synchronization of concurrent tests. - -Basically, there are two ways to measure aggregate performance with -netperf. The first is to run multiple, concurrent netperf tests and -can be applied to any of the netperf tests. The second is to -configure netperf with @code{--enable-burst} and is applicable to the -TCP_RR test. - -@menu -* Running Concurrent Netperf Tests:: -* Using --enable-burst:: -@end menu - -@node Running Concurrent Netperf Tests, Using --enable-burst, Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Aggregate Performance -@comment node-name, next, previous, up -@section Running Concurrent Netperf Tests - -@ref{Netperf4,Netperf4} is the preferred benchmark to use when one -wants to measure aggregate performance because netperf has no support -for explicit synchronization of concurrent tests. This leaves -netperf2 results vulnerable to @dfn{skew} errors. - -However, since there are times when netperf4 is unavailable it may be -necessary to run netperf. The skew error can be minimized by making -use of the confidence interval functionality. Then one simply -launches multiple tests from the shell using a @code{for} loop or the -like: - -@example -for i in 1 2 3 4 -do -netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 & -done -@end example - -which will run four, concurrent @ref{TCP_STREAM,TCP_STREAM} tests from -the system on which it is executed to tardy.cup.hp.com. Each -concurrent netperf will iterate 10 times thanks to the @option{-i} -option and will omit the test banners (option @option{-P}) for -brevity. The output looks something like this: - -@example - 87380 16384 16384 10.03 235.15 - 87380 16384 16384 10.03 235.09 - 87380 16384 16384 10.03 235.38 - 87380 16384 16384 10.03 233.96 -@end example - -We can take the sum of the results and be reasonably confident that -the aggregate performance was 940 Mbits/s. - -If you see warnings about netperf not achieving the confidence -intervals, the best thing to do is to increase the number of -iterations with @option{-i} and/or increase the run length of each -iteration with @option{-l}. - -You can also enable local (@option{-c}) and/or remote (@option{-C}) -CPU utilization: - -@example -for i in 1 2 3 4 -do -netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 -c -C & -done - -87380 16384 16384 10.03 235.47 3.67 5.09 10.226 14.180 -87380 16384 16384 10.03 234.73 3.67 5.09 10.260 14.225 -87380 16384 16384 10.03 234.64 3.67 5.10 10.263 14.231 -87380 16384 16384 10.03 234.87 3.67 5.09 10.253 14.215 -@end example - -If the CPU utilizations reported for the same system are the same or -very very close you can be reasonably confident that skew error is -minimized. Presumeably one could then omit @option{-i} but that is -not advised, particularly when/if the CPU utilization approaches 100 -percent. In the example above we see that the CPU utilization on the -local system remains the same for all four tests, and is only off by -0.01 out of 5.09 on the remote system. - -@quotation -@b{NOTE: It is very important to rememeber that netperf is calculating -system-wide CPU utilization. When calculating the service demand -(those last two columns in the output above) each netperf assumes it -is the only thing running on the system. This means that for -concurrent tests the service demands reported by netperf will be -wrong. One has to compute service demands for concurrent tests by -hand.} -@end quotation - -If you wish you can add a unique, global @option{-B} option to each -command line to append the given string to the output: - -@example -for i in 1 2 3 4 -do -netperf -t TCP_STREAM -H tardy.cup.hp.com -B "this is test $i" -i 10 -P 0 & -done - -87380 16384 16384 10.03 234.90 this is test 4 -87380 16384 16384 10.03 234.41 this is test 2 -87380 16384 16384 10.03 235.26 this is test 1 -87380 16384 16384 10.03 235.09 this is test 3 -@end example - -You will notice that the tests completed in an order other than they -were started from the shell. This underscores why there is a threat -of skew error and why netperf4 is the preferred tool for aggregate -tests. Even if you see the Netperf Contributing Editor acting to the -contrary!-) - -@node Using --enable-burst, , Running Concurrent Netperf Tests, Using Netperf to Measure Aggregate Performance -@comment node-name, next, previous, up -@section Using --enable-burst - -If one configures netperf with @code{--enable-burst}: - -@example -configure --enable-burst -@end example - -Then a test-specific @option{-b num} option is added to the -@ref{TCP_RR,TCP_RR} and @ref{UDP_RR,UDP_RR} tests. This option causes -TCP_RR and UDP_RR to quickly work their way up to having at least -@option{num} transactions in flight at one time. - -This is used as an alternative to or even in conjunction with -multiple-concurrent _RR tests. When run with just a single instance -of netperf, increasing the burst size can determine the maximum number -of transactions per second can be serviced by a single process: - -@example -for b in 0 1 2 4 8 16 32 -do - netperf -v 0 -t TCP_RR -B "-b $b" -H hpcpc108 -P 0 -- -b $b -done - -9457.59 -b 0 -9975.37 -b 1 -10000.61 -b 2 -20084.47 -b 4 -29965.31 -b 8 -71929.27 -b 16 -109718.17 -b 32 -@end example - -The global @option{-v} and @option{-P} options were used to minimize -the output to the single figure of merit which in this case the -transaction rate. The global @code{-B} option was used to more -clearly label the output, and the test-specific @option{-b} option -enabled by @code{--enable-burst} set the number of transactions in -flight at one time. - -Now, since the test-specific @option{-D} option was not specified to -set TCP_NODELAY, the stack was free to ``bundle'' requests and/or -responses into TCP segments as it saw fit, and since the default -request and response size is one byte, there could have been some -considerable bundling. If one wants to try to achieve a closer to -one-to-one correspondence between a request and response and a TCP -segment, add the test-specific @option{-D} option: - -@example -for b in 0 1 2 4 8 16 32 -do - netperf -v 0 -t TCP_RR -B "-b $b -D" -H hpcpc108 -P 0 -- -b $b -D -done - - 8695.12 -b 0 -D - 19966.48 -b 1 -D - 20691.07 -b 2 -D - 49893.58 -b 4 -D - 62057.31 -b 8 -D - 108416.88 -b 16 -D - 114411.66 -b 32 -D -@end example - -You can see that this has a rather large effect on the reported -transaction rate. In this particular instance, the author believes it -relates to interactions between the test and interrupt coalescing -settings in the driver for the NICs used. - -@quotation -@b{NOTE: Even if you set the @option{-D} option that is still not a -guarantee that each transaction is in its own TCP segments. You -should get into the habit of verifying the relationship between the -transaction rate and the packet rate via other means} -@end quotation - -You can also combine @code{--enable-burst} functionality with -concurrent netperf tests. This would then be an ``aggregate of -aggregates'' if you like: - -@example - -for i in 1 2 3 4 -do - netperf -H hpcpc108 -v 0 -P 0 -i 10 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D & -done - - 46668.38 aggregate 4 -b 8 -D - 44890.64 aggregate 2 -b 8 -D - 45702.04 aggregate 1 -b 8 -D - 46352.48 aggregate 3 -b 8 -D - -@end example - -Since each netperf did hit the confidence intervals, we can be -reasonably certain that the aggregate transaction per second rate was -the sum of all four concurrent tests, or something just shy of 184,000 -transactions per second. To get some idea if that was also the packet -per second rate, we could bracket that @code{for} loop with something -to gather statistics and run the results through -@uref{ftp://ftp.cup.hp.com/dist/networking/tools,beforeafter}: - -@example -/usr/sbin/ethtool -S eth2 > before -for i in 1 2 3 4 -do - netperf -H 192.168.2.108 -l 60 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D & -done -wait -/usr/sbin/ethtool -S eth2 > after - - 52312.62 aggregate 2 -b 8 -D - 50105.65 aggregate 4 -b 8 -D - 50890.82 aggregate 1 -b 8 -D - 50869.20 aggregate 3 -b 8 -D - -beforeafter before after > delta - -grep packets delta - rx_packets: 12251544 - tx_packets: 12251550 - -@end example - -This example uses @code{ethtool} because the system being used is -running Linux. Other platforms have other tools - for example HP-UX -has lanadmin: - -@example -lanadmin -g mibstats <ppa> -@end example - -and of course one could instead use @code{netstat}. - -The @code{wait} is important because we are launching concurrent -netperfs in the background. Without it, the second ethtool command -would be run before the tests finished and perhaps even before the -last of them got started! - -The sum of the reported transaction rates is 204178 over 60 seconds, -which is a total of 12250680 transactions. Each transaction is the -exchange of a request and a response, so we multiply that by 2 to -arrive at 24501360. - -The sum of the ethtool stats is 24503094 packets which matches what -netperf was reporting very well. - -Had the request or response size differed, we would need to know how -it compared with the @dfn{MSS} for the connection. - -Just for grins, here is the excercise repeated, using @code{netstat} -instead of @code{ethtool} - -@example -netstat -s -t > before -for i in 1 2 3 4 -do - netperf -l 60 -H 192.168.2.108 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D & done -wait -netstat -s -t > after - - 51305.88 aggregate 4 -b 8 -D - 51847.73 aggregate 2 -b 8 -D - 50648.19 aggregate 3 -b 8 -D - 53605.86 aggregate 1 -b 8 -D - -beforeafter before after > delta - -grep segments delta - 12445708 segments received - 12445730 segments send out - 1 segments retransmited - 0 bad segments received. -@end example - -The sums are left as an excercise to the reader :) - -Things become considerably more complicated if there are non-trvial -packet losses and/or retransmissions. - -Of course all this checking is unnecessary if the test is a UDP_RR -test because UDP ``never'' aggregates multiple sends into the same UDP -datagram, and there are no ACKnowledgements in UDP. The loss of a -single request or response will not bring a ``burst'' UDP_RR test to a -screeching halt, but it will reduce the number of transactions -outstanding at any one time. A ``burst'' UDP_RR test @b{will} come to a -halt if the sum of the lost requests and responses reaches the value -specified in the test-specific @option{-b} option. - - -@node Using Netperf to Measure Bidirectional Transfer, Other Netperf Tests, Using Netperf to Measure Aggregate Performance, Top -@comment node-name, next, previous, up -@chapter Using Netperf to Measure Bidirectional Transfer - -There are two ways to use netperf to measure the perfomance of -bidirectional transfer. The first is to run concurrent netperf tests -from the command line. The second is to configure netperf with -@code{--enable-burst} and use a single instance of the -@ref{TCP_RR,TCP_RR} test. - -While neither method is more ``correct'' than the other, each is doing -so in different ways, and that has possible implications. For -instance, using the concurrent netperf test mechanism means that -multiple TCP connections and multiple processes are involved, whereas -using the single instance of TCP_RR there is only one TCP connection -and one process on each end. They may behave differently, especially -on an MP system. - -@menu -* Bidirectional Transfer with Concurrent Tests:: -* Bidirectional Transfer with TCP_RR:: -@end menu - -@node Bidirectional Transfer with Concurrent Tests, Bidirectional Transfer with TCP_RR, Using Netperf to Measure Bidirectional Transfer, Using Netperf to Measure Bidirectional Transfer -@comment node-name, next, previous, up -@section Bidirectional Transfer with Concurrent Tests - -If we had two hosts Fred and Ethel, we could simply run a netperf -@ref{TCP_STREAM,TCP_STREAM} test on Fred pointing at Ethel, and a -concurrent netperf TCP_STREAM test on Ethel pointing at Fred, but -since there are no mechanisms to synchronize netperf tests and we -would be starting tests from two different systems, there is a -considerable risk of skew error. - -Far better would be to run simultaneous TCP_STREAM and -@ref{TCP_MAERTS,TCP_MAERTS} tests from just @b{one} system, using the -concepts and procedures outlined in @ref{Running Concurrent Netperf -Tests,Running Concurrent Netperf Tests}. Here then is an example: - -@example -for i in 1 -do - netperf -H 192.168.2.108 -t TCP_STREAM -B "outbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K & - netperf -H 192.168.2.108 -t TCP_MAERTS -B "inbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K & -done - - 892.66 outbound - 891.34 inbound - -@end example - -We have used a @code{for} loop in the shell with just one iteration -because that will be @b{much} easier to get both tests started at more or -less the same time than doing it by hand. The global @option{-P} and -@option{-v} options are used because we aren't interested in anything -other than the throughput, and the global @option{-B} option is used -to tag each output so we know which was inbound and which outbound -relative to the system on which we were running netperf. Of course -that sense is switched on the system running netserver :) The use of -the global @option{-i} option is explained in @ref{Running Concurrent -Netperf Tests,Running Concurrent Netperf Tests}. - -@node Bidirectional Transfer with TCP_RR, , Bidirectional Transfer with Concurrent Tests, Using Netperf to Measure Bidirectional Transfer -@comment node-name, next, previous, up -@section Bidirectional Transfer with TCP_RR - -If one configures netperf with @code{--enable-burst} then one can use -the test-specific @option{-b} option to increase the number of -transactions in flight at one time. If one also uses the -r option to -make those transactions larger the test starts to look more and more -like a bidirectional transfer than a request/response test. - -Now, the logic behing @code{--enable-burst} is very simple, and there -are no calls to @code{poll()} or @code{select()} which means we want -to make sure that the @code{send()} calls will never block, or we run -the risk of deadlock with each side stuck trying to call @code{send()} -and neither calling @code{recv()}. - -Fortunately, this is easily accomplished by setting a ``large enough'' -socket buffer size with the test-specific @option{-s} and @option{-S} -options. Presently this must be performed by the user. Future -versions of netperf might attempt to do this automagically, but there -are some issues to be worked-out. - -Here then is an example of a bidirectional transfer test using -@code{--enable-burst} and the @ref{TCP_RR,TCP_RR} test: - -@example -netperf -t TCP_RR -H hpcpc108 -- -b 6 -r 32K -s 256K -S 256K -TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to hpcpc108.cup.hp.com (16.89.84.108) port 0 AF_INET : first burst 6 -Local /Remote -Socket Size Request Resp. Elapsed Trans. -Send Recv Size Size Time Rate -bytes Bytes bytes bytes secs. per sec - -524288 524288 32768 32768 10.01 3525.97 -524288 524288 - -@end example - -Now, at present netperf does not include a bit or byte rate in the -output of an _RR test which means we must calculate it ourselves. Each -transaction is the exchange of 32768 bytes of request and 32768 bytes -of response, or 65536 bytes. Multiply that by 8 and we arrive at -524288 bits per transaction. Multiply that by 3525.97 and we arrive -at 1848623759 bits per second. Since things were uniform, we can -divide that by two and arrive at roughly 924311879 bits per second -each way. That corresponds to ``link-rate'' for a 1 Gigiabit Ethernet -which happens to be the type of netpwrk used in the example. - -A future version of netperf may perform the calculation on behalf of -the user, but it would likely not emit it unless the user specified a -verbosity of 2 or more with the global @option{-v} option. - -@node Other Netperf Tests, Address Resolution, Using Netperf to Measure Bidirectional Transfer, Top -@chapter Other Netperf Tests - -Apart from the typical performance tests, netperf contains some tests -which can be used to streamline measurements and reporting. These -include CPU rate calibration (present) and host identification (future -enhancement). - -@menu -* CPU rate calibration:: -@end menu - -@node CPU rate calibration, , Other Netperf Tests, Other Netperf Tests -@section CPU rate calibration - -Some of the CPU utilization measurement mechanisms of netperf work by -comparing the rate at which some counter increments when the system is -idle with the rate at which that same counter increments when the -system is running a netperf test. The ratio of those rates is used to -arrive at a CPU utilization percentage. - -This means that netperf must know the rate at which the counter -increments when the system is presumed to be ``idle.'' If it does not -know the rate, netperf will measure it before starting a data transfer -test. This calibration step takes 40 seconds for each of the local or -remote ystems, and if repeated for each netperf test would make taking -repeated measurements rather slow. - -Thus, the netperf CPU utilization options @option{-c} and and -@option{-C} can take an optional calibration value. This value is -used as the ``idle rate'' and the calibration step is not -performed. To determine the idle rate, netperf can be used to run -special tests which only report the value of the calibration - they -are the LOC_CPU and REM_CPU tests. These return the calibration value -for the local and remote system respectively. A common way to use -these tests is to store their results into an environment variable and -use that in subsequent netperf commands: - -@example -LOC_RATE=`netperf -t LOC_CPU` -REM_RATE=`netperf -H <remote> -t REM_CPU` -netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ... -... -netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ... -@end example - -If you are going to use netperf to measure aggregate results, it is -important to use the LOC_CPU and REM_CPU tests to get the calibration -values first to avoid issues with some of the aggregate netperf tests -transferring data while others are ``idle'' and getting bogus -calibration values. When running aggregate tests, it is very -important to remember that any one instance of netperf does not know -about the other instances of netperf. It will report global CPU -utilization and will calculate service demand believing it was the -only thing causing that CPU utilization. So, you can use the CPU -utilization reported by netperf in an aggregate test, but you have to -calculate service demands by hand. - -@node Address Resolution, Enhancing Netperf, Other Netperf Tests, Top -@comment node-name, next, previous, up -@chapter Address Resolution - -Netperf versions 2.4.0 and later have merged IPv4 and IPv6 tests so -the functionality of the tests in @file{src/nettest_ipv6.c} has been -subsumed into the tests in @file{src/nettest_bsd.c} This has been -accomplished in part by switching from @code{gethostbyname()}to -@code{getaddrinfo()} exclusively. While it was theoretically possible -to get multiple results for a hostname from @code{gethostbyname()} it -was generally unlikely and netperf's ignoring of the second and later -results was not much of an issue. - -Now with @code{getaddrinfo} and particularly with AF_UNSPEC it is -increasingly likely that a given hostname will have multiple -associated addresses. The @code{establish_control()} routine of -@file{src/netlib.c} will indeed attempt to chose from among all the -matching IP addresses when establishing the control connection. -Netperf does not _really_ care if the control connection is IPv4 or -IPv6 or even mixed on either end. - -However, the individual tests still ass-u-me that the first result in -the address list is the one to be used. Whether or not this will -turn-out to be an issue has yet to be determined. - -If you do run into problems with this, the easiest workaround is to -specify IP addresses for the data connection explicitly in the -test-specific @option{-H} and @option{-L} options. At some point, the -netperf tests _may_ try to be more sophisticated in their parsing of -returns from @code{getaddrinfo()} - straw-man patches to -@email{netperf-feedback@@netperf.org} would of course be most welcome -:) - -Netperf has leveraged code from other open-source projects with -amenable licensing to provide a replacement @code{getaddrinfo()} call -on those platforms where the @command{configure} script believes there -is no native getaddrinfo call. As of this writing, the replacement -@code{getaddrinfo()} as been tested on HP-UX 11.0 and then presumed to -run elsewhere. - -@node Enhancing Netperf, Netperf4, Address Resolution, Top -@comment node-name, next, previous, up -@chapter Enhancing Netperf - -Netperf is constantly evolving. If you find you want to make -enhancements to netperf, by all means do so. If you wish to add a new -``suite'' of tests to netperf the general idea is to - -@enumerate -@item -Add files @file{src/nettest_mumble.c} and @file{src/nettest_mumble.h} -where mumble is replaced with something meaningful for the test-suite. -@item -Add support for an apropriate @option{--enable-mumble} option in -@file{configure.ac}. -@item -Edit @file{src/netperf.c}, @file{netsh.c}, and @file{netserver.c} as -required, using #ifdef WANT_MUMBLE. -@item -Compile and test -@end enumerate - -If you wish to submit your changes for possible inclusion into the -mainline sources, please try to base your changes on the latest -available sources. (@xref{Getting Netperf Bits}.) and then send email -describing the changes at a high level to -@email{netperf-feedback@@netperf.org} or perhaps -@email{netperf-talk@@netperf.org}. If the concensus is positive, then -sending context @command{diff} results to -@email{netperf-feedback@@netperf.org} is the next step. From that -point, it is a matter of pestering the Netperf Contributing Editor -until he gets the changes incorporated :) - -@node Netperf4, Concept Index, Enhancing Netperf, Top -@comment node-name, next, previous, up -@chapter Netperf4 - -Netperf4 is the shorthand name given to version 4.X.X of netperf. -This is really a separate benchmark more than a newer version of -netperf, but it is a decendant of netperf so the netperf name is -kept. The facitious way to describe netperf4 is to say it is the -egg-laying-wolly-milk-pig version of netperf :) The more respectful -way to describe it is to say it is the version of netperf with support -for synchronized, multiple-thread, multiple-test, multiple-system, -network-oriented benchmarking. - -Netperf4 is still undergoing rapid evolution. Those wishing to work -with or on netperf4 are encouraged to join the -@uref{http://www.netperf.org/cgi-bin/mailman/listinfo/netperf-dev,netperf-dev} -mailing list and/or peruse the -@uref{http://www.netperf.org/svn/netperf4/trunk,current sources}. - -@node Concept Index, Option Index, Netperf4, Top -@unnumbered Concept Index - -@printindex cp - -@node Option Index, , Concept Index, Top -@comment node-name, next, previous, up -@unnumbered Option Index - -@printindex vr -@bye - -@c LocalWords: texinfo setfilename settitle titlepage vskip pt filll ifnottex -@c LocalWords: insertcopying cindex dfn uref printindex cp |