Changes between Initial Version and Version 1 of performance_tuning


Ignore:
Timestamp:
10/22/2017 05:28:45 AM (7 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • performance_tuning

    v1 v1  
     1[[PageOutline]]
     2
     3= Performance Tuning =
     4
     5Various performance aspects rely heavily on the configuration of your Linux operating system.  Here are some things to keep in mind:
     6 * L2 Cache - enabling L2 cache can greatly increase the performance of some things, but greatly hurt others - see [wiki:laguna/l2cache here]
     7 * Kernel modules - kernel modules that are not needed can bog down certain paths, such as network routing (iptables/ebtables) (see below)
     8 * Userland services - Various services and daemons that are not needed can chew up system resources (CPU cycles, memory footprint) (see below)
     9
     10=== See also  [wiki:multicoreprocessing Multicore Processing Page] ===
     11
     12
     13== Routing Performance ==
     14
     15If you are trying to optimize network routing you can try the following:
     16 * GigE:
     17  * make sure you have a GigE link (where appropriate) in every network segment between your test endpoints (switch segments, target endpoint computer etc)
     18  * if using PoE make sure you have a PoE injector capable of GigE
     19 * General:
     20  * eliminate unnecessary kernel modules which may be present for packet filtering (such as ipt and ebtables related modules). To see an example on removing kernel modules see the [wiki:OpenWrt/kernelconfig#loadingmodules] page. If you are using hardware that requires some modules be sure to leave them in place.
     21   * '''Caution:''' Please make informed decisions when removing kernel modules as removing hardware related modules may have unintended effects.
     22  * minimize hardware in-between in case it is problematic (direct connection between endpoints)
     23  * eliminate unnecessary userspace applications which may be present.  To eliminate virtually all of them (you may need to configure network by hand after doing this) you can use 'for i in $(ls /etc/init.d); do /etc/init.d/$i disable; done; /etc/init.d/enable boot; /etc/init.d/enable done'
     24  * using iperf as a network test tool pay attention to window size which can greatly affect throughput (understand what it means)
     25  * be aware that generating traffic on an embedded node creates a performance hit on that node vs sending traffic 'through' the node
     26  * run 'top' while testing to see where the bottlenecks may be:  Understand that if virtually 100% of utilization occurs in sirq (soft irq), irq (hard irq), and nic (network driver) then you have maxed out the performance due to raw interrupts and low level packet handling
     27
     28== iperf ==
     29Use iperf to test throughput.[[BR]]
     30[[BR]]
     31
     32
     33Please read up on iperf on google or this tutorial [http://openmaniak.com/iperf.php][[BR]]
     34[[BR]]
     35
     36Basic Setup:[[BR]]
     37
     38There is a client and a server. This is differentiated based on the command.[[BR]][[BR]]
     39Server:
     40{{{
     41iperf -s
     42}}}
     43Client:
     44{{{
     45iperf -c 192.168.1.1
     46}}}
     47
     48Note:  For UDP, a bandwidth limit is needed.  Use the flag -b followed by the bandwidth limit desired (1m, 10m, 100m, 200m, 300m, 500m, 1g, etc).
     49Because iperf is processor intensive, there is no need to generate more traffic than the processor can handle.  Therefore, incrementally increase the bandwidth limit until the results are slightly below the limit, thus not creating larger amounts of overhead.
     50[[BR]][[BR]]
     51For example a bandwidth limit of 10m will easily be hit on a GBe link.  However, once at 200m bandwidth limit, throughput numbers may hit only 187Mbits/sec thus creating very little processor overhead.[[BR]][[BR]]
     52'''VERY IMPORTANT: ORDER MATTERS.  The iperf manual (please read it) states that the bandwidth flag must be placed at the end of the command to work!'''[[BR]][[BR]]
     53
     54From the client type:
     55{{{
     56iperf -u -c 192.168.4.1 -b 10m
     57}}}
     58From the server type:
     59{{{
     60iperf -s -u
     61}}}
     62[[BR]][[BR]]
     63'''Increasing Bandwidth Limit Example:'''
     64{{{
     65root@OpenWrt:/# iperf -u -c 192.168.4.1 -b 10m
     66------------------------------------------------------------
     67Client connecting to 192.168.4.1, UDP port 5001
     68Sending 1470 byte datagrams
     69UDP buffer size:  160 KByte (default)
     70------------------------------------------------------------
     71[  3] local 192.168.4.2 port 56615 connected with 192.168.4.1 port 5001
     72[ ID] Interval       Transfer     Bandwidth
     73[  3]  0.0-10.0 sec  11.9 MBytes  10.0 Mbits/sec
     74[  3] Sent 8505 datagrams
     75[  3] Server Report:
     76[  3]  0.0-10.0 sec  11.9 MBytes  10.0 Mbits/sec   0.028 ms    1/ 8506 (0.012%)
     77root@OpenWrt:/# iperf -u -c 192.168.4.1 -b 100m
     78------------------------------------------------------------
     79Client connecting to 192.168.4.1, UDP port 5001
     80Sending 1470 byte datagrams
     81UDP buffer size:  160 KByte (default)
     82------------------------------------------------------------
     83[  3] local 192.168.4.2 port 33153 connected with 192.168.4.1 port 5001
     84[ ID] Interval       Transfer     Bandwidth
     85[  3]  0.0-10.0 sec   120 MBytes   100 Mbits/sec
     86[  3] Sent 85304 datagrams
     87[  3] Server Report:
     88[  3]  0.0-10.0 sec   119 MBytes  99.8 Mbits/sec   0.077 ms  514/85305 (0.6%)
     89root@OpenWrt:/# iperf -u -c 192.168.4.1 -b 200m
     90------------------------------------------------------------
     91Client connecting to 192.168.4.1, UDP port 5001
     92Sending 1470 byte datagrams
     93UDP buffer size:  160 KByte (default)
     94------------------------------------------------------------
     95[  3] local 192.168.4.2 port 56998 connected with 192.168.4.1 port 5001
     96[ ID] Interval       Transfer     Bandwidth
     97[  3]  0.0-10.0 sec   222 MBytes   186 Mbits/sec
     98[  3] Sent 158150 datagrams
     99[  3] Server Report:
     100[  3]  0.0-10.2 sec  59.3 MBytes  48.6 Mbits/sec  15.794 ms 115820/158151 (73%)
     101root@OpenWrt:/# iperf -u -c 192.168.4.1 -b 300m
     102------------------------------------------------------------
     103Client connecting to 192.168.4.1, UDP port 5001
     104Sending 1470 byte datagrams
     105UDP buffer size:  160 KByte (default)
     106------------------------------------------------------------
     107[  3] local 192.168.4.2 port 52109 connected with 192.168.4.1 port 5001
     108[ ID] Interval       Transfer     Bandwidth
     109[  3]  0.0-10.0 sec   223 MBytes   187 Mbits/sec
     110[  3] Sent 158814 datagrams
     111[  3] Server Report:
     112[  3]  0.0-10.0 sec  58.0 MBytes  48.7 Mbits/sec   0.240 ms 117423/158815 (74%)
     113}}}
     114
     115
     116== Examples ==
     117
     118
     119Here are some examples showing various tunings of a GW2388 (dual core 600MHz ARM with dual GigE ports) with iperf network bandwidth test between GW2388 and a PC through a Netgear GigE switch:
     120 * pre-built firmware (12-10 release), unmodified (186/491mbps tx/rx)
     121{{{
     122root@OpenWrt:/# iperf -c 192.168.1.146
     123------------------------------------------------------------
     124Client connecting to 192.168.1.146, TCP port 5001
     125TCP window size: 16.0 KByte (default)
     126------------------------------------------------------------
     127[  3] local 192.168.1.83 port 56088 connected with 192.168.1.146 port 5001
     128[ ID] Interval       Transfer     Bandwidth
     129[  3]  0.0-10.0 sec   223 MBytes   186 Mbits/sec
     130root@OpenWrt:/# iperf -s
     131------------------------------------------------------------
     132Server listening on TCP port 5001
     133TCP window size: 85.3 KByte (default)
     134------------------------------------------------------------
     135[  4] local 192.168.1.83 port 5001 connected with 192.168.1.146 port 55929
     136[ ID] Interval       Transfer     Bandwidth
     137[  4]  0.0-10.0 sec   500 MBytes   419 Mbits/sec
     138}}}
     139 * disabling all kernel modules (306/732mbps tx/rx) (iptables/ebtables is a big performance hit)
     140{{{
     141root@OpenWrt:/# mv /etc/modules.d /etc/modules.old
     142root@OpenWrt:/# reboot
     143root@OpenWrt:/# iperf -c 192.168.1.146
     144------------------------------------------------------------
     145Client connecting to 192.168.1.146, TCP port 5001
     146TCP window size: 16.0 KByte (default)
     147------------------------------------------------------------
     148[  3] local 192.168.1.83 port 58570 connected with 192.168.1.146 port 5001
     149[ ID] Interval       Transfer     Bandwidth
     150[  3]  0.0-10.0 sec   365 MBytes   306 Mbits/sec
     151root@gw2388-test:/# iperf -s
     152------------------------------------------------------------
     153Server listening on TCP port 5001
     154TCP window size: 85.3 KByte (default)
     155------------------------------------------------------------
     156[  4] local 192.168.1.83 port 5001 connected with 192.168.1.146 port 56554
     157[ ID] Interval       Transfer     Bandwidth
     158[  4]  0.0-10.0 sec   873 MBytes   732 Mbits/sec
     159}}}
     160 * disabling all init scripts as well (378/754mbps tx/rx)
     161{{{
     162root@OpenWrt:/# for i in $(ls /etc/init.d); do /etc/init.d/$i disable; done
     163root@OpenWrt:/# /etc/init.d/boot enable
     164root@OpenWrt:/# reboot
     165root@OpenWrt:/# iperf -c 192.168.1.146
     166------------------------------------------------------------
     167Client connecting to 192.168.1.146, TCP port 5001
     168TCP window size: 16.0 KByte (default)
     169------------------------------------------------------------
     170[  3] local 192.168.1.93 port 52295 connected with 192.168.1.146 port 5001
     171[ ID] Interval       Transfer     Bandwidth
     172[  3]  0.0-10.0 sec   451 MBytes   378 Mbits/sec
     173root@OpenWrt:/# iperf -s
     174------------------------------------------------------------
     175Server listening on TCP port 5001
     176TCP window size: 85.3 KByte (default)
     177------------------------------------------------------------
     178[  4] local 192.168.1.93 port 5001 connected with 192.168.1.146 port 37005
     179[ ID] Interval       Transfer     Bandwidth
     180[  4]  0.0-10.0 sec   900 MBytes   754 Mbits/sec
     181}}}
     182
     183Here are some examples using a GW2380 (single core 300MHz ARM with single GigE port) looking at transmit performance:
     184 * pre-built firmware (12-10 release), unmodified (153/138mbps tx/rx)
     185{{{
     186root@OpenWrt:/# iperf -c 192.168.1.146
     187------------------------------------------------------------
     188Client connecting to 192.168.1.146, TCP port 5001
     189TCP window size: 16.0 KByte (default)
     190------------------------------------------------------------
     191[  3] local 192.168.1.87 port 33327 connected with 192.168.1.146 port 5001
     192[ ID] Interval       Transfer     Bandwidth
     193[  3]  0.0-10.0 sec   183 MBytes   153 Mbits/sec
     194root@OpenWrt:/# iperf -s
     195------------------------------------------------------------
     196Server listening on TCP port 5001
     197TCP window size: 85.3 KByte (default)
     198------------------------------------------------------------
     199[  4] local 192.168.1.87 port 5001 connected with 192.168.1.146 port 53363
     200[ ID] Interval       Transfer     Bandwidth
     201[  4]  0.0-10.1 sec   166 MBytes   138 Mbits/sec
     202}}}
     203 * disabling all kernel modules (207/214mbps tx/rx) (iptables/ebtables is a big performance hit)
     204{{{
     205root@OpenWrt:/# mv /etc/modules.d /etc/modules.old
     206root@OpenWrt:/# reboot
     207root@OpenWrt:/# iperf -c 192.168.1.146
     208------------------------------------------------------------
     209Client connecting to 192.168.1.146, TCP port 5001
     210TCP window size: 16.0 KByte (default)
     211------------------------------------------------------------
     212[  3] local 192.168.1.97 port 60819 connected with 192.168.1.146 port 5001
     213[ ID] Interval       Transfer     Bandwidth
     214[  3]  0.0-10.0 sec   248 MBytes   207 Mbits/sec
     215root@OpenWrt:/# iperf -s
     216------------------------------------------------------------
     217Server listening on TCP port 5001
     218TCP window size: 85.3 KByte (default)
     219------------------------------------------------------------
     220[  4] local 192.168.1.87 port 5001 connected with 192.168.1.146 port 53387
     221[ ID] Interval       Transfer     Bandwidth
     222[  4]  0.0-10.0 sec   255 MBytes   214 Mbits/sec
     223}}}
     224 * disabling all init scripts as well (222/214mbps tx/rx)
     225{{{
     226root@OpenWrt:/# for i in $(ls /etc/init.d); do /etc/init.d/$i disable; done
     227root@OpenWrt:/# /etc/init.d/boot enable
     228root@OpenWrt:/# /etc/init.d/done enable
     229root@OpenWrt:/# reboot
     230root@OpenWrt:/# iperf -c 192.168.1.146
     231------------------------------------------------------------
     232Client connecting to 192.168.1.146, TCP port 5001
     233TCP window size: 16.0 KByte (default)
     234------------------------------------------------------------
     235[  3] local 192.168.1.97 port 34382 connected with 192.168.1.146 port 5001
     236[ ID] Interval       Transfer     Bandwidth
     237[  3]  0.0-10.0 sec   265 MBytes   222 Mbits/sec
     238root@OpenWrt:/# iperf -s
     239------------------------------------------------------------
     240Server listening on TCP port 5001
     241TCP window size: 85.3 KByte (default)
     242------------------------------------------------------------
     243[  4] local 192.168.1.87 port 5001 connected with 192.168.1.146 port 53387
     244[ ID] Interval       Transfer     Bandwidth
     245[  4]  0.0-10.0 sec   255 MBytes   214 Mbits/sec
     246}}}
     247
     248
     249Notes:
     250 * the above tests are using 'iperf -s' on an Unbuntu Linux GigE PC Host through a GigE Netgear switch.  This uses a 16KB TCP window size - you can acheive higher tx throughput by using larger TCP windows.
     251
     252
     253== Wireless Tuning ==
     254
     255Wireless performance is a very finicky process.[[BR]][[BR]]
     256
     257Wireless is dependent on so many factors.  Wireless N speeds at 300 Mbps are not typically achieved in real life.  An ARM processor on a Gateworks board is not quite the same as a 3.4 GHz X86 Machine.[[BR]][[BR]]
     258
     259
     260Here are a few tips for wireless:
     261 1. Wireless encryption protocols can affect performance because of computation.  Choose wisely.
     262 2. Antenna type and orientation and distance are VERY important.  Be sure to hook up all antennas to the wireless card and testing 2 boards 3 feet apart may not achieve the best results.
     263 3. Wireless N will sometimes run faster at 40MHz vs 20 MHz.
     264 4. Try Channel 153 for Wireless N.
     265 5. Use a uncluttered channel that other devices are not using.
     266 6. The hardware mode for openwrt for the N radios would typically be 11na.
     267 7. 5.8GHz will run faster than 2.4GHz.
     268 8. Optimize the software as noted below.  The more items running on the board, the less processor that can be utilized for all of the wireless traffic.
     269
     270We have removed some modules at times to reduce the software load and try to obtain higher throughput.
     271
     272These are the commands that have been using to tune performance for wireless testing on both the Cambria and Laguna platforms.
     273This is not a fully supported and will disable certain features.  Please use at your own risk.
     274
     275'''*WARNING: Run these commands on the Gateworks board once it is booted up.  Please only do so over serial as telnet is disabled below'''
     276
     277{{{
     278/etc/init.d/batmand disable
     279/etc/init.d/collectd disable
     280/etc/init.d/cron disable
     281/etc/init.d/dnsmasq disable
     282/etc/init.d/dropbear disable
     283/etc/init.d/firewall disable
     284/etc/init.d/gpsd disable
     285/etc/init.d/gscd disable
     286/etc/init.d/led disable
     287/etc/init.d/luci_bwc disable
     288/etc/init.d/luci_dhcp_migrate disable
     289/etc/init.d/luci_fixtime disable
     290/etc/init.d/luci_statistics disable
     291/etc/init.d/miniupnpd disable
     292/etc/init.d/openvpn disable
     293/etc/init.d/qos disable
     294/etc/init.d/rcS disable
     295/etc/init.d/relayd disable
     296/etc/init.d/serialoverip disable
     297/etc/init.d/sysntpd disable
     298/etc/init.d/ntpd disable
     299/etc/init.d/telnet disable
     300/etc/init.d/tinyproxy disable
     301/etc/init.d/uhttpd disable
     302/etc/init.d/umount disable
     303/etc/init.d/usb disable
     304/etc/init.d/vnstat disable
     305
     306mkdir /etc/modules.old
     307mv /etc/modules.d/* /etc/modules.old
     308mv /etc/modules.old/*crypto* /etc/modules.d
     309mv /etc/modules.old/*80211* /etc/modules.d
     310mv /etc/modules.old/*nls-base* /etc/modules.d
     311mv /etc/modules.old/*usb-core* /etc/modules.d
     312mv /etc/modules.old/*ath5k* /etc/modules.d
     313mv /etc/modules.old/*ath9k* /etc/modules.d
     314mv /etc/modules.old/26-ath  /etc/modules.d
     315mv /etc/modules.old/50-madwifi  /etc/modules.d
     316}}}
     317
     318
     319Wireless configuration used:
     320{{{
     321ACCESS POINT WIRELESS UCI Config:
     322root@OpenWrt:/# uci show wireless
     323wireless.radio0=wifi-device
     324wireless.radio0.type=mac80211
     325wireless.radio0.phy=phy0
     326wireless.radio0.ht_capab=SHORT-GI-40 TX-STBC RX-STBC1 DSSS_CCK-40
     327wireless.radio0.disabled=0
     328wireless.radio0.country=US
     329wireless.radio0.txpower=17
     330wireless.radio0.htmode=HT40-
     331wireless.radio0.channel=153
     332wireless.radio0.hwmode=11na
     333wireless.@wifi-iface[0]=wifi-iface
     334wireless.@wifi-iface[0].device=radio0
     335wireless.@wifi-iface[0].network=lan
     336wireless.@wifi-iface[0].mode=ap
     337wireless.@wifi-iface[0].ssid=gateworks
     338wireless.@wifi-iface[0].wds=1
     339wireless.@wifi-iface[0].encryption=psk2
     340wireless.@wifi-iface[0].key=abc
     341
     342CLIENT WDS WIRELESS UCI Config:
     343root@OpenWrt:/# uci show wireless
     344wireless.radio0=wifi-device
     345wireless.radio0.type=mac80211
     346wireless.radio0.phy=phy0
     347wireless.radio0.ht_capab=SHORT-GI-40 TX-STBC RX-STBC1 DSSS_CCK-40
     348wireless.radio0.disabled=0
     349wireless.radio0.txpower=17
     350wireless.radio0.country=US
     351wireless.radio0.htmode=HT40-
     352wireless.radio0.channel=153
     353wireless.radio0.hwmode=11na
     354wireless.@wifi-iface[0]=wifi-iface
     355wireless.@wifi-iface[0].device=radio0
     356wireless.@wifi-iface[0].network=lan
     357wireless.@wifi-iface[0].ssid=gateworks
     358wireless.@wifi-iface[0].mode=sta
     359wireless.@wifi-iface[0].wds=1
     360wireless.@wifi-iface[0].encryption=psk2
     361wireless.@wifi-iface[0].key=abc
     362}}}
     363
     364We then ran iperf from the the two pc's, with one being the server and one the client.
     365
     366{{{
     367Server:
     368iperf -s
     369
     370Client:
     371iperf -t10 -w 512k -c 192.168.0.23
     372
     373iperf TCP results:
     374
     375------------------------------------------------------------
     376Client connecting to 192.168.0.23, TCP port 5001
     377TCP window size:  256 KByte (WARNING: requested  512 KByte)
     378------------------------------------------------------------
     379[  3] local 192.168.0.22 port 52644 connected with 192.168.0.23 port 5001
     380[ ID] Interval       Transfer     Bandwidth
     381[  3]  0.0-10.0 sec  99.9 MBytes  83.7 Mbits/sec
     382}}}
     383
     384=== Wireless Modulation Rate ===
     385The modulation rate is dynamic.  The rate adjusts depending on the quality of the RF signal.  The better the signal, the better the rate.  The table below indicates what rate you are currently achieving.  If you have a terrible rate, you will notice your bandwidth much lower and need to adjust the antennas / distance / obstructions to get a better rate.  The highest rates can be very very hard to achieve.
     386{{{
     387root@OpenWrt:/# cat /sys/kernel/debug/ieee80211/phy0/netdev\:wlan0/stations/a8\:
     38854\:b2\:00\:04\:2e/rc_stats
     389type      rate     throughput  ewma prob   this prob  this succ/attempt   success    attempts
     390HT20/LGI    MCS0        6.1       92.0      100.0          0(  0)        106         111
     391HT20/LGI    MCS1       12.8       96.7      100.0          0(  0)        109         116
     392HT20/LGI    MCS2       19.5       99.7      100.0          0(  0)        112         119
     393HT20/LGI    MCS3       25.8       99.9      100.0          0(  0)        108         110
     394HT20/LGI    MCS4       36.2       95.2      100.0          0(  0)        102         112
     395HT20/LGI    MCS5       44.2       89.8      100.0          0(  0)        108         111
     396HT20/LGI    MCS6       48.4       88.7      100.0          0(  0)       2442        2816
     397HT20/LGI   PMCS7       48.5       79.1       56.6         68(120)       3616        4236
     398HT20/LGI    MCS8       12.1       92.1      100.0          0(  0)        103         110
     399HT20/LGI    MCS9       24.5       95.1      100.0          0(  0)        105         117
     400HT20/LGI    MCS10      37.8       99.5      100.0          0(  0)        118         123
     401HT20/LGI    MCS11      48.3       98.1      100.0          0(  0)        121         127
     402HT20/LGI    MCS12      58.8       81.7       33.3         13( 39)      14294       17331
     403HT20/LGI  t MCS13      66.9       74.2       60.8          0(  0)      62514       85221
     404HT20/LGI T  MCS14      67.9       67.2       58.2          0(  0)     110248      163970
     405HT20/LGI    MCS15      61.4       55.9       28.0         32(114)     141375      243633
     406
     407T= what we are on
     408t= what we are on next
     409}}}
     410
     411[http://mcsindex.com/ Modulation Table Online ]
     412
     413== Measuring Performance ==
     414In most cases, measuring the performance of a particular system function can be done with specialized tests like {{{iperf}}}. When a more thorough measurement is desired of the overall system, a small and portable benchmarking suite like {{{lmbench}}} is more appropriate.
     415
     416=== lmbench ===
     417{{{lmbench}}} is a micro-benchmark suite designed to focus attention on the basic building blocks of many common system applications, such as databases, simulations, software development, and networking. It provides a suite of benchmarks that attempt to measure the most commonly found performance bottlenecks in a wide range of system applications. {{{lmbench}}} is designed to identify, isolate, and reproduce these performance bottlenecks using a set of small microbenchmarks which measure system latency and bandwidth of data movement among the processor and memory, network, file system, and disk.
     418
     419Installation can be done on Ubuntu systems via {{{sudo apt-get install lmbench}}}. Alternatively, you can compile the source yourself which can be found at the [http://www.bitmover.com/lmbench/ lmbench website].
     420
     421Run the following commands to compile the source:
     422{{{#!bash
     423tar xvf lmbench3.tar.gz
     424cd lmbench3
     425mkdir SCCS; touch SCCS/s.ChangeSet
     426make -C src/
     427}}}
     428
     429Running the benchmark suite is done via {{{make results}}}. The binaries for the individual benchmarks can be found in the {{{bin/}}} directory.
     430
     431The {{{src/Makefile}}} has additional make targets for your convenience:
     432{{{#!bash
     433# lmbench       [default] builds the benchmark suite for the current os/arch
     434# results       builds, configures run parameters, and runs the benchmark
     435# rerun         reruns the benchmark using the same parameters as last time
     436# scaling       reruns the benchmark using same parameters as last time,
     437#               except it asks what scaling value to use
     438# hardware      reruns the hardware benchmarks using the same parameters
     439# os            reruns the OS benchmarks using the same parameters
     440# clean         cleans out sources and run configuration
     441# clobber       clean and removes the bin directories
     442# shar          obsolete, use cd .. && make shar
     443# depend        builds make dependencies (needs gcc)
     444# debug         builds all the benchmarks with '-g' debugging flag
     445# assembler     builds the .s files for each benchmark3
     446}}}
     447
     448After the test has been completed, you can compare results from multiple runs with {{{make -C results/ LIST=*}}}
     449
     450Read the man pages for the individual benchmarks in the {{{doc/}}} directory, or the [http://www.bitmover.com/lmbench/lmbench-usenix.pdf lmbench introduction] to learn more about the test suite.