Annotation of embedaddon/iperf/docs/faq.rst, revision 1.1

1.1     ! misho       1: .. _faq:
        !             2: 
        !             3: iperf3 FAQ
        !             4: ==========
        !             5: 
        !             6: What is the history of iperf3, and what is the difference between iperf2 and iperf3?
        !             7:   iperf2 was orphaned in the late 2000s at version 2.0.5, despite some
        !             8:   known bugs and issues. After spending some time trying to fix
        !             9:   iperf2's problems, ESnet decided by 2010 that a new, simpler tool
        !            10:   was needed, and began development of iperf3. The goal was make the
        !            11:   tool as simple as possible, so others could contribute to the code
        !            12:   base. For this reason, it was decided to make the tool single
        !            13:   threaded, and not worry about backwards compatibility with
        !            14:   iperf2. Many of the feature requests for iperf3 came from the
        !            15:   perfSONAR project (http://www.perfsonar.net).
        !            16:  
        !            17:   Then in 2014, Bob (Robert) McMahon from Broadcom restarted
        !            18:   development of iperf2 (See
        !            19:   https://sourceforge.net/projects/iperf2/). He fixed many of the
        !            20:   problems with iperf2, and added a number of new features similar to
        !            21:   iperf3. iperf2.0.8, released in 2015, made iperf2 a useful tool. iperf2's 
        !            22:   current development is focused is on using UDP for latency testing, as well
        !            23:   as broad platform support.
        !            24:  
        !            25:   As of this writing (2017), both iperf2 and iperf3 are being actively
        !            26:   (although independently) developed.  We recommend being familiar with
        !            27:   both tools, and use whichever tool’s features best match your needs.
        !            28:  
        !            29:   A feature comparison of iperf2, iperf3, and nuttcp is available at:
        !            30:   https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/throughput-tool-comparision/
        !            31:  
        !            32: iperf3 parallel stream performance is much less than iperf2. Why?
        !            33:   iperf3 is single threaded, and iperf2 is multi-threaded. We
        !            34:   recommend using iperf2 for parallel streams.
        !            35:   If you want to use multiple iperf3 streams use the method described `here <https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/iperf/multi-stream-iperf3/>`_.
        !            36:  
        !            37: I’m trying to use iperf3 on Windows, but having trouble. What should I do?
        !            38:   iperf3 is not officially supported on Windows, but iperf2 is. We
        !            39:   recommend you use iperf2.
        !            40: 
        !            41:   Some people are using Cygwin to run iperf3 in Windows, but not all
        !            42:   options will work.  Some community-provided binaries of iperf3 for
        !            43:   Windows exist.
        !            44:  
        !            45: How can I build a statically-linked executable of iperf3?
        !            46:   There are a number of reasons for building an iperf3 executable with
        !            47:   no dependencies on any shared libraries.  Unfortunately this isn't
        !            48:   quite a straight-forward process.
        !            49: 
        !            50:   The steps below have nominally been tested on CentOS 7.4, but
        !            51:   can probably be adapted for use with other Linux distributions:
        !            52: 
        !            53:   #.  If necessary, install the static C libraries; for CentOS this is
        !            54:       the ``glibc-static`` package.
        !            55: 
        !            56:   #.  If OpenSSL is installed, be sure that its static libraries are
        !            57:       also installed, from the ``openssl-static`` package.
        !            58: 
        !            59:   #.  Be sure that ``lksctp-*`` packages are not installed, because
        !            60:       as of this writing, there do not appear to be any static
        !            61:       libraries available for SCTP.
        !            62: 
        !            63:   #.  Configure iperf3 thusly: ``configure "LDFLAGS=--static"
        !            64:       --disable-shared`` These options are necessary to disable the
        !            65:       generation of shared libraries and link the executable
        !            66:       statically.  For iperf-3.8 or later, configuring as ``configure
        !            67:       --enable-static-bin`` is another, shorter way to accomplish
        !            68:       this.  If SCTP is installed on the system it might also be
        !            69:       necessary to pass the ``--without-sctp`` flag at configure
        !            70:       time.
        !            71: 
        !            72:   #.  Compile as normal.
        !            73: 
        !            74:   It appears that for FreeBSD (tested on FreeBSD 11.1-RELEASE), only
        !            75:   the last two steps are needed to produce a static executable.
        !            76: 
        !            77: How can I build on a system that doesn't support profiled executables?
        !            78:   This problem has been noted by users attempting to build iperf3 for
        !            79:   Android systems, as well as some recent versions of macOS.
        !            80:   There are several workarounds. In order from least
        !            81:   effort to most effort:
        !            82: 
        !            83:   #. Beginning with iperf-3.8, profiled executables are actually not
        !            84:      built by default, so this question becomes somewhat moot.  Pass
        !            85:      the ``--enable-profiling`` flag to ``configure`` to build
        !            86:      profiled executables.
        !            87: 
        !            88:   #. In iperf-3.6 and iperf-3.7, the ``--disable-profiling`` flag can be
        !            89:      passed to ``configure`` to disable the building of profiled
        !            90:      object files and the profiled executable.
        !            91: 
        !            92:   #. At the time the linking of the iperf3 profiled executable fails,
        !            93:      the "normal" iperf3 executable is probably already created. So if
        !            94:      you are willing to accept the error exit from the make process
        !            95:      (and a little bit of wasted work on the build host), you might
        !            96:      not need to do anything.
        !            97: 
        !            98:   #. After the configure step, there will be a definition in
        !            99:      ``src/Makefile`` that looks like this::
        !           100: 
        !           101:        noinst_PROGRAMS = t_timer$(EXEEXT) t_units$(EXEEXT) t_uuid$(EXEEXT) \
        !           102:          iperf3_profile$(EXEEXT)
        !           103: 
        !           104:      If you edit it to look like this, it will disable the build of the profiled iperf3::
        !           105: 
        !           106:        noinst_PROGRAMS = t_timer$(EXEEXT) t_units$(EXEEXT) t_uuid$(EXEEXT)
        !           107: 
        !           108:   #. Similar to item 2 above, but more permanent...if you edit
        !           109:      ``src/Makefile.am`` and change the line reading like this::
        !           110: 
        !           111:        noinst_PROGRAMS         = t_timer t_units t_uuid iperf3_profile
        !           112: 
        !           113:      To look like this::
        !           114: 
        !           115:        noinst_PROGRAMS         = t_timer t_units t_uuid
        !           116: 
        !           117:      And then run ``./bootstrap.sh``, that will regenerate the project
        !           118:      Makefiles to make the exclusion of the profiled iperf3 executable
        !           119:      permanant (within that source tree).
        !           120: 
        !           121: I'm seeing quite a bit of unexpected UDP loss. Why?
        !           122:   First, confirm you are using iperf 3.1.5 or higher. There was an
        !           123:   issue with the default UDP send size that was fixed in
        !           124:   3.1.5. Second, try adding the flag ``-w2M`` to increase the socket
        !           125:   buffer sizes. That seems to make a big difference on some hosts.
        !           126:  
        !           127: iperf3 UDP does not seem to work at bandwidths less than 100Kbps. Why?
        !           128:   You'll need to reduce the default packet length to get UDP rates of less that 100Kbps. Try ``-l100``.
        !           129:  
        !           130: TCP throughput drops to (almost) zero during a test, what's going on?
        !           131:   A drop in throughput to almost zero, except maybe for the first
        !           132:   reported interval(s), may be related to problems in NIC TCP Offload,
        !           133:   which is used to offload TCP functionality to the NIC (see
        !           134:   https://en.wikipedia.org/wiki/TCP_offload_engine). The goal of TCP
        !           135:   Offload is to save main CPU performance, mainly in the areas of
        !           136:   segmentation and reassembly of large packets and checksum
        !           137:   computation.
        !           138: 
        !           139:   When TCP packets are sent with the "Don't Fragment" flag set, which
        !           140:   is the recommended setting, segmentation is done by the TCP stack
        !           141:   based on the reported next hop MSS in the ICMP Fragmentation Needed
        !           142:   message. With TCP Offload, active segmentation is done by the NIC on
        !           143:   the sending side, which is known as TCP Segmentation offload (TSO)
        !           144:   or in Windows as Large Send Offload (LSO). It seems that there are
        !           145:   TSO/LSO implementations which for some reason ignore the reported
        !           146:   MSS and therefore don’t perform segmentation. In these cases, when
        !           147:   large packets are sent, e.g. the default iperf3 128KB (131,072
        !           148:   bytes), iperf3 will show that data was sent in the first interval,
        !           149:   but since the packets don’t get to the server, no ack is received
        !           150:   and therefore no data is sent in the following intervals. It may
        !           151:   happen that after certain timeout the main CPU will re-send the
        !           152:   packet by re-segmenting it, and in these cases data will get to the
        !           153:   server after a while. However, it seems that segmentation is not
        !           154:   automatically continued with the next packet, so the data transfer
        !           155:   rate be very low.
        !           156: 
        !           157:   The recommended solution in such a case is to disable TSO/LSO, at
        !           158:   least on the relevant port. See for example:
        !           159:   https://atomicit.ca/kb/articles/slow-network-speed-windows-10/. If
        !           160:   that doesn’t help then "Don't Fragment" TCP flag may be
        !           161:   disabled. See for example:
        !           162:   https://support.microsoft.com/en-us/help/900926/recommended-tcp-ip-settings-for-wan-links-with-a-mtu-size-of-less-than. However,
        !           163:   note that disabling the “Don’t Fragment” flag may cause other
        !           164:   issues.
        !           165: 
        !           166:   To test whether TSO/LSO may be the problem, do the following:
        !           167: 
        !           168:   * If different machine configurations are used for the client and
        !           169:     server, try the iperf3 reverse mode (``-R``). If TSO/LSO is only
        !           170:     enabled on the client machine, this test should succeed.
        !           171:   * Reduce the sending length to a small value that should not require
        !           172:     segmentation, using the iperf3 ``-l`` option, e.g. ``-l 512``. It
        !           173:     may also help to reduce the MTU by using the iperf3 ``-M`` option,
        !           174:     e.g. ``-M 1460``.
        !           175:   * Using tools like Wireshark, identify the required MSS in the ICMP
        !           176:     Fragmentation Needed messages (if reported). Run tests with the
        !           177:     ``-l`` value set to 2 times the MSS and then 4 times, 6 times,
        !           178:     etc. With TSO/LSO issue in each test the throughput should be
        !           179:     reduced more. It may help to increase the testing time beyond the
        !           180:     default 10 seconds to better see the behavior (iperf3 ``-t``
        !           181:     option).
        !           182: 
        !           183: What congestion control algorithms are supported?
        !           184:   On Linux, run this command to see the available congestion control
        !           185:   algorithms (note that some algorithms are packaged as kernel
        !           186:   modules, which must be loaded before they can be used)::
        !           187:     
        !           188:     /sbin/sysctl net.ipv4.tcp_available_congestion_control
        !           189: 
        !           190:   On FreeBSD, the equivalent command is::
        !           191: 
        !           192:     /sbin/sysctl net.inet.tcp.cc.available
        !           193:  
        !           194: I’m using the ``--logfile`` option. How do I see file output in real time?
        !           195:   Use the ``--forceflush`` flag.
        !           196: 
        !           197: I'm using the --fq-rate flag, but it does not seem to be working. Why?
        !           198:   You need to add 'net.core.default_qdisc = fq' to /etc/sysctl.conf for that option to work.
        !           199: 
        !           200: I'm having trouble getting iperf3 to work on Windows, Android, etc. Where can I get help?
        !           201:   iperf3 only supports Linux, FreeBSD, and OSX. For other platforms we recommend using iperf2.
        !           202: 
        !           203: I managed to get a Windows executable built, but why do I get a BSOD on Windows 7?
        !           204:   There seems to be a bug in Windows 7 where running iperf3 from a
        !           205:   network filesystem can cause a system crash (in other words Blue
        !           206:   Screen of Death, or BSOD).  This is a Windows bug addressed in kb2839149:
        !           207: 
        !           208:   https://support.microsoft.com/en-us/help/2839149/stop-error-0x00000027-in-the-rdbss-sys-process-in-windows-7-or-windows
        !           209: 
        !           210:   A hotfix is available under kb2732673:
        !           211: 
        !           212:   https://support.microsoft.com/en-us/help/2732673/-delayed-write-failed-error-message-when--pst-files-are-stored-on-a-ne
        !           213: 
        !           214: Why can’t I run a UDP client with no server?
        !           215:   This is potentially dangerous, and an attacker could use this for a
        !           216:   denial of service attack.  We don't want iperf3 to be an attack tool.
        !           217: 
        !           218: I'm trying to use iperf3 to test a 40G/100G link...What do I need to know?
        !           219:   See the following pages on fasterdata.es.net:
        !           220: 
        !           221:   - https://fasterdata.es.net/host-tuning/100g-tuning/
        !           222:   - https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/iperf/multi-stream-iperf3/
        !           223: 
        !           224: My receiver didn't get all the bytes that got sent but there was no loss.  Huh?
        !           225:   iperf3 uses a control connection between the client and server to
        !           226:   manage the start and end of each test.  Sometimes the commands on
        !           227:   the control connection can be received and acted upon before all of
        !           228:   the test data has been processed.  Thus the test ends with data
        !           229:   still in flight.  This effect can be significant for short (a few
        !           230:   seconds) tests, but is probably negligible for longer tests.
        !           231: 
        !           232: A file sent using the ``-F`` option got corrupted...what happened?
        !           233:   The ``-F`` option to iperf3 is not a file transfer utility.  It's a
        !           234:   way of testing the end-to-end performance of a file transfer,
        !           235:   including filesystem and disk overheads.  So while the test will
        !           236:   mimic an actual file transfer, the data stored to disk may not be
        !           237:   the same as what was sent.  In particular, the file size will be
        !           238:   rounded up to the next larger multiple of the transfer block size,
        !           239:   and for UDP tests, iperf's metadata (containing timestamps and
        !           240:   sequence numbers) will overwrite the start of every UDP packet
        !           241:   payload.
        !           242: 
        !           243: I have a question regarding iperf3...what's the best way to get help?
        !           244:   Searching on the Internet is a good first step.
        !           245:   http://stackoverflow.com/ has a number of iperf3-related questions
        !           246:   and answers, but a simple query into your favorite search engine can
        !           247:   also yield some results.
        !           248: 
        !           249:   There is a mailing list nominally used for iperf3 development,
        !           250:   iperf-dev@googlegroups.com.
        !           251: 
        !           252:   We discourage the use of the iperf3 issue tracker on GitHub for
        !           253:   support questions.  Actual bug reports, enhancement requests, or
        !           254:   pull requests are encouraged, however.
        !           255: 
        !           256: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>