[{"data":1,"prerenderedAt":997},["ShallowReactive",2],{"navigation":3,"/docs/benchmarks/testing-from-another-machine":96,"/docs/benchmarks/testing-from-another-machine-surround":992},[4],{"title":5,"path":6,"stem":7,"children":8,"page":59},"Docs","/docs","docs",[9,25,41,60,80,88],{"title":10,"path":11,"stem":12,"children":13,"icon":24},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[14,16,20],{"title":15,"path":11,"stem":12},"Introduction",{"title":17,"path":18,"stem":19},"Quick start","/docs/getting-started/quick-start","docs/1.getting-started/2.quick-start",{"title":21,"path":22,"stem":23},"Running from source","/docs/getting-started/running-from-source","docs/1.getting-started/3.running-from-source","i-lucide-rocket",{"title":26,"path":27,"stem":28,"children":29,"icon":40},"Benchmarks & Methodology","/docs/benchmarks","docs/2.benchmarks/1.index",[30,32,36],{"title":31,"path":27,"stem":28},"Methodology",{"title":33,"path":34,"stem":35},"Reading your results","/docs/benchmarks/reading-your-results","docs/2.benchmarks/2.reading-your-results",{"title":37,"path":38,"stem":39},"Testing from another machine","/docs/benchmarks/testing-from-another-machine","docs/2.benchmarks/3.testing-from-another-machine","i-lucide-flask-conical",{"title":42,"icon":43,"path":44,"stem":45,"children":46,"page":59},"Configuration","i-lucide-settings-2","/docs/configuration","docs/3.configuration",[47,51,55],{"title":48,"path":49,"stem":50},"Adding a real database","/docs/configuration/adding-databases","docs/3.configuration/1.adding-databases",{"title":52,"path":53,"stem":54},"Customizing the image","/docs/configuration/customizing-the-image","docs/3.configuration/2.customizing-the-image",{"title":56,"path":57,"stem":58},"Common tuning strategies","/docs/configuration/common-tuning-strategies","docs/3.configuration/3.common-tuning-strategies",false,{"title":61,"path":62,"stem":63,"children":64,"icon":79},"Image variations","/docs/image-variations","docs/4.image-variations/1.index",[65,67,71,75],{"title":66,"path":62,"stem":63},"Choosing a variation",{"title":68,"path":69,"stem":70},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/4.image-variations/2.fpm-nginx",{"title":72,"path":73,"stem":74},"FrankenPHP","/docs/image-variations/frankenphp","docs/4.image-variations/3.frankenphp",{"title":76,"path":77,"stem":78},"FPM-Apache","/docs/image-variations/fpm-apache","docs/4.image-variations/4.fpm-apache","i-lucide-layers",{"title":81,"path":82,"stem":83,"children":84,"icon":87},"Community Results","/docs/community-results","docs/5.community-results/1.index",[85],{"title":86,"path":82,"stem":83},"Submitting your results","i-lucide-users",{"title":89,"path":90,"stem":91,"children":92,"icon":95},"FAQ","/docs/faq","docs/6.faq/1.index",[93],{"title":94,"path":90,"stem":91},"Frequently asked questions","i-lucide-circle-help",{"id":97,"title":37,"body":98,"description":984,"extension":985,"links":986,"meta":987,"navigation":988,"path":38,"redirect":986,"seo":989,"sitemap":990,"stem":39,"__hash__":991},"docs/docs/2.benchmarks/3.testing-from-another-machine.md",{"type":99,"value":100,"toc":971},"minimark",[101,105,128,133,136,191,194,208,232,236,239,466,480,486,490,493,529,532,535,541,544,547,601,606,671,678,687,691,694,701,755,759,762,798,801,818,822,825,836,839,900,903,920,924,936,947,956,960,967],[102,103,104],"p",{},"A server generating its own traffic competes with the thing it is measuring, so BenchKit drives the load test from a second machine by default. You need:",[106,107,108,116],"ul",{},[109,110,111,115],"li",{},[112,113,114],"strong",{},"A machine near your server",", ideally in the same datacenter or region.",[109,117,118],{},[112,119,120,127],{},[121,122,126],"a",{"href":123,"rel":124},"https://github.com/hatoo/oha",[125],"nofollow","oha"," installed on it.",[129,130,132],"h2",{"id":131},"pick-the-machine","Pick the machine",[102,134,135],{},"The closer that machine sits, the more of your server you measure and the less of the network in between.",[137,138,139,152],"table",{},[140,141,142],"thead",{},[143,144,145,149],"tr",{},[146,147,148],"th",{},"Where your second machine is",[146,150,151],{},"What you end up measuring",[153,154,155,167,175,183],"tbody",{},[143,156,157,161],{},[158,159,160],"td",{},"Same datacenter or region",[158,162,163,166],{},[112,164,165],{},"Your server."," This is what you want",[143,168,169,172],{},[158,170,171],{},"Same LAN, or a VM on the same host",[158,173,174],{},"Your server, mostly. A VM still shares the host's CPU",[143,176,177,180],{},[158,178,179],{},"Another region or provider",[158,181,182],{},"The network between the two machines",[143,184,185,188],{},[158,186,187],{},"A laptop on wifi",[158,189,190],{},"Your wifi",[102,192,193],{},"Two more things to consider:",[106,195,196,202],{},[109,197,198,201],{},[112,199,200],{},"Give it enough CPU."," A single-core box runs out of headroom before your server does. Match it roughly to the machine under test.",[109,203,204,207],{},[112,205,206],{},"Do not let it sleep."," A laptop that sleeps mid-run takes the stage down with it.",[209,210,212,215,226,229],"collapsible",{"name":211},"why distance caps your numbers",[102,213,214],{},"oha is closed-loop: each connection waits for a reply before sending again. One connection sends one request per round trip, so no generator can beat:",[216,217,222],"pre",{"className":218,"code":220,"language":221},[219],"language-text","max requests per second = connections ÷ round trip in seconds\n","text",[223,224,220],"code",{"__ignoreMap":225},"",[102,227,228],{},"How many connections there can be is a property of the generator machine, not a setting: each one is an open file and an ephemeral port, and the pairing command measures both limits, raises the file limit as far as it may without privileges, and reports what is left. The dialog turns that into the most it could measure from where it is. Your server is not slower. You cannot ask it for more from that far away.",[102,230,231],{},"BenchKit measures the round trip when the generator connects and sizes the sweep from it, so a generator further away is asked for proportionally more connections, up to what it can hold open. When even that was not enough, the result says so — that is your cue to move the generator closer, or to raise its open file limit, not to distrust the server.",[129,233,235],{"id":234},"install-oha-on-the-generator-machine","Install oha (on the generator machine)",[102,237,238],{},"Run these commands on the machine you want to simulate traffic from.",[240,241,242,271,444],"tabs",{},[243,244,247],"tabs-item",{"icon":245,"label":246},"i-simple-icons-apple","macOS",[216,248,253],{"className":249,"code":250,"filename":251,"language":252,"meta":225,"style":225},"language-bash shiki shiki-themes github-dark","brew install oha\n","Terminal","bash",[223,254,255],{"__ignoreMap":225},[256,257,260,264,268],"span",{"class":258,"line":259},"line",1,[256,261,263],{"class":262},"svObZ","brew",[256,265,267],{"class":266},"sU2Wk"," install",[256,269,270],{"class":266}," oha\n",[243,272,275,309,312,431],{"icon":273,"label":274},"i-simple-icons-linux","Linux",[216,276,278],{"className":249,"code":277,"filename":251,"language":252,"meta":225,"style":225},"pacman -S oha            # Arch\ncargo install oha        # any distro, needs Rust\n",[223,279,280,296],{"__ignoreMap":225},[256,281,282,285,289,292],{"class":258,"line":259},[256,283,284],{"class":262},"pacman",[256,286,288],{"class":287},"sDLfK"," -S",[256,290,291],{"class":266}," oha",[256,293,295],{"class":294},"sAwPA","            # Arch\n",[256,297,299,302,304,306],{"class":258,"line":298},2,[256,300,301],{"class":262},"cargo",[256,303,267],{"class":266},[256,305,291],{"class":266},[256,307,308],{"class":294},"        # any distro, needs Rust\n",[102,310,311],{},"No package manager? oha ships a plain binary, so this is the whole install. No root, no Rust:",[216,313,315],{"className":249,"code":314,"filename":251,"language":252,"meta":225,"style":225},"mkdir -p ~/.local/bin\ncase \"$(uname -m)\" in\n  x86_64)  ASSET=oha-linux-amd64 ;;\n  aarch64) ASSET=oha-linux-arm64 ;;\nesac\ncurl -fsSL \"https://github.com/hatoo/oha/releases/latest/download/$ASSET\" -o ~/.local/bin/oha\nchmod +x ~/.local/bin/oha\n",[223,316,317,328,349,372,390,396,420],{"__ignoreMap":225},[256,318,319,322,325],{"class":258,"line":259},[256,320,321],{"class":262},"mkdir",[256,323,324],{"class":287}," -p",[256,326,327],{"class":266}," ~/.local/bin\n",[256,329,330,334,337,340,343,346],{"class":258,"line":298},[256,331,333],{"class":332},"snl16","case",[256,335,336],{"class":266}," \"$(",[256,338,339],{"class":262},"uname",[256,341,342],{"class":287}," -m",[256,344,345],{"class":266},")\"",[256,347,348],{"class":332}," in\n",[256,350,352,356,359,363,366,369],{"class":258,"line":351},3,[256,353,355],{"class":354},"sns5M","  x86_64",[256,357,358],{"class":332},")",[256,360,362],{"class":361},"s95oV","  ASSET",[256,364,365],{"class":332},"=",[256,367,368],{"class":266},"oha-linux-amd64",[256,370,371],{"class":361}," ;;\n",[256,373,375,378,380,383,385,388],{"class":258,"line":374},4,[256,376,377],{"class":354},"  aarch64",[256,379,358],{"class":332},[256,381,382],{"class":361}," ASSET",[256,384,365],{"class":332},[256,386,387],{"class":266},"oha-linux-arm64",[256,389,371],{"class":361},[256,391,393],{"class":258,"line":392},5,[256,394,395],{"class":332},"esac\n",[256,397,399,402,405,408,411,414,417],{"class":258,"line":398},6,[256,400,401],{"class":262},"curl",[256,403,404],{"class":287}," -fsSL",[256,406,407],{"class":266}," \"https://github.com/hatoo/oha/releases/latest/download/",[256,409,410],{"class":361},"$ASSET",[256,412,413],{"class":266},"\"",[256,415,416],{"class":287}," -o",[256,418,419],{"class":266}," ~/.local/bin/oha\n",[256,421,423,426,429],{"class":258,"line":422},7,[256,424,425],{"class":262},"chmod",[256,427,428],{"class":266}," +x",[256,430,419],{"class":266},[102,432,433,434,439,440,443],{},"Debian and Ubuntu can also add ",[121,435,438],{"href":436,"rel":437},"https://github.com/hatoo/oha#debian",[125],"Azlux's repository"," for ",[223,441,442],{},"apt install oha",".",[243,445,448,463],{"icon":446,"label":447},"i-simple-icons-windows","Windows",[216,449,451],{"className":249,"code":450,"filename":251,"language":252,"meta":225,"style":225},"winget install hatoo.oha\n",[223,452,453],{"__ignoreMap":225},[256,454,455,458,460],{"class":258,"line":259},[256,456,457],{"class":262},"winget",[256,459,267],{"class":266},[256,461,462],{"class":266}," hatoo.oha\n",[102,464,465],{},"Run the BenchKit command itself inside WSL.",[102,467,468,469,472,473,476,477,443],{},"BenchKit looks in ",[223,470,471],{},"~/.local/bin"," and ",[223,474,475],{},"~/.cargo/bin"," as well as your ",[223,478,479],{},"PATH",[481,482,483],"note",{},[102,484,485],{},"Skip this step and nothing breaks. The pairing command stops and prints the exact download line for that machine's platform. It never installs anything itself.",[129,487,489],{"id":488},"run-the-pairing-command","Run the pairing command",[102,491,492],{},"Start a run with the web server load test enabled. BenchKit shows you a command:",[216,494,496],{"className":249,"code":495,"filename":251,"language":252,"meta":225,"style":225},"curl -kfsSL https://your-benchkit-instance/bench/generator/\u003Ctoken>/script | sh\n",[223,497,498],{"__ignoreMap":225},[256,499,500,502,505,508,511,514,517,520,523,526],{"class":258,"line":259},[256,501,401],{"class":262},[256,503,504],{"class":287}," -kfsSL",[256,506,507],{"class":266}," https://your-benchkit-instance/bench/generator/",[256,509,510],{"class":332},"\u003C",[256,512,513],{"class":266},"toke",[256,515,516],{"class":361},"n",[256,518,519],{"class":332},">",[256,521,522],{"class":266},"/script",[256,524,525],{"class":332}," |",[256,527,528],{"class":262}," sh\n",[102,530,531],{},"Paste it on the generator machine. It connects, the run starts, and the load test runs first so your part is over early.",[102,533,534],{},"Each measured window claims a line. The first batch is the probe — every route at one connection, which sizes everything after it:",[216,536,539],{"className":537,"code":538,"language":221},[219],"  ────────────────────────────────────────────────\n  Load test · 4 measured windows\n  ────────────────────────────────────────────────\n\n  1/4  static    sweep    c=1          1,204 req/s  ✓\n  2/4  json      sweep    c=1            986 req/s  ✓\n  3/4  db-read   sweep    c=1            742 req/s  ✓\n  4/4  io        sweep    c=1              9 req/s  ✓\n",[223,540,538],{"__ignoreMap":225},[102,542,543],{},"Two more batches follow: the sweep, at the concurrency levels each probe earned, then a response-time pass below the maximum the sweep found. Expect around thirty windows in all.",[102,545,546],{},"Leave the terminal open until it finishes. Closing it stops the load test.",[209,548,550,571,577,591],{"name":549},"what that command does",[551,552,553,556,559,562,565,568],"ol",{},[109,554,555],{},"Checks oha is installed, and stops with instructions if not",[109,557,558],{},"Confirms it can reach your BenchKit instance",[109,560,561],{},"Times five requests to work out the round trip",[109,563,564],{},"Handshakes, so the dialog shows it connected",[109,566,567],{},"Waits until the run reaches its web server stage",[109,569,570],{},"Runs oha through each batch of windows, uploading every result as it lands",[102,572,573,574,443],{},"It installs nothing, needs no root, and writes one temporary file that it removes on the way out. Read it before you run it if you like: open the same URL in a browser, or drop the ",[223,575,576],{},"| sh",[102,578,579,586,587,590],{},[112,580,581,582,585],{},"About ",[223,583,584],{},"-k",":"," it skips certificate verification. BenchKit instances are disposable and usually run on a self-signed certificate, where verification would fail on a certificate nobody meant to be trusted. The token in the URL authorizes the pairing, not the certificate. On a plain ",[223,588,589],{},"http://"," instance the flag does nothing.",[102,592,593,596,597,600],{},[112,594,595],{},"About color:"," output is colored only for a terminal. Piped to a file or a CI job it degrades to plain text, and ",[223,598,599],{},"NO_COLOR=1"," turns it off everywhere.",[602,603,605],"h3",{"id":604},"if-it-does-not-connect","If it does not connect",[137,607,608,618],{},[140,609,610],{},[143,611,612,615],{},[146,613,614],{},"Message",[146,616,617],{},"Fix",[153,619,620,630,640,650,660],{},[143,621,622,627],{},[158,623,624],{},[223,625,626],{},"oha is not installed on this machine",[158,628,629],{},"Install it. The script prints the exact download line for that machine",[143,631,632,637],{},[158,633,634],{},[223,635,636],{},"Could not reach \u003Curl> from this machine",[158,638,639],{},"Check the URL and any firewall between the two machines",[143,641,642,647],{},[158,643,644],{},[223,645,646],{},"The server did not accept the handshake",[158,648,649],{},"The pairing expired or was replaced. Start the run again for a fresh command",[143,651,652,657],{},[158,653,654],{},[223,655,656],{},"This pairing is no longer valid",[158,658,659],{},"The run finished or was cancelled while you waited. Start again",[143,661,662,668],{},[158,663,664,665],{},"A route ends in ",[223,666,667],{},"✗",[158,669,670],{},"The server refused that upload and prints why on the same line",[102,672,673,674,677],{},"The generator needs to reach the URL you have open in your browser, on ",[223,675,676],{},"/bench/*",". Nothing needs to be open in the other direction.",[481,679,680],{},[102,681,682,683,686],{},"If BenchKit is only reachable on loopback or through an SSH tunnel, your browser's URL is no use to a second machine. Set ",[223,684,685],{},"BENCHMARK_HTTP_URL"," to an address the generator can reach.",[129,688,690],{"id":689},"driving-oha-yourself","Driving oha yourself",[102,692,693],{},"The benchmark routes are open endpoints with session and CSRF middleware skipped, so any machine that can reach the server can point oha at them.",[102,695,696,697,700],{},"Results driven this way are ",[112,698,699],{},"not"," recorded into a run. Use this for ad-hoc probing, and for tail latency, which no fixed-connection test can measure honestly.",[137,702,703,713],{},[140,704,705],{},[143,706,707,710],{},[146,708,709],{},"Endpoint",[146,711,712],{},"What it represents",[153,714,715,725,735,745],{},[143,716,717,722],{},[158,718,719],{},[223,720,721],{},"/bench/static",[158,723,724],{},"Framework baseline. No database",[143,726,727,732],{},[158,728,729],{},[223,730,731],{},"/bench/json",[158,733,734],{},"An API response. A 25-item JSON payload built in PHP",[143,736,737,742],{},[158,738,739],{},[223,740,741],{},"/bench/db-read",[158,743,744],{},"A database read. 20 rows per request",[143,746,747,752],{},[158,748,749],{},[223,750,751],{},"/bench/io?ms=100",[158,753,754],{},"Simulated I/O. Sleeps for the milliseconds you pass",[602,756,758],{"id":757},"throughput","Throughput",[102,760,761],{},"Hold a set number of connections open and see what the server gets through:",[216,763,765],{"className":249,"code":764,"filename":251,"language":252,"meta":225,"style":225},"oha -z 30s -c 50 http://\u003Cyour-server-ip>/bench/db-read\n",[223,766,767],{"__ignoreMap":225},[256,768,769,771,774,777,780,783,786,788,791,793,795],{"class":258,"line":259},[256,770,126],{"class":262},[256,772,773],{"class":287}," -z",[256,775,776],{"class":266}," 30s",[256,778,779],{"class":287}," -c",[256,781,782],{"class":287}," 50",[256,784,785],{"class":266}," http://",[256,787,510],{"class":332},[256,789,790],{"class":266},"your-server-i",[256,792,102],{"class":361},[256,794,519],{"class":332},[256,796,797],{"class":266},"/bench/db-read\n",[102,799,800],{},"Run one endpoint at a time. Overlapping runs compete and neither result means much.",[802,803,804],"warning",{},[102,805,806,807,810,811,814,815,443],{},"Under PHP-FPM a request holds a worker for its whole duration. If your connection count is above ",[223,808,809],{},"pm.max_children",", you are measuring the pool rather than the server. Raise ",[223,812,813],{},"PHP_FPM_PM_MAX_CHILDREN"," first, sized from memory rather than cores. See ",[121,816,56],{"href":817},"/docs/configuration/common-tuning-strategies#the-worker-pool",[602,819,821],{"id":820},"tail-latency","Tail latency",[102,823,824],{},"A fixed-connection run understates p99: when the server slows down, the client waits instead of sending more, so the requests that would have been slowest are never sent. Gil Tene named this coordinated omission.",[102,826,827,830,831,835],{},[112,828,829],{},"A paired run already does this for you."," The response times on your result come from a separate pass at a held rate below the maximum, with the correction applied — that is what the ",[121,832,834],{"href":833},"/docs/benchmarks#two-questions-two-measurements","three measurements"," are for. What follows is how to do it by hand against your own routes.",[102,837,838],{},"Two passes:",[840,841,843,848,851,855],"steps",{"level":842},"4",[844,845,847],"h4",{"id":846},"find-your-maximum-throughput","Find your maximum throughput",[102,849,850],{},"Run the throughput command above at a few connection counts and note the highest requests per second. One connection count is one point on a curve, and the maximum is rarely at the first number you try.",[844,852,854],{"id":853},"run-again-at-about-70-of-that","Run again at about 70% of that",[216,856,858],{"className":249,"code":857,"filename":251,"language":252,"meta":225,"style":225},"oha -q \u003Creq_per_sec> -z 30s --latency-correction -w http://\u003Cyour-server-ip>/bench/db-read\n",[223,859,860],{"__ignoreMap":225},[256,861,862,864,867,870,873,876,878,880,882,885,888,890,892,894,896,898],{"class":258,"line":259},[256,863,126],{"class":262},[256,865,866],{"class":287}," -q",[256,868,869],{"class":332}," \u003C",[256,871,872],{"class":266},"req_per_se",[256,874,875],{"class":361},"c",[256,877,519],{"class":332},[256,879,773],{"class":287},[256,881,776],{"class":266},[256,883,884],{"class":287}," --latency-correction",[256,886,887],{"class":287}," -w",[256,889,785],{"class":266},[256,891,510],{"class":332},[256,893,790],{"class":266},[256,895,102],{"class":361},[256,897,519],{"class":332},[256,899,797],{"class":266},[102,901,902],{},"Staying below your maximum is the point. At saturation every client queues, and the numbers describe the backlog rather than latency.",[481,904,905],{},[102,906,907,908,911,912,915,916,919],{},"All three flags matter. ",[223,909,910],{},"--latency-correction"," does nothing without a target rate, which is what ",[223,913,914],{},"-q"," sets. And without ",[223,917,918],{},"-w",", oha abandons the requests still in flight when the clock runs out — which are the slowest ones, so dropping them biases the tail down again.",[602,921,923],{"id":922},"reading-what-you-get","Reading what you get",[102,925,926,927,931,932,443],{},"Numbers you drive by hand are not the numbers in the Web Server Load Test panel. Yours include network time and whatever flags you passed. Do not compare the two directly. For an external number that ",[928,929,930],"em",{},"is"," comparable, ",[121,933,935],{"href":934},"#run-the-pairing-command","pair the machine with a run",[802,937,938],{},[102,939,940,942,943,946],{},[223,941,741],{}," answers ",[223,944,945],{},"503"," until the table it queries exists. That table is prepared when the HTTP stage starts, so run a benchmark with the load test enabled once before driving that endpoint from outside. The other three work immediately.",[481,948,949],{},[102,950,951,952,955],{},"A fifth route, ",[223,953,954],{},"/bench/env",", reports what PHP looks like in the process serving requests rather than in the CLI process. It is not a load target. BenchKit calls it to record the environment on your results.",[129,957,959],{"id":958},"when-a-self-test-is-fine","When a self-test is fine",[102,961,962,963,966],{},"A self-test runs oha on the BenchKit server itself — no second machine, no setup. It is the right tool for comparing two configurations on the same box, because the request path is identical between your runs. What it cannot give you is the absolute number. ",[121,964,33],{"href":965},"/docs/benchmarks/reading-your-results#a-self-test-generates-its-load-on-the-same-machine"," explains why.",[968,969,970],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}",{"title":225,"searchDepth":298,"depth":298,"links":972},[973,974,975,978,983],{"id":131,"depth":298,"text":132},{"id":234,"depth":298,"text":235},{"id":488,"depth":298,"text":489,"children":976},[977],{"id":604,"depth":351,"text":605},{"id":689,"depth":298,"text":690,"children":979},[980,981,982],{"id":757,"depth":351,"text":758},{"id":820,"depth":351,"text":821},{"id":922,"depth":351,"text":923},{"id":958,"depth":298,"text":959},"Pair a second machine to drive the load test, or point oha at the endpoints yourself.","md",null,{},true,{"title":37,"description":984},{"loc":38},"yxZdY10QdeA44dmAK2KzPR1EpMvId0quwa9ki3aauMs",[993,995],{"title":33,"path":34,"stem":35,"description":994,"children":-1},"What a BenchKit number tells you, and the known limits that apply to it.",{"title":48,"path":49,"stem":50,"description":996,"children":-1},"Point BenchKit at MySQL, MariaDB, or Postgres instead of the default SQLite.",1790284380233]