# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" "POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: Title = #: documentation/content/en/books/developers-handbook/testing/_index.adoc:1 #: documentation/content/en/books/developers-handbook/testing/_index.adoc:15 #, no-wrap msgid "Regression and Performance Testing" msgstr "" #. type: YAML Front Matter: title #: documentation/content/en/books/developers-handbook/testing/_index.adoc:1 #, no-wrap msgid "Chapter 6. Regression and Performance Testing" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:53 msgid "" "Regression tests are used to exercise a particular bit of the system to " "check that it works as expected, and to make sure that old bugs are not " "reintroduced." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:55 msgid "" "The FreeBSD regression testing tools can be found in the FreeBSD source tree " "in the directory [.filename]#src/tools/regression#." msgstr "" #. type: Title == #: documentation/content/en/books/developers-handbook/testing/_index.adoc:57 #, no-wrap msgid "Micro Benchmark Checklist" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:60 msgid "" "This section contains hints for doing proper micro-benchmarking on FreeBSD " "or of FreeBSD itself." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:62 msgid "" "It is not possible to use all of the suggestions below every single time, " "but the more used, the better the benchmark's ability to test small " "differences will be." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:64 msgid "Disable APM and any other kind of clock fiddling (ACPI ?)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:65 msgid "" "Run in single user mode. E.g., man:cron[8], and other daemons only add " "noise. The man:sshd[8] daemon can also cause problems. If ssh access is " "required during testing either disable the SSHv1 key regeneration, or kill " "the parent `sshd` daemon during the tests." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:66 msgid "Do not run man:ntpd[8]." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:67 msgid "" "If man:syslog[3] events are generated, run man:syslogd[8] with an empty " "[.filename]#/etc/syslogd.conf#, otherwise, do not run it." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:68 msgid "Minimize disk-I/O, avoid it entirely if possible." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:69 msgid "Do not mount file systems that are not needed." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:70 msgid "" "Mount [.filename]#/#, [.filename]#/usr#, and any other file system as read-" "only if possible. This removes atime updates to disk (etc.) from the I/O " "picture." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:71 msgid "" "Reinitialize the read/write test file system with man:newfs[8] and populate " "it from a man:tar[1] or man:dump[8] file before every run. Unmount and mount " "it before starting the test. This results in a consistent file system " "layout. For a worldstone test this would apply to [.filename]#/usr/obj# " "(just reinitialize with `newfs` and mount). To get 100% reproducibility, " "populate the file system from a man:dd[1] file (i.e.: `dd if=myimage of=/dev/" "ad0s1h bs=1m`)" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:72 msgid "Use malloc backed or preloaded man:md[4] partitions." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:73 msgid "" "Reboot between individual iterations of the test, this gives a more " "consistent state." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:74 msgid "" "Remove all non-essential device drivers from the kernel. For instance if USB " "is not needed for the test, do not put USB in the kernel. Drivers which " "attach often have timeouts ticking away." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:75 msgid "" "Unconfigure hardware that are not in use. Detach disks with " "man:atacontrol[8] and man:camcontrol[8] if the disks are not used for the " "test." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:76 msgid "" "Do not configure the network unless it is being tested, or wait until after " "the test has been performed to ship the results off to another computer." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:78 msgid "" "Disable \"Turbo-modes\" because they make the clock frequency explicitly " "depend on the environment. This means that benchmark runs on 100% identical " "code, may depend on time of day, coffee vs. soda or even how many other " "people are in the office." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:80 msgid "" "If the system must be connected to a public network, watch out for spikes of " "broadcast traffic. Even though it is hardly noticeable, it will take up CPU " "cycles. Multicast has similar caveats." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:81 msgid "" "Put each file system on its own disk. This minimizes jitter from head-seek " "optimizations." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:82 msgid "" "Minimize output to serial or VGA consoles. Running output into files gives " "less jitter. (Serial consoles easily become a bottleneck.) Do not touch " "keyboard while the test is running, even kbd:[space] or kbd:[back-space] " "shows up in the numbers." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:83 msgid "" "Make sure the test is long enough, but not too long. If the test is too " "short, timestamping is a problem. If it is too long temperature changes and " "drift will affect the frequency of the quartz crystals in the computer. Rule " "of thumb: more than a minute, less than an hour." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:84 msgid "" "Try to keep the temperature as stable as possible around the machine. This " "affects both quartz crystals and disk drive algorithms. To get real stable " "clock, consider stabilized clock injection. E.g., get a OCXO + PLL, inject " "output into clock circuits instead of motherboard xtal. Contact {phk} for " "more information about this." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:85 msgid "" "Run the test at least 3 times but it is better to run more than 20 times " "both for \"before\" and \"after\" code. Try to interleave if possible (i.e.: " "do not run 20 times before then 20 times after), this makes it possible to " "spot environmental effects. Do not interleave 1:1, but 3:3, this makes it " "possible to spot interaction effects." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:88 msgid "" "A good pattern is: `bababa{bbbaaa}*`. This gives hint after the first 1+1 " "runs (so it is possible to stop the test if it goes entirely the wrong way), " "a standard deviation after the first 3+3 (gives a good indication if it is " "going to be worth a long run) and trending and interaction numbers later on." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:89 msgid "" "Use man:ministat[1] to see if the numbers are significant. Consider buying " "\"Cartoon guide to statistics\" ISBN: 0062731025, highly recommended, if you " "have forgotten or never learned about standard deviation and Student's T." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:90 msgid "" "Do not use background man:fsck[8] unless the test is a benchmark of " "background `fsck`. Also, disable `background_fsck` in [.filename]#/etc/" "rc.conf# unless the benchmark is not started at least 60+\"``fsck`` " "runtime\" seconds after the boot, as man:rc[8] wakes up and checks if `fsck` " "needs to run on any file systems when background `fsck` is enabled. " "Likewise, make sure there are no snapshots lying around unless the benchmark " "is a test with snapshots." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:91 msgid "" "If the benchmark show unexpected bad performance, check for things like high " "interrupt volume from an unexpected source. Some versions of ACPI have been " "reported to \"misbehave\" and generate excess interrupts. To help diagnose " "odd test results, take a few snapshots of `vmstat -i` and look for anything " "unusual." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:92 msgid "" "Make sure to be careful about optimization parameters for kernel and " "userspace, likewise debugging. It is easy to let something slip through and " "realize later the test was not comparing the same thing." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:93 msgid "" "Do not ever benchmark with the `WITNESS` and `INVARIANTS` kernel options " "enabled unless the test is interested to benchmarking those features. " "`WITNESS` can cause 400%+ drops in performance. Likewise, userspace " "man:malloc[3] parameters default differently in -CURRENT from the way they " "ship in production releases." msgstr "" #. type: Title == #: documentation/content/en/books/developers-handbook/testing/_index.adoc:95 #, no-wrap msgid "The FreeBSD Source Tinderbox" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:98 msgid "The source Tinderbox consists of:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:100 msgid "" "A build script, [.filename]#tinderbox#, that automates checking out a " "specific version of the FreeBSD source tree and building it." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:101 msgid "" "A supervisor script, [.filename]#tbmaster#, that monitors individual " "Tinderbox instances, logs their output, and emails failure notices." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:102 msgid "" "A CGI script named [.filename]#index.cgi# that reads a set of tbmaster logs " "and presents an easy-to-read HTML summary of them." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:103 msgid "" "A set of build servers that continually test the tip of the most important " "FreeBSD code branches." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:104 msgid "" "A webserver that keeps a complete set of Tinderbox logs and displays an up-" "to-date summary." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:107 msgid "" "The scripts are maintained and were developed by {des}, and are now written " "in Perl, a move on from their original incarnation as shell scripts. All " "scripts and configuration files are kept in https://www.freebsd.org/cgi/" "cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/]." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:109 msgid "" "For more information about the tinderbox and tbmaster scripts at this stage, " "see their respective man pages: tinderbox(1) and tbmaster(1)." msgstr "" #. type: Title == #: documentation/content/en/books/developers-handbook/testing/_index.adoc:110 #, no-wrap msgid "The index.cgi Script" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:117 msgid "" "The [.filename]#index.cgi# script generates the HTML summary of tinderbox " "and tbmaster logs. Although originally intended to be used as a CGI script, " "as indicated by its name, this script can also be run from the command line " "or from a man:cron[8] job, in which case it will look for logs in the " "directory where the script is located. It will automatically detect " "context, generating HTTP headers when it is run as a CGI script. It " "conforms to XHTML standards and is styled using CSS." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:120 msgid "" "The script starts in the `main()` block by attempting to verify that it is " "running on the official Tinderbox website. If it is not, a page indicating " "it is not an official website is produced, and a URL to the official site is " "provided." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:123 msgid "" "Next, it scans the log directory to get an inventory of configurations, " "branches and architectures for which log files exist, to avoid hard-coding a " "list into the script and potentially ending up with blank rows or columns. " "This information is derived from the names of the log files matching the " "following pattern:" msgstr "" #. type: delimited block . 4 #: documentation/content/en/books/developers-handbook/testing/_index.adoc:127 #, no-wrap msgid "tinderbox-$config-$branch-$arch-$machine.{brief,full}\n" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:131 msgid "" "The configurations used on the official Tinderbox build servers are named " "for the branches they build. For example, the `releng_8` configuration is " "used to build `RELENG_8` as well as all still-supported release branches." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:133 msgid "" "Once all of this startup procedure has been successfully completed, " "`do_config()` is called for each configuration." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:135 msgid "" "The `do_config()` function generates HTML for a single Tinderbox " "configuration." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:138 msgid "" "It works by first generating a header row, then iterating over each branch " "build with the specified configuration, producing a single row of results " "for each in the following manner:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:140 msgid "For each item:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:142 msgid "For each machine within that architecture:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:144 msgid "If a brief log file exists, then:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:146 msgid "Call `success()` to determine the outcome of the build." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:147 msgid "Output the modification size." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:148 msgid "" "Output the size of the brief log file with a link to the log file itself." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:149 msgid "If a full log file also exists, then:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:151 msgid "" "Output the size of the full log file with a link to the log file itself." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:153 msgid "Otherwise:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:155 msgid "No output." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:157 msgid "" "The `success()` function mentioned above scans a brief log file for the " "string \"tinderbox run completed\" in order to determine whether the build " "was successful." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:160 msgid "" "Configurations and branches are sorted according to their branch rank. This " "is computed as follows:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:162 msgid "`HEAD` and `CURRENT` have rank 9999." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:163 msgid "`RELENG_x` has rank __``xx``__99." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:164 msgid "`RELENG_x_y` has rank _xxyy_." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:167 msgid "" "This means that `HEAD` always ranks highest, and `RELENG` branches are " "ranked in numerical order, with each `STABLE` branch ranking higher than the " "release branches forked off of it. For instance, for FreeBSD 8, the order " "from highest to lowest would be:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:169 msgid "`RELENG_8` (branch rank 899)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:170 msgid "`RELENG_8_3` (branch rank 803)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:171 msgid "`RELENG_8_2` (branch rank 802)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:172 msgid "`RELENG_8_1` (branch rank 801)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:173 msgid "`RELENG_8_0` (branch rank 800)." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:177 msgid "" "The colors that Tinderbox uses for each cell in the table are defined by " "CSS. Successful builds are displayed with green text; unsuccessful builds " "are displayed with red text. The color fades as time passes since the " "corresponding build, with every half an hour bringing the color closer to " "grey." msgstr "" #. type: Title == #: documentation/content/en/books/developers-handbook/testing/_index.adoc:178 #, no-wrap msgid "Official Build Servers" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:181 msgid "" "The official Tinderbox build servers are hosted by http://" "www.sentex.ca[Sentex Data Communications], who also host the FreeBSD Netperf " "Cluster." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:183 msgid "Three build servers currently exist:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:185 msgid "_freebsd-current.sentex.ca_ builds:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:187 msgid "" "`HEAD` for amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64, and " "sparc64." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:188 msgid "" "`RELENG_9` and supported 9._X_ branches for amd64, arm, i386, i386/pc98, " "ia64, mips, powerpc, powerpc64, and sparc64." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:190 msgid "_freebsd-stable.sentex.ca_ builds:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:192 msgid "" "`RELENG_8` and supported 8._X_ branches for amd64, i386, i386/pc98, ia64, " "mips, powerpc and sparc64." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:194 msgid "_freebsd-legacy.sentex.ca_ builds:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:196 msgid "" "`RELENG_7` and supported 7._X_ branches for amd64, i386, i386/pc98, ia64, " "powerpc, and sparc64." msgstr "" #. type: Title == #: documentation/content/en/books/developers-handbook/testing/_index.adoc:197 #, no-wrap msgid "Official Summary Site" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:200 msgid "" "Summaries and logs from the official build servers are available online at " "http://tinderbox.FreeBSD.org[http://tinderbox.FreeBSD.org], hosted by {des} " "and set up as follows:" msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:202 msgid "" "A man:cron[8] job checks the build servers at regular intervals and " "downloads any new log files using man:rsync[1]." msgstr "" #. type: Plain text #: documentation/content/en/books/developers-handbook/testing/_index.adoc:202 msgid "Apache is set up to use [.filename]#index.cgi# as `DirectoryIndex`." msgstr ""