home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Enter 1999 June / enter_06_1999.iso / doc / HOWTO / Benchmarking-HOWTO < prev    next >
Text File  |  1998-10-14  |  44KB  |  1,321 lines

  1.   Linux Benchmarking HOWTO
  2.   by Andr D. Balsa, andrewbalsa@usa.net  <mailto:andrew-
  3.   balsa@usa.net>
  4.   v0.12, 15 August 1997
  5.  
  6.   The Linux Benchmarking HOWTO discusses some issues associated with the
  7.   benchmarking of Linux systems and presents a basic benchmarking
  8.   toolkit, as well as an associated form, which enable one to produce
  9.   significant benchmarking information in a couple of hours. Perhaps it
  10.   will also help diminish the amount of useless articles in
  11.   comp.os.linux.hardware...
  12.   ______________________________________________________________________
  13.  
  14.   Table of Contents
  15.  
  16.  
  17.   1. Introduction
  18.  
  19.      1.1 Why is benchmarking so important ?
  20.      1.2 Invalid benchmarking considerations
  21.  
  22.   2. Benchmarking procedures and interpretation of results
  23.  
  24.      2.1 Understanding benchmarking choices
  25.         2.1.1 Synthetic vs. applications benchmarks
  26.         2.1.2 High-level vs. low-level benchmarks
  27.      2.2 Standard benchmarks available for Linux
  28.      2.3 Links and references
  29.  
  30.   3. The Linux Benchmarking Toolkit (LBT)
  31.  
  32.      3.1 Rationale
  33.      3.2 Benchmark selection
  34.      3.3 Test duration
  35.      3.4 Comments
  36.         3.4.1 Kernel 2.0.0 compilation:
  37.         3.4.2 Whetstone:
  38.         3.4.3 Xbench-0.2:
  39.         3.4.4 UnixBench version 4.01:
  40.         3.4.5 BYTE Magazine's BYTEmark benchmarks:
  41.      3.5 Possible improvements
  42.      3.6 LBT Report Form
  43.      3.7 Network performance tests
  44.      3.8 SMP tests
  45.  
  46.   4. Example run and results
  47.  
  48.   5. Pitfalls and caveats of benchmarking
  49.  
  50.      5.1 Comparing apples and oranges
  51.      5.2 Incomplete information
  52.      5.3 Proprietary hardware/software
  53.      5.4 Relevance
  54.  
  55.   6. FAQ
  56.  
  57.   7. Copyright, acknowledgments and miscellaneous
  58.  
  59.      7.1 How this document was produced
  60.      7.2 Copyright
  61.      7.3 New versions of this document
  62.      7.4 Feedback
  63.      7.5 Acknowledgments
  64.      7.6 Disclaimer
  65.      7.7 Trademarks
  66.  
  67.   ______________________________________________________________________
  68.  
  69.   1.  Introduction
  70.  
  71.  
  72.   "What we cannot speak about we must pass over in silence."
  73.  
  74.        Ludwig Wittgenstein (1889-1951), Austrian philosopher
  75.  
  76.  
  77.   Benchmarking means measuring the speed with which a computer system
  78.   will execute a computing task, in a way that will allow comparison
  79.   between different hard/software combinations. It does not involve
  80.   user-friendliness, aesthetic or ergonomic considerations or any other
  81.   subjective judgment.
  82.  
  83.   Benchmarking is a tedious, repetitive task, and takes attention to
  84.   details. Very often the results are not what one would expect, and
  85.   subject to interpretation (which actually may be the most important
  86.   part of a benchmarking procedure).
  87.  
  88.   Finally, benchmarking deals with facts and figures, not opinion or
  89.   approximation.
  90.  
  91.   1.1.  Why is benchmarking so important ?
  92.  
  93.  
  94.   Apart from the reasons pointed out in the BogoMips Mini-HOWTO (section
  95.   7, paragraph 2), one occasionally is confronted with a limited budget
  96.   and/or minimum performance requirements while putting together a Linux
  97.   box. In other words, when confronted with the following questions:
  98.  
  99.   o  How do I maximize performance within a given budget ?
  100.  
  101.   o  How do I minimize costs for a required minimum performance level ?
  102.  
  103.   o  How do I obtain the best performance/cost ratio (within a given
  104.      budget or given performance requirements)?
  105.  
  106.   one will have to examine, compare and/or produce benchmarks.
  107.   Minimizing costs with no performance requirements usually involves
  108.   putting together a machine with leftover parts (that old 386SX-16 box
  109.   lying around in the garage will do fine) and does not require
  110.   benchmarks, and maximizing performance with no cost ceiling is not a
  111.   realistic situation (unless one is willing to put a Cray box in
  112.   his/her living room - the leather-covered power supplies around it
  113.   look nice, don't they ?).
  114.  
  115.   Benchmarking per se is senseless, a waste of time and money; it is
  116.   only meaningful as part of a decision process, i.e. if one has to make
  117.   a choice between two or more alternatives.
  118.  
  119.   Usually another parameter in the decision process is cost, but it
  120.   could be availability, service, reliability, strategic considerations
  121.   or any other rational, measurable characteristic of a computer system.
  122.   When comparing the performance of different Linux kernel versions, for
  123.   example, stability is almost always more important than speed.
  124.  
  125.   1.2.  Invalid benchmarking considerations
  126.  
  127.  
  128.   Very often read in newsgroups and mailing lists, unfortunately:
  129.  
  130.   1. Reputation of manufacturer (unmeasurable and meaningless).
  131.  
  132.  
  133.   2. Market share of manufacturer (meaningless and irrelevant).
  134.  
  135.   3. Irrational parameters (for example, superstition or prejudice:
  136.      would you buy a processor labeled 131313ZAP and painted pink ?)
  137.  
  138.   4. Perceived value (meaningless, unmeasurable and irrational).
  139.  
  140.   5. Amount of marketing hype: this one is the worst, I guess. I
  141.      personally am fed up with the "XXX inside" or "kkkkkws compatible"
  142.      logos (now the "aaaaaPowered" has joined the band - what next ?).
  143.      IMHO, the billions of dollars spent on such campaigns would be
  144.      better used by research teams on the design of new, faster,
  145.      (cheaper :-) bug-free processors. No amount of marketing hype will
  146.      remove a floating-point bug in the FPU of the brand-new processor
  147.      you just plugged in your motherboard, but an exchange against a
  148.      redesigned processor will.
  149.  
  150.   6. "You get what you pay for" opinions are just that: opinions. Give
  151.      me the facts, please.
  152.  
  153.   2.  Benchmarking procedures and interpretation of results
  154.  
  155.  
  156.   A few semi-obvious recommendations:
  157.  
  158.   1. First and foremost, identify your benchmarking goals. What is it
  159.      you are exactly trying to benchmark ? In what way will the
  160.      benchmarking process help later in your decision making ? How much
  161.      time and resources are you willing to put into your benchmarking
  162.      effort ?
  163.  
  164.   2. Use standard tools. Use a current, stable kernel version, standard,
  165.      current gcc and libc and a standard benchmark. In short, use the
  166.      LBT (see below).
  167.  
  168.   3. Give a complete description of your setup (see the LBT report form
  169.      below).
  170.  
  171.   4. Try to isolate a single variable. Comparative benchmarking is more
  172.      informative than "absolute" benchmarking. I cannot stress this
  173.      enough.
  174.  
  175.   5. Verify your results. Run your benchmarks a few times and verify the
  176.      variations in your results, if any. Unexplained variations will
  177.      invalidate your results.
  178.  
  179.   6. If you think your benchmarking effort produced meaningful
  180.      information, share it with the Linux community in a precise and
  181.      concise way.
  182.  
  183.   7. Please forget about BogoMips. I promise myself I shall someday
  184.      implement a very fast ASIC with the BogoMips loop wired in. Then we
  185.      shall see what we shall see !
  186.  
  187.   2.1.  Understanding benchmarking choices
  188.  
  189.  
  190.   2.1.1.  Synthetic vs. applications benchmarks
  191.  
  192.  
  193.   Before spending any amount of time on benchmarking chores, a basic
  194.   choice must be made between "synthetic" benchmarks and "applications"
  195.   benchmarks.
  196.  
  197.   Synthetic benchmarks are specifically designed to measure the
  198.   performance of individual components of a computer system, usually by
  199.   exercising the chosen component to its maximum capacity. An example of
  200.   a well-known synthetic benchmark is the Whetstone suite, originally
  201.   programmed in 1972 by Harold Curnow in FORTRAN (or was that ALGOL ?)
  202.   and still in widespread use nowadays. The Whestone suite will measure
  203.   the floating-point performance of a CPU.
  204.  
  205.   The main critic that can be made to synthetic benchmarks is that they
  206.   do not represent a computer system's performance in real-life
  207.   situations. Take for example the Whetstone suite: the main loop is
  208.   very short and will easily fit in the primary cache of a CPU, keeping
  209.   the FPU pipeline constantly filled and so exercising the FPU to its
  210.   maximum speed. We cannot really criticize the Whetstone suite if we
  211.   remember it was programmed 25 years ago (its design dates even earlier
  212.   than that !), but we must make sure we interpret its results with
  213.   care, when it comes to benchmarking modern microprocessors.
  214.  
  215.   Another very important point to note about synthetic benchmarks is
  216.   that, ideally, they should tell us something about a specific aspect
  217.   of the system being tested, independently of all other aspects: a
  218.   synthetic benchmark for Ethernet card I/O throughput should result in
  219.   the same or similar figures whether it is run on a 386SX-16 with 4
  220.   MBytes of RAM or a Pentium 200 MMX with 64 MBytes of RAM. Otherwise,
  221.   the test will be measuring the overall performance of the
  222.   CPU/Motherboard/Bus/Ethernet card/Memory subsystem/DMA combination:
  223.   not very useful since the variation in CPU will cause a greater impact
  224.   than the change in Ethernet network card (this of course assumes we
  225.   are using the same kernel/driver combination, which could cause an
  226.   even greater variation)!
  227.  
  228.   Finally, a very common mistake is to average various synthetic
  229.   benchmarks and claim that such an average is a good representation of
  230.   real-life performance for any given system.
  231.  
  232.   Here is a comment on FPU benchmarks quoted with permission from the
  233.   Cyrix Corp. Web site:
  234.  
  235.        "A Floating Point Unit (FPU) accelerates software designed
  236.        to use floating point mathematics : typically CAD programs,
  237.        spreadsheets, 3D games and design applications. However,
  238.        today's most popular PC applications make use of both float-
  239.        ing point and integer instructions. As a result, Cyrix chose
  240.        to emphasize "parallelism" in the design of the 6x86 proces-
  241.        sor to speed up software that intermixes these two instruc-
  242.        tion types.
  243.  
  244.  
  245.  
  246.        The x86 floating point exception model allows integer
  247.        instructions to issue and complete while a floating point
  248.        instruction is executing. In contrast, a second floating
  249.        point instruction cannot begin execution while a previous
  250.        floating point instruction is executing. To remove the per-
  251.        formance limitation created by the floating point exception
  252.        model, the 6x86 can speculatively issue up to four floating
  253.        point instructions to the on-chip FPU while continuing to
  254.        issue and execute integer instructions. As an example, in a
  255.        code sequence of two floating point instructions (FLTs) fol-
  256.        lowed by six integer instructions (INTs) followed by two
  257.        FLTs, the 6x86 processor can issue all ten instructions to
  258.        the appropriate execution units prior to completion of the
  259.        first FLT. If none of the instructions fault (the typical
  260.        case), execution continues with both the integer and float-
  261.        ing point units completing instructions in parallel. If one
  262.        of the FLTs faults (the atypical case), the speculative exe-
  263.        cution capability of the 6x86 allows the processor state to
  264.        be restored in such a way that it is compatible with the x86
  265.   floating point exception model.
  266.  
  267.  
  268.  
  269.        Examination of benchmark tests reveals that synthetic float-
  270.        ing point benchmarks use a pure floating point-only code
  271.        stream not found in real-world applications. This type of
  272.        benchmark does not take advantage of the speculative execu-
  273.        tion capability of the 6x86 processor. Cyrix believes that
  274.        non-synthetic benchmarks based on real-world applications
  275.        better reflect the actual performance users will achieve.
  276.        Real-world applications contain intermixed integer and
  277.        floating point instructions and therefore benefit from the
  278.        6x86 speculative execution capability."
  279.  
  280.  
  281.   So, the recent trend in benchmarking is to choose common applications
  282.   and use them to test the performance of complete computer systems. For
  283.   example, SPEC, the non-profit corporation that designed the well-known
  284.   SPECINT and SPECFP synthetic benchmark suites, has launched a project
  285.   for a new applications benchmark suite. But then again, it is very
  286.   unlikely that such commercial benchmarks will ever include any Linux
  287.   code.
  288.  
  289.   Summarizing, synthetic benchmarks are valid as long as you understand
  290.   their purposes and limitations. Applications benchmarks will better
  291.   reflect a computer system's performance, but none are available for
  292.   Linux.
  293.  
  294.   2.1.2.  High-level vs. low-level benchmarks
  295.  
  296.  
  297.   Low-level benchmarks will directly measure the performance of the
  298.   hardware: CPU clock, DRAM and cache SRAM cycle times, hard disk
  299.   average access time, latency, track-to-track stepping time, etc...
  300.   This can be useful in case you bought a system and are wondering what
  301.   components it was built with, but a better way to check these figures
  302.   would be to open the case, list whatever part numbers you can find and
  303.   somehow obtain the data sheet for each part (usually on the Web).
  304.  
  305.   Another use for low-level benchmarks is to check that a kernel driver
  306.   was correctly configured for a specific piece of hardware: if you have
  307.   the data sheet for the component, you can compare the results of the
  308.   low-level benchmarks to the theoretical, printed specs.
  309.  
  310.   High-level benchmarks are more concerned with the performance of the
  311.   hardware/driver/OS combination for a specific aspect of a
  312.   microcomputer system, for example file I/O performance, or even for a
  313.   specific hardware/driver/OS/application performance, e.g. an Apache
  314.   benchmark on different microcomputer systems.
  315.  
  316.   Of course, all low-level benchmarks are synthetic. High-level
  317.   benchmarks may be synthetic or applications benchmarks.
  318.  
  319.   2.2.  Standard benchmarks available for Linux
  320.  
  321.  
  322.   IMHO a simple test that anyone can do while upgrading any component in
  323.   his/her Linux box is to launch a kernel compile before and after the
  324.   hard/software upgrade and compare compilation times. If all other
  325.   conditions are kept equal then the test is valid as a measure of
  326.   compilation performance and one can be confident to say that:
  327.  
  328.        "Changing A to B led to an improvement of x % in the compile
  329.        time of the Linux kernel under such and such conditions".
  330.  
  331.   No more, no less !
  332.  
  333.   Since kernel compilation is a very usual task under Linux, and since
  334.   it exercises most functions that get exercised by normal benchmarks
  335.   (except floating-point performance), it constitutes a rather good
  336.   individual test. In most cases, however, results from such a test
  337.   cannot be reproduced by other Linux users because of variations in
  338.   hard/software configurations and so this kind of test cannot be used
  339.   as a "yardstick" to compare dissimilar systems (unless we all agree on
  340.   a standard kernel to compile - see below).
  341.  
  342.   Unfortunately, there are no Linux-specific benchmarking tools, except
  343.   perhaps the Byte Linux Benchmarks which are a slightly modified
  344.   version of the Byte Unix Benchmarks dating back from May 1991 (Linux
  345.   mods by Jon Tombs, original authors Ben Smith, Rick Grehan and Tom
  346.   Yager).
  347.  
  348.   There is a central Web site for the Byte Linux Benchmarks.
  349.  
  350.   An improved, updated version of the Byte Unix Benchmarks was put
  351.   together by David C. Niemi. It is called UnixBench 4.01 to avoid
  352.   confusion with earlier versions. Here is what David wrote about his
  353.   mods:
  354.  
  355.        "The original and slightly modified BYTE Unix benchmarks are
  356.        broken in quite a number of ways which make them an unusu-
  357.        ally unreliable indicator of system performance. I inten-
  358.        tionally made my "index" values look a lot different to
  359.        avoid confusion with the old benchmarks."
  360.  
  361.  
  362.   David has setup a majordomo mailing list for discussion of
  363.   benchmarking on Linux and competing OSs. Join with "subscribe bench"
  364.   sent in the body of a message to majordomo@wauug.erols.com
  365.   <mailto:majordomo@wauug.erols.com>. The Washington Area Unix User
  366.   Group is also in the process of setting up a  Web site for Linux
  367.   benchmarks.
  368.  
  369.   Also recently, Uwe F. Mayer, mayer@math.vanderbilt.edu
  370.   <mailto:mayer@math.vanderbilt.edu>ported the BYTE Bytemark suite to
  371.   Linux. This is a modern suite carefully put together by Rick Grehan at
  372.   BYTE Magazine to test the CPU, FPU and memory system performance of
  373.   modern microcomputer systems (these are strictly processor-performance
  374.   oriented benchmarks, no I/O or system performance is taken into
  375.   account).
  376.  
  377.   Uwe has also put together a Web site with a database of test results
  378.   for his version of the Linux BYTEmark benchmarks.
  379.  
  380.   While searching for synthetic benchmarks for Linux, you will notice
  381.   that sunsite.unc.edu carries few benchmarking tools. To test the
  382.   relative speed of X servers and graphics cards, the xbench-0.2 suite
  383.   by Claus Gittinger is available from sunsite.unc.edu, ftp.x.org and
  384.   other sites. Xfree86.org refuses (wisely) to carry or recommend any
  385.   benchmarks.
  386.  
  387.   The XFree86-benchmarks Survey is a Web site with a database of x-bench
  388.   results.
  389.  
  390.   For pure disk I/O throughput, the hdparm program (included with most
  391.   distributions, otherwise available from sunsite.unc.edu) will measure
  392.   transfer rates if called with the -t and -T switches.
  393.  
  394.   There are many other tools freely available on the Internet to test
  395.   various performance aspects of your Linux box.
  396.  
  397.   2.3.  Links and references
  398.  
  399.  
  400.   The comp.benchmarks.faq by Dave Sill is the standard reference for
  401.   benchmarking. It is not Linux specific, but recommended reading for
  402.   anybody serious about benchmarking. It is available from a number of
  403.   FTP and web sites and lists 56 different benchmarks, with links to FTP
  404.   or Web sites that carry them. Some of the benchmarks listed are
  405.   commercial (SPEC for example), though.
  406.  
  407.   I will not go through each one of the benchmarks mentionned in the
  408.   comp.benchmarks.faq, but there is at least one low-level suite which I
  409.   would like to comment on: the  lmbench suite, by Larry McVoy. Quoting
  410.   David C. Niemi:
  411.  
  412.        "Linus and David Miller use this a lot because it does some
  413.        useful low-level measurements and can also measure network
  414.        throughput and latency if you have 2 boxes to test with. But
  415.        it does not attempt to come up with anything like an overall
  416.        "figure of merit"..."
  417.  
  418.  
  419.   A rather complete FTP site for freely available benchmarks was put
  420.   together by Alfred Aburto. The Whetstone suite used in the LBT can be
  421.   found at this site.
  422.  
  423.   There is a multipart FAQ by Eugene Miya that gets posted regularly to
  424.   comp.benchmarks; it is an excellent reference.
  425.  
  426.   3.  The Linux Benchmarking Toolkit (LBT)
  427.  
  428.  
  429.   I will propose a basic benchmarking toolkit for Linux. This is a
  430.   preliminary version of a comprehensive Linux Benchmarking Toolkit, to
  431.   be expanded and improved. Take it for what it's worth, i.e. as a
  432.   proposal. If you don't think it is a valid test suite, feel free to
  433.   email me your critics and I will be glad to make the changes and
  434.   improve it if I can. Before getting into an argument, however, read
  435.   this HOWTO and the mentionned references: informed criticism is
  436.   welcomed, empty criticism is not.
  437.  
  438.   3.1.  Rationale
  439.  
  440.  
  441.   This is just common sense:
  442.  
  443.   1. It should not take a whole day to run. When it comes to comparative
  444.      benchmarking (various runs), nobody wants to spend days trying to
  445.      figure out the fastest setup for a given system. Ideally, the
  446.      entire benchmark set should take about 15 minutes to complete on an
  447.      average machine.
  448.  
  449.   2. All source code for the software used must be freely available on
  450.      the Net, for obvious reasons.
  451.  
  452.   3. Benchmarks should provide simple figures reflecting the measured
  453.      performance.
  454.  
  455.   4. There should be a mix of synthetic benchmarks and application
  456.      benchmarks (with separate results, of course).
  457.  
  458.   5. Each synthetic benchmarks should exercise a particular subsystem to
  459.      its maximum capacity.
  460.  
  461.   6. Results of synthetic benchmarks should not be averaged into a
  462.      single figure of merit (that defeats the whole idea behind
  463.      synthetic benchmarks, with considerable loss of information).
  464.  
  465.   7. Applications benchmarks should consist of commonly executed tasks
  466.      on Linux systems.
  467.  
  468.   3.2.  Benchmark selection
  469.  
  470.  
  471.   I have selected five different benchmark suites, trying as much as
  472.   possible to avoid overlap in the tests:
  473.  
  474.   1. Kernel 2.0.0 (default configuration) compilation using gcc.
  475.  
  476.   2. Whetstone version 10/03/97 (latest version by Roy Longbottom).
  477.  
  478.   3. xbench-0.2 (with fast execution parameters).
  479.  
  480.   4. UnixBench benchmarks version 4.01 (partial results).
  481.  
  482.   5. BYTE Magazine's BYTEmark benchmarks beta release 2 (partial
  483.      results).
  484.  
  485.   For tests 4 and 5, "(partial results)" means that not all results
  486.   produced by these benchmarks are considered.
  487.  
  488.   3.3.  Test duration
  489.  
  490.  
  491.   1. Kernel 2.0.0 compilation: 5 - 30 minutes, depending on the real
  492.      performance of your system.
  493.  
  494.   2. Whetstone: 100 seconds.
  495.  
  496.   3. Xbench-0.2: < 1 hour.
  497.  
  498.   4. UnixBench benchmarks version 4.01: approx. 15 minutes.
  499.  
  500.   5. BYTE Magazine's BYTEmark benchmarks: approx. 10 minutes.
  501.  
  502.   3.4.  Comments
  503.  
  504.  
  505.   3.4.1.  Kernel 2.0.0 compilation:
  506.  
  507.  
  508.   o  What: it is the only application benchmark in the LBT.
  509.  
  510.   o  The code is widely available (i.e. I finally found some use for my
  511.      old Linux CD-ROMs).
  512.  
  513.   o  Most linuxers recompile the kernel quite often, so it is a
  514.      significant measure of overall performance.
  515.  
  516.   o  The kernel is large and gcc uses a large chunk of memory:
  517.      attenuates L2 cache size bias with small tests.
  518.  
  519.   o  It does frequent I/O to disk.
  520.  
  521.   o  Test procedure: get a pristine 2.0.0 source, compile with default
  522.      options (make config, press Enter repeatedly). The reported time
  523.      should be the time spent on compilation i.e. after you type make
  524.      zImage, not including make dep, make clean. Note that the default
  525.      target architecture for the kernel is the i386, so if compiled on
  526.      another architecture, gcc too should be set to cross-compile, with
  527.      i386 as the target architecture.
  528.  
  529.   o  Results: compilation time in minutes and seconds (please don't
  530.      report fractions of seconds).
  531.  
  532.   3.4.2.  Whetstone:
  533.  
  534.  
  535.   o  What: measures pure floating point performance with a short, tight
  536.      loop. The source (in C) is quite readable and it is very easy to
  537.      see which floating-point operations are involved.
  538.  
  539.   o  Shortest test in the LBT :-).
  540.  
  541.   o  It's an "Old Classic" test: comparable figures are available, its
  542.      flaws and shortcomings are well known.
  543.  
  544.   o  Test procedure: the newest C source should be obtained from
  545.      Aburto's site. Compile and run in double precision mode. Specify
  546.      gcc and -O2 as precompiler and precompiler options, and define
  547.      POSIX 1 to specify machine type.
  548.  
  549.   o  Results: a floating-point performance figure in MWIPS.
  550.  
  551.   3.4.3.  Xbench-0.2:
  552.  
  553.  
  554.   o  What: measures X server performance.
  555.  
  556.   o  The xStones measure provided by xbench is a weighted average of
  557.      several tests indexed to an old Sun station with a single-bit-depth
  558.      display. Hmmm... it is questionable as a test of modern X servers,
  559.      but it's still the best tool I have found.
  560.  
  561.   o  Test procedure: compile with -O2. We specify a few options for a
  562.      shorter run: ./xbench -timegoal 3 >
  563.      results/name_of_your_linux_box.out. To get the xStones rating, we
  564.      must run an awk script; the simplest way is to type make
  565.      summary.ms. Check the summary.ms file: the xStone rating for your
  566.      system is in the last column of the line with your machine name
  567.      specified during the test.
  568.  
  569.   o  Results: an X performance figure in xStones.
  570.  
  571.   o  Note: this test, as it stands, is outdated. It should be re-coded.
  572.  
  573.   3.4.4.  UnixBench version 4.01:
  574.  
  575.  
  576.   o  What: measures overall Unix performance. This test will exercice
  577.      the file I/O and kernel multitasking performance.
  578.  
  579.   o  I have discarded all arithmetic test results, keeping only the
  580.      system-related test results.
  581.  
  582.   o  Test procedure: make with -O2. Execute with ./Run -1 (run each test
  583.      once). You will find the results in the ./results/report file.
  584.      Calculate the geometric mean of the EXECL THROUGHPUT, FILECOPY 1,
  585.      2, 3, PIPE THROUGHPUT, PIPE-BASED CONTEXT SWITCHING, PROCESS
  586.      CREATION, SHELL SCRIPTS and SYSTEM CALL OVERHEAD indexes.
  587.  
  588.   o  Results: a system index.
  589.  
  590.   3.4.5.  BYTE Magazine's BYTEmark benchmarks:
  591.  
  592.  
  593.   o  What: provides a good measure of CPU performance. Here is an
  594.      excerpt from the documentation: "These benchmarks are meant to
  595.      expose the theoretical upper limit of the CPU, FPU, and memory
  596.      architecture of a system. They cannot measure video, disk, or
  597.      network throughput (those are the domains of a different set of
  598.      benchmarks). You should, therefore, use the results of these tests
  599.      as part, not all, of any evaluation of a system."
  600.  
  601.   o  I have discarded the FPU test results since the Whetstone test is
  602.      just as representative of FPU performance.
  603.  
  604.   o  I have split the integer tests in two groups: those more
  605.      representative of memory-cache-CPU performance and the CPU integer
  606.      tests.
  607.  
  608.   o  Test procedure: make with -O2. Run the test with ./nbench >
  609.      myresults.dat or similar. Then, from myresults.dat, calculate
  610.      geometric mean of STRING SORT, ASSIGNMENT and BITFIELD test
  611.      indexes; this is the memory index; calculate the geometric mean of
  612.      NUMERIC SORT, IDEA, HUFFMAN and FP EMULATION test indexes; this is
  613.      the integer index.
  614.  
  615.   o  Results: a memory index and an integer index calculated as
  616.      explained above.
  617.  
  618.   3.5.  Possible improvements
  619.  
  620.  
  621.   The ideal benchmark suite would run in a few minutes, with synthetic
  622.   benchmarks testing every subsystem separately and applications
  623.   benchmarks providing results for different applications. It would also
  624.   automatically generate a complete report and eventually email the
  625.   report to a central database on the Web.
  626.  
  627.   We are not really interested in portability here, but it should at
  628.   least run on all recent (> 2.0.0) versions and flavours (i386, Alpha,
  629.   Sparc...) of Linux.
  630.  
  631.   If anybody has any idea about benchmarking network performance in a
  632.   simple, easy and reliable way, with a short (less than 30 minutes to
  633.   setup and run) test, please contact me.
  634.  
  635.   3.6.  LBT Report Form
  636.  
  637.  
  638.   Besides the tests, the benchmarking procedure would not be complete
  639.   without a form describing the setup, so here it is (following the
  640.   guidelines from comp.benchmarks.faq):
  641.  
  642.   ______________________________________________________________________
  643.   LINUX BENCHMARKING TOOLKIT REPORT FORM
  644.   ______________________________________________________________________
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.   ______________________________________________________________________
  662.   CPU
  663.   ==
  664.   Vendor:
  665.   Model:
  666.   Core clock:
  667.   Motherboard vendor:
  668.   Mbd. model:
  669.   Mbd. chipset:
  670.   Bus type:
  671.   Bus clock:
  672.   Cache total:
  673.   Cache type/speed:
  674.   SMP (number of processors):
  675.   ______________________________________________________________________
  676.  
  677.  
  678.  
  679.   ______________________________________________________________________
  680.   RAM
  681.   ====
  682.   Total:
  683.   Type:
  684.   Speed:
  685.   ______________________________________________________________________
  686.  
  687.  
  688.  
  689.   ______________________________________________________________________
  690.   Disk
  691.   ====
  692.   Vendor:
  693.   Model:
  694.   Size:
  695.   Interface:
  696.   Driver/Settings:
  697.   ______________________________________________________________________
  698.  
  699.  
  700.  
  701.   ______________________________________________________________________
  702.   Video board
  703.   ===========
  704.   Vendor:
  705.   Model:
  706.   Bus:
  707.   Video RAM type:
  708.   Video RAM total:
  709.   X server vendor:
  710.   X server version:
  711.   X server chipset choice:
  712.   Resolution/vert. refresh rate:
  713.   Color depth:
  714.   ______________________________________________________________________
  715.  
  716.  
  717.  
  718.   ______________________________________________________________________
  719.   Kernel
  720.   =====
  721.   Version:
  722.   Swap size:
  723.   ______________________________________________________________________
  724.  
  725.  
  726.  
  727.   ______________________________________________________________________
  728.   gcc
  729.   ===
  730.   Version:
  731.   Options:
  732.   libc version:
  733.   ______________________________________________________________________
  734.  
  735.  
  736.  
  737.   ______________________________________________________________________
  738.   Test notes
  739.   ==========
  740.   ______________________________________________________________________
  741.  
  742.  
  743.  
  744.   ______________________________________________________________________
  745.   RESULTS
  746.   ========
  747.   Linux kernel 2.0.0 Compilation Time: (minutes and seconds)
  748.   Whetstones: results are in MWIPS.
  749.   Xbench: results are in xstones.
  750.   Unixbench Benchmarks 4.01 system INDEX:
  751.   BYTEmark integer INDEX:
  752.   BYTEmark memory INDEX:
  753.   ______________________________________________________________________
  754.  
  755.  
  756.  
  757.   ______________________________________________________________________
  758.   Comments*
  759.   =========
  760.   * This field is included for possible interpretations of the results, and as
  761.   such, it is optional. It could be the most significant part of your report,
  762.   though, specially if you are doing comparative benchmarking.
  763.   ______________________________________________________________________
  764.  
  765.  
  766.  
  767.   3.7.  Network performance tests
  768.  
  769.  
  770.   Testing network performance is a challenging task since it involves at
  771.   least two machines, a server and a client machine, hence twice the
  772.   time to setup and many more variables to control, etc... On an
  773.   ethernet network, I guess your best bet would be the ttcp package. (to
  774.   be expanded)
  775.  
  776.   3.8.  SMP tests
  777.  
  778.  
  779.   SMP tests are another challenge, and any benchmark specifically
  780.   designed for SMP testing will have a hard time proving itself valid in
  781.   real-life settings, since algorithms that can take advantage of SMP
  782.   are hard to come by. It seems later versions of the Linux kernel (>
  783.   2.1.30 or around that) will do "fine-grained" multiprocessing, but I
  784.   have no more information than that for the moment.
  785.  
  786.   According to David Niemi, " ... shell8 [part of the Unixbench 4.01
  787.   benchmaks]does a good job at comparing similar hardware/OS in SMP and
  788.   UP modes."
  789.  
  790.  
  791.  
  792.  
  793.   4.  Example run and results
  794.  
  795.  
  796.   The LBT was run on my home machine, a Pentium-class Linux box that I
  797.   put together myself and that I used to write this HOWTO. Here is the
  798.   LBT Report Form for this system:
  799.  
  800.   LINUX BENCHMARKING TOOLKIT REPORT FORM
  801.  
  802.  
  803.  
  804.   CPU
  805.  
  806.  
  807.  
  808.   ==
  809.  
  810.  
  811.  
  812.   Vendor: Cyrix/IBM
  813.  
  814.  
  815.  
  816.   Model: 6x86L P166+
  817.  
  818.  
  819.  
  820.   Core clock: 133 MHz
  821.  
  822.  
  823.  
  824.   Motherboard vendor: Elite Computer Systems (ECS)
  825.  
  826.  
  827.  
  828.   Mbd. model: P5VX-Be
  829.  
  830.  
  831.  
  832.   Mbd. chipset: Intel VX
  833.  
  834.  
  835.  
  836.   Bus type: PCI
  837.  
  838.  
  839.  
  840.   Bus clock: 33 MHz
  841.  
  842.  
  843.  
  844.   Cache total: 256 KB
  845.  
  846.  
  847.  
  848.   Cache type/speed: Pipeline burst 6 ns
  849.  
  850.  
  851.  
  852.   SMP (number of processors): 1
  853.  
  854.  
  855.  
  856.   RAM
  857.  
  858.  
  859.   ====
  860.  
  861.  
  862.  
  863.   Total: 32 MB
  864.  
  865.  
  866.  
  867.   Type: EDO SIMMs
  868.  
  869.  
  870.  
  871.   Speed: 60 ns
  872.  
  873.  
  874.  
  875.   Disk
  876.  
  877.  
  878.  
  879.   ====
  880.  
  881.  
  882.  
  883.   Vendor: IBM
  884.  
  885.  
  886.  
  887.   Model: IBM-DAQA-33240
  888.  
  889.  
  890.  
  891.   Size: 3.2 GB
  892.  
  893.  
  894.  
  895.   Interface: EIDE
  896.  
  897.  
  898.  
  899.   Driver/Settings: Bus Master DMA mode 2
  900.  
  901.  
  902.  
  903.   Video board
  904.  
  905.  
  906.  
  907.   ===========
  908.  
  909.  
  910.  
  911.   Vendor: Generic S3
  912.  
  913.  
  914.  
  915.   Model: Trio64-V2
  916.  
  917.  
  918.  
  919.   Bus: PCI
  920.  
  921.  
  922.  
  923.   Video RAM type: EDO DRAM
  924.  
  925.   Video RAM total: 2 MB
  926.  
  927.  
  928.  
  929.   X server vendor: XFree86
  930.  
  931.  
  932.  
  933.   X server version: 3.3
  934.  
  935.  
  936.  
  937.   X server chipset choice: S3 accelerated
  938.  
  939.  
  940.  
  941.   Resolution/vert. refresh rate: 1152x864 @ 70 Hz
  942.  
  943.  
  944.  
  945.   Color depth: 16 bits
  946.  
  947.  
  948.  
  949.   Kernel
  950.  
  951.  
  952.  
  953.   =====
  954.  
  955.  
  956.  
  957.   Version: 2.0.29
  958.  
  959.  
  960.  
  961.   Swap size: 64 MB
  962.  
  963.  
  964.  
  965.   gcc
  966.  
  967.  
  968.  
  969.   ===
  970.  
  971.  
  972.  
  973.   Version: 2.7.2.1
  974.  
  975.  
  976.  
  977.   Options: -O2
  978.  
  979.  
  980.  
  981.   libc version: 5.4.23
  982.  
  983.  
  984.  
  985.   Test notes
  986.  
  987.  
  988.  
  989.   ==========
  990.  
  991.   Very light load. The above tests were run with some of the special
  992.   Cyrix/IBM 6x86 features enabled with the setx86 program: fast ADS,
  993.   fast IORT, Enable DTE, fast LOOP, fast Lin. VidMem.
  994.  
  995.  
  996.  
  997.   RESULTS
  998.  
  999.  
  1000.  
  1001.   ========
  1002.  
  1003.  
  1004.  
  1005.   Linux kernel 2.0.0 Compilation Time: 7m12s
  1006.  
  1007.  
  1008.  
  1009.   Whetstones: 38.169 MWIPS.
  1010.  
  1011.  
  1012.  
  1013.   Xbench: 97243 xStones.
  1014.  
  1015.  
  1016.  
  1017.   BYTE Unix Benchmarks 4.01 system INDEX: 58.43
  1018.  
  1019.  
  1020.  
  1021.   BYTEmark integer INDEX: 1.50
  1022.  
  1023.  
  1024.  
  1025.   BYTEmark memory INDEX: 2.50
  1026.  
  1027.  
  1028.  
  1029.   Comments
  1030.  
  1031.  
  1032.  
  1033.   =========
  1034.  
  1035.  
  1036.  
  1037.   This is a very stable system with homogeneous performance, ideal
  1038.   for home use and/or Linux development. I will report results
  1039.   with a 6x86MX processor as soon as I can get my hands on one!
  1040.  
  1041.  
  1042.  
  1043.   5.  Pitfalls and caveats of benchmarking
  1044.  
  1045.  
  1046.   After putting together this HOWTO I began to understand why the words
  1047.   "pitfalls" and "caveats" are so often associated with benchmarking...
  1048.  
  1049.   5.1.  Comparing apples and oranges
  1050.  
  1051.  
  1052.   Or should I say Apples and PCs ? This is so obvious and such an old
  1053.   dispute that I won't go into any details. I doubt the time it takes to
  1054.   load Word on a Mac compared to an average Pentium is a real measure of
  1055.   anything. Likewise booting Linux and Windows NT, etc... Try as much as
  1056.   possible to compare identical machines with a single modification.
  1057.   5.2.  Incomplete information
  1058.  
  1059.  
  1060.   A single example will illustrate this very common mistake. One often
  1061.   reads in comp.os.linux.hardware the following or similar statement: "I
  1062.   just plugged in processor XYZ running at nnn MHz and now compiling the
  1063.   linux kernel only takes i minutes" (adjust XYZ, nnn and i as
  1064.   required). This is irritating, because no other information is given,
  1065.   i.e. we don't even know the amount of RAM, size of swap, other tasks
  1066.   running simultaneously, kernel version, modules selected, hard disk
  1067.   type, gcc version, etc... I recommend you use the LBT Report Form,
  1068.   which at least provides a standard information framework.
  1069.  
  1070.   5.3.  Proprietary hardware/software
  1071.  
  1072.  
  1073.   A well-known processor manufacturer once published results of
  1074.   benchmarks produced by a special, customized version of gcc. Ethical
  1075.   considerations apart, those results were meaningless, since 100% of
  1076.   the Linux community would go on using the standard version of gcc. The
  1077.   same goes for proprietary hardware. Benchmarking is much more useful
  1078.   when it deals with off-the-shelf hardware and free (in the GNU/GPL
  1079.   sense) software.
  1080.  
  1081.   5.4.  Relevance
  1082.  
  1083.  
  1084.   We are talking Linux, right ? So we should forget about benchmarks
  1085.   produced on other operating systems (this is a special case of the
  1086.   "Comparing apples and oranges" pitfall above). Also, if one is going
  1087.   to benchmark Web server performance, do not quote FPU performance and
  1088.   other irrelevant information. In such cases, less is more. Also, you
  1089.   do not need to mention the age of your cat, your mood while
  1090.   benchmarking, etc..
  1091.  
  1092.   6.  FAQ
  1093.  
  1094.  
  1095.      Q1.
  1096.         Is there any single figure of merit for Linux systems ?
  1097.  
  1098.      A: No, thankfully nobody has yet come up with a Lhinuxstone (tm)
  1099.         measurement. And if there was one, it would not make much sense:
  1100.         Linux systems are used for many different tasks, from heavily
  1101.         loaded Web servers to graphics workstations for individual use.
  1102.         No single figure of merit can describe the performance of a
  1103.         Linux system under such different situations.
  1104.  
  1105.      Q2.
  1106.         Then, how about a dozen figures summarizing the performance of
  1107.         diverse Linux systems ?
  1108.  
  1109.      A: That would be the ideal situation. I would like to see that come
  1110.         true. Anybody volunteers for a Linux Benchmarking Project ? With
  1111.         a Web site and an on-line, complete, well-designed reports
  1112.         database ?
  1113.  
  1114.      Q3.
  1115.         ... BogoMips ... ?
  1116.  
  1117.      A: BogoMips has nothing to do with the performance of your system.
  1118.         Check the BogoMips Mini-HOWTO.
  1119.  
  1120.      Q4.
  1121.         What is the "best" benchmark for Linux ?
  1122.  
  1123.      A: It all depends on which performance aspect of a Linux system one
  1124.         wants to measure. There are different benchmarks to measure the
  1125.         network (Ethernet sustained transfer rates), file server (NFS),
  1126.         disk I/O, FPU, integer, graphics, 3D, processor-memory
  1127.         bandwidth, CAD performance, transaction time, SQL performance,
  1128.         Web server performance, real-time performance, CD-ROM
  1129.         performance, Quake performance (!), etc ... AFAIK no bechmark
  1130.         suite exists for Linux that supports all these tests.
  1131.  
  1132.      Q5.
  1133.         What is the fastest processor under Linux ?
  1134.  
  1135.      A: Fastest at what task ? If one is heavily number-crunching
  1136.         oriented, a very high clock rate Alpha (600 MHz and going)
  1137.         should be faster than anything else, since Alphas have been
  1138.         designed for that kind of performance. If, on the other hand,
  1139.         one wants to put together a very fast news server, it is
  1140.         probable that the choice of a fast hard disk subsystem and lots
  1141.         of RAM will result in higher performance improvements than a
  1142.         change of processor, for the same amount of $.
  1143.  
  1144.      Q6.
  1145.         Let me rephrase the last question, then: is there a processor
  1146.         that is fastest for general purpose applications ?
  1147.  
  1148.      A: This is a tricky question but it takes a very simple answer: NO.
  1149.         One can always design a faster system even for general purpose
  1150.         applications, independent of the processor. Usually, all other
  1151.         things being equal, higher clock rates will result in higher
  1152.         performance systems (and more headaches too). Taking out an old
  1153.         100 MHz Pentium from an (usually not) upgradable motherboard,
  1154.         and plugging in the 200 MHz version, one should feel the extra
  1155.         "hummph". Of course, with only 16 MBytes of RAM, the same
  1156.         investment would have been more wisely spent on extra SIMMs...
  1157.  
  1158.      Q7.
  1159.         So clock rates influence the performance of a system ?
  1160.  
  1161.      A: For most tasks except for NOP empty loops (BTW these get removed
  1162.         by modern optimizing compilers), an increase in clock rate will
  1163.         not give you a linear increase in performance. Very small
  1164.         processor intensive programs that will fit entirely in the
  1165.         primary cache inside the processor (the L1 cache, usually 8 or
  1166.         16 K) will have a performance increase equivalent to the clock
  1167.         rate increase, but most "true" programs are much larger than
  1168.         that, have loops that do not fit in the L1 cache, share the L2
  1169.         (external) cache with other processes, depend on external
  1170.         components and will give much smaller performance increases.
  1171.         This is because the L1 cache runs at the same clock rate as the
  1172.         processor, whereas most L2 caches and all other subsystems
  1173.         (DRAM, for example) will run asynchronously at lower clock
  1174.         rates.
  1175.  
  1176.      Q8.
  1177.         OK, then, one last question on that matter: which is the
  1178.         processor with the best price/performance ratio for general
  1179.         purpose Linux use ?
  1180.  
  1181.      A: Defining "general purpose Linux use" in not an easy thing ! For
  1182.         any particular application, there is always a processor with THE
  1183.         BEST price/performance ratio at any given time, but it changes
  1184.         rather frequently as manufacturers release new processors, so
  1185.         answering Processor XYZ running at n MHz would be a snapshot
  1186.         answer. However, the price of the processor is insignificant
  1187.         when compared to the price of the whole system one will be
  1188.         putting together. So, really, the question should be how can one
  1189.         maximize the price/performance ratio for a given system ? And
  1190.         the answer to that question depends heavily on the minimum
  1191.         performance requirements and/or maximum cost established for the
  1192.         configuration being considered. Sometimes, off-the-shelf
  1193.         hardware will not meet minimum performance requirements and
  1194.         expensive RISC systems will be the only alternative. For home
  1195.         use, I recommend a balanced, homogeneous system for overall
  1196.         performance (now go figure what I mean by balanced and
  1197.         homogeneous :-); the choice of a processor is an important
  1198.         decision , but no more than choosing hard disk type and
  1199.         capacity, amount of RAM, video card, etc...
  1200.  
  1201.      Q9.
  1202.         What is a "significant" increase in performance ?
  1203.  
  1204.      A: I would say that anything under 1% is not significant (could be
  1205.         described as "marginal"). We, humans, will hardly perceive the
  1206.         difference between two systems with a 5 % difference in response
  1207.         time. Of course some hard-core benchmarkers are not humans and
  1208.         will tell you that, when comparing systems with 65.9 and 66.5
  1209.         performance indexes, the later is "definitely faster".
  1210.  
  1211.      Q10.
  1212.         How do I obtain "significant" increases in performance at the
  1213.         lowest cost ?
  1214.  
  1215.      A: Since most source code is available for Linux, careful
  1216.         examination and algorithmic redesign of key subroutines could
  1217.         yield order-of-magnitude increases in performance in some cases.
  1218.         If one is dealing with a commercial project and does not wish to
  1219.         delve deeply in C source code a Linux consultant should be
  1220.         called in. See the Consultants-HOWTO.
  1221.  
  1222.  
  1223.   7.  Copyright, acknowledgments and miscellaneous
  1224.  
  1225.  
  1226.   7.1.  How this document was produced
  1227.  
  1228.  
  1229.   The first step was reading section 4 "Writing and submitting a HOWTO"
  1230.   of the HOWTO Index by Tim Bynum.
  1231.  
  1232.   I knew absolutely nothing about SGML or LaTeX, but was tempted to use
  1233.   an automated documentation generation package after reading the
  1234.   various comments about SGML-Tools. However, inserting tags manually in
  1235.   a document reminds me of the days I hand-assembled a 512 byte monitor
  1236.   program for a now defunct 8-bit microprocessor, so I got hold of the
  1237.   LyX sources, compiled it, and used its LinuxDoc mode. Highly
  1238.   recommended combination: LyX and SGML-Tools.
  1239.  
  1240.   7.2.  Copyright
  1241.  
  1242.  
  1243.   The Linux Benchmarking HOWTO is copyright (C) 1997 by Andr D. Balsa.
  1244.   Linux HOWTO documents may be reproduced and distributed in whole or in
  1245.   part, in any medium physical or electronic, as long as this copyright
  1246.   notice is retained on all copies. Commercial redistribution is allowed
  1247.   and encouraged; however, the author would like to be notified of any
  1248.   such distributions.
  1249.  
  1250.   All translations, derivative works, or aggregate works incorporating
  1251.   any Linux HOWTO documents must be covered under this copyright notice.
  1252.   That is, you may not produce a derivative work from a HOWTO and impose
  1253.   additional restrictions on its distribution. Exceptions to these rules
  1254.   may be granted under certain conditions; please contact the Linux
  1255.   HOWTO coordinator at the address given below.
  1256.  
  1257.   In short, we wish to promote dissemination of this information through
  1258.   as many channels as possible. However, we do wish to retain copyright
  1259.   on the HOWTO documents, and would like to be notified of any plans to
  1260.   redistribute the HOWTOs.
  1261.  
  1262.   If you have questions, please contact Tim Bynum, the Linux HOWTO
  1263.   coordinator, at linux-howto@sunsite.unc.edu via email.
  1264.  
  1265.   7.3.  New versions of this document
  1266.  
  1267.  
  1268.   New versions of the Linux Benchmarking-HOWTO will be placed on
  1269.   sunsite.unc.edu and mirror sites. There are other formats, such as a
  1270.   Postscript and dvi version in the other-formats directory. The Linux
  1271.   Benchmarking-HOWTO is also available for WWW clients such as Grail, a
  1272.   Web browser written in Python. It will also be posted regularly to
  1273.   comp.os.linux.answers.
  1274.  
  1275.   7.4.  Feedback
  1276.  
  1277.  
  1278.   Suggestions, corrections, additions wanted. Contributors wanted and
  1279.   acknowledged. Flames not wanted.
  1280.  
  1281.   I can always be reached at andrewbalsa@usa.net.
  1282.  
  1283.   7.5.  Acknowledgments
  1284.  
  1285.  
  1286.   David Niemi, the author of the Unixbench suite, has proved to be an
  1287.   endless source of information and (valid) criticism.
  1288.  
  1289.   I also want to thank Greg Hankins one of the main contributors to the
  1290.   SGML-tools package, Linus Torvalds and the entire Linux community.
  1291.   This HOWTO is my way of giving back.
  1292.  
  1293.   7.6.  Disclaimer
  1294.  
  1295.  
  1296.   Your mileage may, and will, vary. Be aware that benchmarking is a
  1297.   touchy subject and a great time-and-energy consuming activity.
  1298.  
  1299.   7.7.  Trademarks
  1300.  
  1301.  
  1302.   Pentium and Windows NT are trademarks of Intel and Microsoft
  1303.   Corporations respectively.
  1304.  
  1305.   BYTE and BYTEmark are trademarks of McGraw-Hill, Inc.
  1306.  
  1307.   Cyrix and 6x86 are trademarks of Cyrix Corporation.
  1308.  
  1309.   Linux is not a trademark, hopefully never will be.
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.