This version starts the re-write of Bonnie++! I will make it totally threaded (the new code does not use fork()). It will also support testing with a specified number of threads doing the same test, this will allow you to really thrash those RAID arrays!

  • bonnie++-2.00a.tgz – fixed a column assignment issue in bon_csv2html and called it 2.00a because 1.9x hasn’t changed much for years and because I stuffed up the first release of 2.00.
  • bonnie++-1.98.tgz – Allow specifying the number of random seeks and the number of seeker processes and store that in the CSV (for testing NVMe). Changed the text output to use KiB/MiB/GiB as units of measurement so we can fit NVMe results on screen.
  • bonnie++-1.97.3.tgz – man page fixes, fixed symlink test, and CSS fix for bon_csv2html.
  • bonnie++-1.97.2.tgz – make it build with GCC-6 and fix some Debian bugs.
  • bonnie++-1.97.tgz – fixed a bunch of bugs including bad CSV output.
  • bonnie++-1.96.tgz – fixed a bunch of bugs and got the colors working correctly in the HTML output.
  • bonnie++-1.95.tgz – support direct IO and made some changes to the build process (including dropping NT and OS/2 support).
  • bonnie++-1.94.tgz – major improvements to zcav.
  • bonnie++-1.93d.tgz – added write support to ZCAV.
  • bonnie++-1.93c.tgz – added support for GCC 3.2.
  • bonnie++-1.93b.tgz – version 1.93b. Fixed an error in calculating seek time and added support for large numbers of directories for the file creation tests.
  • bonnie++-1.93a.tgz – version 1.93a. Better support of NT, better RPM packaging code, and a minor warning fix.
  • bonnie++-1.93.tgz – version 1.93. Added a new test program for per-char IO for the people on the linux-kernel mailing list. ;)
  • bonnie++1.92b.tgz – version 1.92b. Fixed a bunch of bugs in the random seed selection code.
  • bonnie++1.92a.tgz – version 1.92a. Added support for setting the seed for random numbers and fixed a few bugs.
  • bonnie++1.92.tgz – version 1.92. Changed the code to do per-char tests with read() and write() instead. Now reports much lower results for those tests which are more useful IMHO.
  • bonnie++1.91c.tgz – version 1.91c, it now compiles with namespace support in GCC 3.0 and fixed some minor bugs.
  • bonnie++1.91b.tgz – version 1.91b
  • bonnie++1.91a.tgz – version 1.91a, fixed zcav properly and fixed a bunch of minor bugs in Bonnie++.
  • bonnie++1.91.tgz – version 1.91, fixes all known bugs in the 1.90 series.
  • bonnie++1.90g.tgz – version 1.90g, now latency works properly and always gets parsed properly. Changed the -f option to allow tests of per-char IO for small amounts of data.
  • bonnie++1.90f.tgz – version 1.90f, more work on latency in bonnie++ and some slight changes for OS/2 and NT portability.
  • bonnie++1.90e.tgz – version 1.90e, better OS/2 and NT support.
  • bonnie++1.90d.tgz – version 1.90d, contains code from the OS/2 and NT ports, may break things for some versions of UNIX.
  • bonnie++1.90c.tgz – version 1.90c, produces better web pages (full color) with bon_csv2html.
  • bonnie++1.90b.tgz – version 1.90b, adds support for measuring latency.
  • bonnie++1.90a.tgz – version 1.90a, adds basic threading, changes the format of the CSV files, and updates the programs for managing CSV files (and the man pages).

12 comments to Bonnie++

  • Stephane VIUSA

    Hello Russel,

    I’m using bonnie to compare two kind of storage today (ceph and nfs) and I’m a bit confuse with the result and try do understand what is metered on latency.
    is latency taken from start/end of transaction, I/O?



  • Latency is the worse of all times taken for an operation.

  • Attilio Signorini

    “Latency is the worse of all times taken for an operation.”

    That explain my concerns :) It would be really cool to have the average too

    BTW: we have compiled it for AIX, I will send you some details of what we did it to make it works

  • Thomas Preston

    Hi Russel,
    We’re using Bonnie++ to test I/O for a client. Do you track it with version control anywhere? We’d like to help out tidying it up. We’d usually suggest GitLab or GitHub.


  • Edwin B Olson

    I believe there’s a stray colon in bonnie.cpp in the getopt string that causes -f args to fail.

    while(-1 != (int_c = getopt(argc, argv, “bc:d:f::g:l:m:n:p:qr:s:u:x:y:z:Z:”

    should be (note after the letter ‘f’)

    while(-1 != (int_c = getopt(argc, argv, “bc:d:f:g:l:m:n:p:qr:s:u:x:y:z:Z:”

  • Michael

    Hi Russell,
    Is there somewhere to report bugs in Bonnie++?
    There’s a bad one with the /sec output in file create test.

  • Borja


    I have updated bonnie++ to 1.98 (running on FreeBSD) and I have noticed something odd.

    Version 1.98 ——Sequential Create—— ——–Random Create——–
    micro1 -Create– –Read— -Delete– -Create– –Read— -Delete–
    files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
    16 22767.979448 84 +++++ +++ 31118.948802 98 +++++ +++ +++++ +++ +++++ +++
    Latency 98472us 211us 245us 2040us 216us 247us

    The lower case “m” is a prefix for “milli”, that is, 10^-6. The correct prefixes for “kilo”, “mega” and “giga” are upper case letters. K, M, and G. I would suggest a simple change.

  • Geoff Gibbs

    I just looked at version 1.98 and the CSV output does not match the man page(s). Can you tell me what the differences are, or just let me know what each value is?



  • I have a huge list of (still) interesting results from 1.97. How can they be compared to newer results from 1.98?

  • Scott S.

    Hey Russell,

    “Do you track it with version control anywhere? We’d like to help out tidying it up. We’d usually suggest GitLab or GitHub.” – my thoughts too, please let me know.

  • db

    The man page for bonnie++ is quite unclear for what default values that are used when certain switches are left unspecified:


    -n the number of files for the file creation test. This is measured
    in multiples of 1024 files. This is because no-one will want to
    test less than 1024 files, and we need the extra space on
    braille displays.

    If the specified number is 0 then this test will be skipped.

    The default for this test is to test with 0 byte files. To use
    files of other sizes you can specify number:max:min:num-directo-
    ries:chunk-size where max is the maximum size and min is the
    minimum size (both default to 0 if not specified). If minimum
    and maximum sizes are specified then every file will have a ran-
    dom size from the range min..max inclusive. If you specify a
    number of directories then the files will be evenly distributed
    amoung that many sub-directories.

    Is the default value 1 multiple of 1024 files?

    Min/max filesize is 0 bytes. Directories is 1?

    Chunk size is..?

    Furthermore, this syntax is rather, unnecessary, complicated. Excerpt from the “short” help

    [-n number-to-stat[:max-size[:min-size][:num-directories[:chunk-size]]]]

    What would you enter if you wanted to use the default values fore everything but num-directories?

    Thank you

  • Piet Huysma

    Doesn’t compile with gcc-11:

    x86_64-pc-linux-gnu-g++ -Wl,-O1 -Wl,–as-needed generate_randfile.o -o generate_randfile
    bon_csv2html.cpp: In function ‘int main(int, char**)’:
    bon_csv2html.cpp:90:23: error: reference to ‘data’ is ambiguous
    90 | props = new PPCCHAR[data.size()];
    | ^~~~

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>