This is out captive portal front page.
"); - response->printf("You were trying to reach: http://%s%s
", request->host().c_str(), request->url().c_str()); - response->printf("Try opening this link instead
", WiFi.softAPIP().toString().c_str()); - response->print(""); - request->send(response); - } -}; - -void setup() { - Serial.begin(115200); - Serial.println(); - Serial.println("Configuring access point..."); - - if (!WiFi.softAP("esp-captive")) { - Serial.println("Soft AP creation failed."); - while (1) - ; - } - - dnsServer.start(53, "*", WiFi.softAPIP()); - server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER); // only when requested from AP - // more handlers... - server.begin(); -} - -void loop() { - dnsServer.processNextRequest(); -} diff --git a/lib/ESPAsyncWebServer/examples/Draft/Draft.ino b/lib/ESPAsyncWebServer/examples/Draft/Draft.ino deleted file mode 100644 index f10a9e7..0000000 --- a/lib/ESPAsyncWebServer/examples/Draft/Draft.ino +++ /dev/null @@ -1,37 +0,0 @@ -#include "mbedtls/md5.h" -#includeThis is out captive portal front page.
"); - response->printf("You were trying to reach: http://%s%s
", request->host().c_str(), request->url().c_str()); - response->printf("Try opening this link instead
", WiFi.softAPIP().toString().c_str()); - response->print(""); - request->send(response); - } -}; - -bool hit1 = false; -bool hit2 = false; - -void setup() { - Serial.begin(115200); - - server - .on("/", HTTP_GET, [](AsyncWebServerRequest* request) { - Serial.println("Captive portal request..."); - Serial.println("WiFi.localIP(): " + WiFi.localIP().toString()); - Serial.println("request->client()->localIP(): " + request->client()->localIP().toString()); -#if ESP_IDF_VERSION_MAJOR >= 5 - Serial.println("WiFi.type(): " + String((int)WiFi.localIP().type())); - Serial.println("request->client()->type(): " + String((int)request->client()->localIP().type())); -#endif - Serial.println(WiFi.localIP() == request->client()->localIP() ? "should be: ON_STA_FILTER" : "should be: ON_AP_FILTER"); - Serial.println(WiFi.localIP() == request->client()->localIP()); - Serial.println(WiFi.localIP().toString() == request->client()->localIP().toString()); - request->send(200, "text/plain", "This is the captive portal"); - hit1 = true; - }) - .setFilter(ON_AP_FILTER); - - server - .on("/", HTTP_GET, [](AsyncWebServerRequest* request) { - Serial.println("Website request..."); - Serial.println("WiFi.localIP(): " + WiFi.localIP().toString()); - Serial.println("request->client()->localIP(): " + request->client()->localIP().toString()); -#if ESP_IDF_VERSION_MAJOR >= 5 - Serial.println("WiFi.type(): " + String((int)WiFi.localIP().type())); - Serial.println("request->client()->type(): " + String((int)request->client()->localIP().type())); -#endif - Serial.println(WiFi.localIP() == request->client()->localIP() ? "should be: ON_STA_FILTER" : "should be: ON_AP_FILTER"); - Serial.println(WiFi.localIP() == request->client()->localIP()); - Serial.println(WiFi.localIP().toString() == request->client()->localIP().toString()); - request->send(200, "text/plain", "This is the website"); - hit2 = true; - }) - .setFilter(ON_STA_FILTER); - - // assert(WiFi.softAP("esp-captive-portal")); - // dnsServer.start(53, "*", WiFi.softAPIP()); - // server.begin(); - // Serial.println("Captive portal started!"); - - // while (!hit1) { - // dnsServer.processNextRequest(); - // yield(); - // } - // delay(1000); // Wait for the client to process the response - - // Serial.println("Captive portal opened, stopping it and connecting to WiFi..."); - // dnsServer.stop(); - // WiFi.softAPdisconnect(); - - WiFi.persistent(false); - WiFi.begin("IoT"); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - } - Serial.println("Connected to WiFi with IP address: " + WiFi.localIP().toString()); - server.begin(); - - // while (!hit2) { - // delay(10); - // } - // delay(1000); // Wait for the client to process the response - // ESP.restart(); -} - -void loop() { -} diff --git a/lib/ESPAsyncWebServer/examples/SimpleServer/SimpleServer.ino b/lib/ESPAsyncWebServer/examples/SimpleServer/SimpleServer.ino deleted file mode 100644 index f3a1605..0000000 --- a/lib/ESPAsyncWebServer/examples/SimpleServer/SimpleServer.ino +++ /dev/null @@ -1,134 +0,0 @@ -// -// A simple server implementation showing how to: -// * serve static messages -// * read GET and POST parameters -// * handle missing pages / 404s -// - -#includeLorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+ + +)"; + +bool connectToWifi() +{ + Serial.println(); + Serial.print("[WiFi] Connecting to "); + Serial.println(ssid); + + WiFi.setSleep(false); + WiFi.useStaticBuffers(true); + + WiFi.begin(ssid, password); + + // Will try for about 10 seconds (20x 500ms) + int tryDelay = 500; + int numberOfTries = 20; + + // Wait for the WiFi event + while (true) + { + switch (WiFi.status()) + { + case WL_NO_SSID_AVAIL: + Serial.println("[WiFi] SSID not found"); + break; + case WL_CONNECT_FAILED: + Serial.print("[WiFi] Failed - WiFi not connected! Reason: "); + return false; + break; + case WL_CONNECTION_LOST: + Serial.println("[WiFi] Connection was lost"); + break; + case WL_SCAN_COMPLETED: + Serial.println("[WiFi] Scan is completed"); + break; + case WL_DISCONNECTED: + Serial.println("[WiFi] WiFi is disconnected"); + break; + case WL_CONNECTED: + Serial.println("[WiFi] WiFi is connected!"); + Serial.print("[WiFi] IP address: "); + Serial.println(WiFi.localIP()); + return true; + break; + default: + Serial.print("[WiFi] WiFi Status: "); + Serial.println(WiFi.status()); + break; + } + delay(tryDelay); + + if (numberOfTries <= 0) + { + Serial.print("[WiFi] Failed to connect to WiFi!"); + // Use disconnect function to force stop trying to connect + WiFi.disconnect(); + return false; + } + else + { + numberOfTries--; + } + } + + return false; +} + +void setup() +{ + Serial.begin(115200); + delay(10); + Serial.println("ArduinoMongoose Benchmark"); + + // We start by connecting to a WiFi network + // To debug, please enable Core Debug Level to Verbose + if (connectToWifi()) + { + if(!LittleFS.begin()) + { + Serial.println("LittleFS Mount Failed. Do Platform -> Build Filesystem Image and Platform -> Upload Filesystem Image from VSCode"); + return; + } + + //start our server + Mongoose.begin(); + server.begin(80); + + //index file + server.on("/", HTTP_GET, [](MongooseHttpServerRequest *request) + { + request->send(200, "text/html", htmlContent); + }); + + //api - parameters passed in via query eg. /api/endpoint?foo=bar + server.on("/api", HTTP_GET, [](MongooseHttpServerRequest *request) + { + //create a response object + StaticJsonDocument<128> output; + output["msg"] = "status"; + output["status"] = "success"; + output["millis"] = millis(); + + //work with some params + if (request->hasParam("foo")) + { + String foo = request->getParam("foo"); + output["foo"] = foo; + } + + //serialize and return + String jsonBuffer; + serializeJson(output, jsonBuffer); + request->send(200, "application/json", jsonBuffer.c_str()); + }); + + //websocket + server.on("/ws$")-> + onFrame([](MongooseHttpWebSocketConnection *connection, int flags, uint8_t *data, size_t len) { + connection->send(WEBSOCKET_OP_TEXT, data, len); + //server.sendAll(connection, (char *)data); + }); + + //hack - no servestatic + server.on("/alien.png", HTTP_GET, [](MongooseHttpServerRequest *request) + { + //open our file + File fp = LittleFS.open("/www/alien.png"); + size_t length = fp.size(); + + //read our data + uint8_t * data = (uint8_t *)malloc(length); + if (data != NULL) + { + fp.readBytes((char *)data, length); + + //send it off + MongooseHttpServerResponseBasic *response = request->beginResponse(); + response->setContent(data, length); + response->setContentType("image/png"); + response->setCode(200); + request->send(response); + + //free the memory + free(data); + } + else + request->send(503); + }); + } +} + +void loop() +{ + Mongoose.poll(1000); +} \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/arduinomongoose/test/README b/lib/PsychicHttp/benchmark/arduinomongoose/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/lib/PsychicHttp/benchmark/arduinomongoose/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/lib/PsychicHttp/benchmark/comparison.ods b/lib/PsychicHttp/benchmark/comparison.ods new file mode 100644 index 0000000..47e6587 Binary files /dev/null and b/lib/PsychicHttp/benchmark/comparison.ods differ diff --git a/lib/PsychicHttp/benchmark/espasyncwebserver/.gitignore b/lib/PsychicHttp/benchmark/espasyncwebserver/.gitignore new file mode 100644 index 0000000..9e5f911 --- /dev/null +++ b/lib/PsychicHttp/benchmark/espasyncwebserver/.gitignore @@ -0,0 +1,6 @@ +.pio +.vscode/ +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/lib/PsychicHttp/benchmark/espasyncwebserver/data/www/alien.png b/lib/PsychicHttp/benchmark/espasyncwebserver/data/www/alien.png new file mode 100644 index 0000000..a030da0 Binary files /dev/null and b/lib/PsychicHttp/benchmark/espasyncwebserver/data/www/alien.png differ diff --git a/lib/PsychicHttp/benchmark/espasyncwebserver/include/README b/lib/PsychicHttp/benchmark/espasyncwebserver/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/lib/PsychicHttp/benchmark/espasyncwebserver/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/PsychicHttp/benchmark/espasyncwebserver/lib/README b/lib/PsychicHttp/benchmark/espasyncwebserver/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/PsychicHttp/benchmark/espasyncwebserver/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#includeLorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+ + +)"; + +bool connectToWifi() +{ + Serial.println(); + Serial.print("[WiFi] Connecting to "); + Serial.println(ssid); + + WiFi.setSleep(false); + WiFi.useStaticBuffers(true); + + WiFi.begin(ssid, password); + + // Will try for about 10 seconds (20x 500ms) + int tryDelay = 500; + int numberOfTries = 20; + + // Wait for the WiFi event + while (true) + { + switch (WiFi.status()) + { + case WL_NO_SSID_AVAIL: + Serial.println("[WiFi] SSID not found"); + break; + case WL_CONNECT_FAILED: + Serial.print("[WiFi] Failed - WiFi not connected! Reason: "); + return false; + break; + case WL_CONNECTION_LOST: + Serial.println("[WiFi] Connection was lost"); + break; + case WL_SCAN_COMPLETED: + Serial.println("[WiFi] Scan is completed"); + break; + case WL_DISCONNECTED: + Serial.println("[WiFi] WiFi is disconnected"); + break; + case WL_CONNECTED: + Serial.println("[WiFi] WiFi is connected!"); + Serial.print("[WiFi] IP address: "); + Serial.println(WiFi.localIP()); + return true; + break; + default: + Serial.print("[WiFi] WiFi Status: "); + Serial.println(WiFi.status()); + break; + } + delay(tryDelay); + + if (numberOfTries <= 0) + { + Serial.print("[WiFi] Failed to connect to WiFi!"); + // Use disconnect function to force stop trying to connect + WiFi.disconnect(); + return false; + } + else + { + numberOfTries--; + } + } + + return false; +} + +void onEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ + if(type == WS_EVT_CONNECT){ + //client connected + // Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); + // client->printf("Hello Client %u :)", client->id()); + // client->ping(); + } else if(type == WS_EVT_DISCONNECT){ + //client disconnected + // Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), client->id()); + } else if(type == WS_EVT_ERROR){ + //error was received from the other end + // Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + } else if(type == WS_EVT_PONG){ + //pong message was received (in response to a ping request maybe) + // Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); + } else if(type == WS_EVT_DATA){ + //data packet + AwsFrameInfo * info = (AwsFrameInfo*)arg; + if(info->final && info->index == 0 && info->len == len){ + //the whole message is in a single frame and we got all of it's data + // Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); + if(info->opcode == WS_TEXT){ + data[len] = 0; + // Serial.printf("%s\n", (char*)data); + } else { + // for(size_t i=0; i < info->len; i++){ + // Serial.printf("%02x ", data[i]); + // } + // Serial.printf("\n"); + } + if(info->opcode == WS_TEXT) + { + client->text((char *)data, len); + } + // else + // client->binary("I got your binary message"); + } else { + //message is comprised of multiple frames or the frame is split into multiple packets + if(info->index == 0){ + // if(info->num == 0) + // Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + // Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); + } + + Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); + if(info->message_opcode == WS_TEXT){ + data[len] = 0; + // Serial.printf("%s\n", (char*)data); + } else { + // for(size_t i=0; i < len; i++){ + // Serial.printf("%02x ", data[i]); + // } + // Serial.printf("\n"); + } + + if((info->index + len) == info->len){ + // Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); + if(info->final){ + // Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + if(info->message_opcode == WS_TEXT) + { + client->text((char *)data, info->len); + } + // else + // client->binary("I got your binary message"); + } + } + } + } +} + +void setup() +{ + Serial.begin(115200); + delay(10); + Serial.println("ESPAsyncWebserver Benchmark"); + + // We start by connecting to a WiFi network + // To debug, please enable Core Debug Level to Verbose + if (connectToWifi()) + { + if(!LittleFS.begin()) + { + Serial.println("LittleFS Mount Failed. Do Platform -> Build Filesystem Image and Platform -> Upload Filesystem Image from VSCode"); + return; + } + + //api - parameters passed in via query eg. /api/endpoint?foo=bar + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) + { + request->send(200, "text/html", htmlContent); + }); + + //serve static files from LittleFS/www on / + server.serveStatic("/", LittleFS, "/www/"); + + //api - parameters passed in via query eg. /api/endpoint?foo=bar + server.on("/api", HTTP_GET, [](AsyncWebServerRequest *request) + { + //create a response object + StaticJsonDocument<128> output; + output["msg"] = "status"; + output["status"] = "success"; + output["millis"] = millis(); + + //work with some params + if (request->hasParam("foo")) + { + AsyncWebParameter* foo = request->getParam("foo"); + output["foo"] = foo->value(); + } + + //serialize and return + String jsonBuffer; + serializeJson(output, jsonBuffer); + request->send(200, "application/json", jsonBuffer.c_str()); + }); + + ws.onEvent(onEvent); + server.addHandler(&ws); + + server.begin(); + } +} + +void loop() +{ + ws.cleanupClients(); + delay(1000); +} \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/espasyncwebserver/test/README b/lib/PsychicHttp/benchmark/espasyncwebserver/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/lib/PsychicHttp/benchmark/espasyncwebserver/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/lib/PsychicHttp/benchmark/eventsource-client-test.js b/lib/PsychicHttp/benchmark/eventsource-client-test.js new file mode 100644 index 0000000..8253789 --- /dev/null +++ b/lib/PsychicHttp/benchmark/eventsource-client-test.js @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +const EventSource = require('eventsource'); +const url = 'http://192.168.2.131/events'; + +async function eventSourceClient() { + console.log(`Starting test`); + for (let i = 0; i < 1000000; i++) + { + if (i % 100 == 0) + console.log(`Count: ${i}`); + + let eventSource = new EventSource(url); + + eventSource.onopen = () => { + //console.log('EventSource connection opened.'); + }; + + eventSource.onerror = (error) => { + console.error('EventSource error:', error); + + // Close the connection on error + eventSource.close(); + }; + + await new Promise((resolve) => { + eventSource.onmessage = (event) => { + //console.log('Received message:', event.data); + + // Close the connection after receiving the first message + eventSource.close(); + + resolve(); + } + }); + } +} + +eventSourceClient(); \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/http-client-test.js b/lib/PsychicHttp/benchmark/http-client-test.js new file mode 100644 index 0000000..29588b9 --- /dev/null +++ b/lib/PsychicHttp/benchmark/http-client-test.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +const axios = require('axios'); + +const url = 'http://192.168.2.131/api'; +const queryParams = { + foo: 'bar', + foo1: 'bar', + foo2: 'bar', + foo3: 'bar', + foo4: 'bar', + foo5: 'bar', + foo6: 'bar', +}; + +const totalRequests = 1000000; +const requestsPerCount = 100; + +let requestCount = 0; + +function fetchData() { + axios.get(url, { params: queryParams }) + .then(response => { + requestCount++; + + if (requestCount % requestsPerCount === 0) { + console.log(`Requests completed: ${requestCount}`); + } + + if (requestCount < totalRequests) { + fetchData(); + } else { + console.log('All requests completed.'); + } + }) + .catch(error => { + console.error('Error making request:', error.message); + }); +} + +// Start making requests +console.log(`Starting test`); +fetchData(); \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/latency.png b/lib/PsychicHttp/benchmark/latency.png new file mode 100644 index 0000000..1cedc93 Binary files /dev/null and b/lib/PsychicHttp/benchmark/latency.png differ diff --git a/lib/PsychicHttp/benchmark/loadtest-http.sh b/lib/PsychicHttp/benchmark/loadtest-http.sh new file mode 100644 index 0000000..4e75b84 --- /dev/null +++ b/lib/PsychicHttp/benchmark/loadtest-http.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +#Command to install the testers: +# npm install -g autocannon + +TEST_IP="192.168.2.131" +TEST_TIME=60 +LOG_FILE=psychic-http-loadtest.log +TIMEOUT=10000 +PROTOCOL=http +#PROTOCOL=https + +if test -f "$LOG_FILE"; then + rm $LOG_FILE +fi + +for CONCURRENCY in 1 2 3 4 5 6 7 8 9 10 15 20 +#for CONCURRENCY in 20 +do + printf "\n\nCLIENTS: *** $CONCURRENCY ***\n\n" >> $LOG_FILE + echo "Testing $CONCURRENCY clients on $PROTOCOL://$TEST_IP/" + #loadtest -c $CONCURRENCY --cores 1 -t $TEST_TIME --timeout $TIMEOUT "$PROTOCOL://$TEST_IP/" --quiet >> $LOG_FILE + autocannon -c $CONCURRENCY -w 1 -d $TEST_TIME --renderStatusCodes "$PROTOCOL://$TEST_IP/" >> $LOG_FILE 2>&1 + printf "\n\n----------------\n\n" >> $LOG_FILE + sleep 1 + + echo "Testing $CONCURRENCY clients on $PROTOCOL://$TEST_IP/api" + #loadtest -c $CONCURRENCY --cores 1 -t $TEST_TIME --timeout $TIMEOUT "$PROTOCOL://$TEST_IP/api?foo=bar" --quiet >> $LOG_FILE + autocannon -c $CONCURRENCY -w 1 -d $TEST_TIME --renderStatusCodes "$PROTOCOL://$TEST_IP/api?foo=bar" >> $LOG_FILE 2>&1 + printf "\n\n----------------\n\n" >> $LOG_FILE + sleep 1 + + echo "Testing $CONCURRENCY clients on $PROTOCOL://$TEST_IP/alien.png" + #loadtest -c $CONCURRENCY --cores 1 -t $TEST_TIME --timeout $TIMEOUT "$PROTOCOL://$TEST_IP/alien.png" --quiet >> $LOG_FILE + autocannon -c $CONCURRENCY -w 1 -d $TEST_TIME --renderStatusCodes "$PROTOCOL://$TEST_IP/alien.png" >> $LOG_FILE 2>&1 + printf "\n\n----------------\n\n" >> $LOG_FILE + sleep 1 +done \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/loadtest-websocket.sh b/lib/PsychicHttp/benchmark/loadtest-websocket.sh new file mode 100644 index 0000000..a9b5a41 --- /dev/null +++ b/lib/PsychicHttp/benchmark/loadtest-websocket.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +#Command to install the testers: +# npm install -g loadtest + +TEST_IP="192.168.2.131" +TEST_TIME=60 +LOG_FILE=psychic-websocket-loadtest.log +PROTOCOL=ws +#PROTOCOL=wss + +if test -f "$LOG_FILE"; then + rm $LOG_FILE +fi + +for CONCURRENCY in 1 2 3 4 5 6 7 +do + printf "\n\nCLIENTS: *** $CONCURRENCY ***\n\n" >> $LOG_FILE + echo "Testing $CONCURRENCY clients on $PROTOCOL://$TEST_IP/ws" + loadtest -c $CONCURRENCY --cores 1 -t $TEST_TIME --insecure $PROTOCOL://$TEST_IP/ws --quiet 2> /dev/null >> $LOG_FILE + sleep 1 +done + +for CONNECTIONS in 8 10 16 20 +#for CONNECTIONS in 20 +do + CONCURRENCY=$((CONNECTIONS / 2)) + printf "\n\nCLIENTS: *** $CONNECTIONS ***\n\n" >> $LOG_FILE + echo "Testing $CONNECTIONS clients on $PROTOCOL://$TEST_IP/ws" + loadtest -c $CONCURRENCY --cores 2 -t $TEST_TIME --insecure $PROTOCOL://$TEST_IP/ws --quiet 2> /dev/null >> $LOG_FILE + sleep 1 +done \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/package.json b/lib/PsychicHttp/benchmark/package.json new file mode 100644 index 0000000..3237d56 --- /dev/null +++ b/lib/PsychicHttp/benchmark/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "axios": "^1.6.2", + "eventsource": "^2.0.2", + "ws": "^8.14.2" + } +} diff --git a/lib/PsychicHttp/benchmark/performance.png b/lib/PsychicHttp/benchmark/performance.png new file mode 100644 index 0000000..81d2a3f Binary files /dev/null and b/lib/PsychicHttp/benchmark/performance.png differ diff --git a/lib/PsychicHttp/benchmark/psychichttp/.gitignore b/lib/PsychicHttp/benchmark/psychichttp/.gitignore new file mode 100644 index 0000000..9e5f911 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttp/.gitignore @@ -0,0 +1,6 @@ +.pio +.vscode/ +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/lib/PsychicHttp/benchmark/psychichttp/data/www/alien.png b/lib/PsychicHttp/benchmark/psychichttp/data/www/alien.png new file mode 100644 index 0000000..a030da0 Binary files /dev/null and b/lib/PsychicHttp/benchmark/psychichttp/data/www/alien.png differ diff --git a/lib/PsychicHttp/benchmark/psychichttp/include/README b/lib/PsychicHttp/benchmark/psychichttp/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttp/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/PsychicHttp/benchmark/psychichttp/lib/README b/lib/PsychicHttp/benchmark/psychichttp/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttp/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#includeLorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+ + +)"; + +bool connectToWifi() +{ + Serial.println(); + Serial.print("[WiFi] Connecting to "); + Serial.println(ssid); + + WiFi.setSleep(false); + WiFi.useStaticBuffers(true); + + WiFi.begin(ssid, password); + + // Will try for about 10 seconds (20x 500ms) + int tryDelay = 500; + int numberOfTries = 20; + + // Wait for the WiFi event + while (true) + { + switch (WiFi.status()) + { + case WL_NO_SSID_AVAIL: + Serial.println("[WiFi] SSID not found"); + break; + case WL_CONNECT_FAILED: + Serial.print("[WiFi] Failed - WiFi not connected! Reason: "); + return false; + break; + case WL_CONNECTION_LOST: + Serial.println("[WiFi] Connection was lost"); + break; + case WL_SCAN_COMPLETED: + Serial.println("[WiFi] Scan is completed"); + break; + case WL_DISCONNECTED: + Serial.println("[WiFi] WiFi is disconnected"); + break; + case WL_CONNECTED: + Serial.println("[WiFi] WiFi is connected!"); + Serial.print("[WiFi] IP address: "); + Serial.println(WiFi.localIP()); + return true; + break; + default: + Serial.print("[WiFi] WiFi Status: "); + Serial.println(WiFi.status()); + break; + } + delay(tryDelay); + + if (numberOfTries <= 0) + { + Serial.print("[WiFi] Failed to connect to WiFi!"); + // Use disconnect function to force stop trying to connect + WiFi.disconnect(); + return false; + } + else + { + numberOfTries--; + } + } + + return false; +} + +void setup() +{ + Serial.begin(115200); + delay(10); + Serial.println("PsychicHTTP Benchmark"); + + if (connectToWifi()) + { + if(!LittleFS.begin()) + { + Serial.println("LittleFS Mount Failed. Do Platform -> Build Filesystem Image and Platform -> Upload Filesystem Image from VSCode"); + return; + } + + //start our server + server.listen(80); + + //our index + server.on("/", HTTP_GET, [](PsychicRequest *request) + { + return request->reply(200, "text/html", htmlContent); + }); + + //serve static files from LittleFS/www on / + server.serveStatic("/", LittleFS, "/www/"); + + //a websocket echo server + websocketHandler.onOpen([](PsychicWebSocketClient *client) { + client->sendMessage("Hello!"); + }); + websocketHandler.onFrame([](PsychicWebSocketRequest *request, httpd_ws_frame *frame) { + request->reply(frame); + return ESP_OK; + }); + server.on("/ws", &websocketHandler); + + //EventSource server + eventSource.onOpen([](PsychicEventSourceClient *client) { + client->send("Hello", NULL, millis(), 1000); + }); + server.on("/events", &eventSource); + + //api - parameters passed in via query eg. /api/endpoint?foo=bar + server.on("/api", HTTP_GET, [](PsychicRequest *request) + { + //create a response object + StaticJsonDocument<128> output; + output["msg"] = "status"; + output["status"] = "success"; + output["millis"] = millis(); + + //work with some params + if (request->hasParam("foo")) + { + String foo = request->getParam("foo")->value(); + output["foo"] = foo; + } + + //serialize and return + String jsonBuffer; + serializeJson(output, jsonBuffer); + return request->reply(200, "application/json", jsonBuffer.c_str()); + }); + } +} + +unsigned long last; +void loop() +{ + if (millis() - last > 1000) + { + Serial.printf("Free Heap: %d\n", esp_get_free_heap_size()); + last = millis(); + } +} \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttp/src/secret.h b/lib/PsychicHttp/benchmark/psychichttp/src/secret.h new file mode 100644 index 0000000..6d4bb15 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttp/src/secret.h @@ -0,0 +1,2 @@ +#define WIFI_SSID "Your_SSID" +#define WIFI_PASS "Your_PASS" \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttp/test/README b/lib/PsychicHttp/benchmark/psychichttp/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttp/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/lib/PsychicHttp/benchmark/psychichttps/.gitignore b/lib/PsychicHttp/benchmark/psychichttps/.gitignore new file mode 100644 index 0000000..9e5f911 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/.gitignore @@ -0,0 +1,6 @@ +.pio +.vscode/ +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/lib/PsychicHttp/benchmark/psychichttps/data/server.crt b/lib/PsychicHttp/benchmark/psychichttps/data/server.crt new file mode 100644 index 0000000..34a1e01 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/data/server.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDKzCCAhOgAwIBAgIUBxM3WJf2bP12kAfqhmhhjZWv0ukwDQYJKoZIhvcNAQEL +BQAwJTEjMCEGA1UEAwwaRVNQMzIgSFRUUFMgc2VydmVyIGV4YW1wbGUwHhcNMTgx +MDE3MTEzMjU3WhcNMjgxMDE0MTEzMjU3WjAlMSMwIQYDVQQDDBpFU1AzMiBIVFRQ +UyBzZXJ2ZXIgZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALBint6nP77RCQcmKgwPtTsGK0uClxg+LwKJ3WXuye3oqnnjqJCwMEneXzGdG09T +sA0SyNPwrEgebLCH80an3gWU4pHDdqGHfJQa2jBL290e/5L5MB+6PTs2NKcojK/k +qcZkn58MWXhDW1NpAnJtjVniK2Ksvr/YIYSbyD+JiEs0MGxEx+kOl9d7hRHJaIzd +GF/vO2pl295v1qXekAlkgNMtYIVAjUy9CMpqaQBCQRL+BmPSJRkXBsYk8GPnieS4 +sUsp53DsNvCCtWDT6fd9D1v+BB6nDk/FCPKhtjYOwOAZlX4wWNSZpRNr5dfrxKsb +jAn4PCuR2akdF4G8WLUeDWECAwEAAaNTMFEwHQYDVR0OBBYEFMnmdJKOEepXrHI/ +ivM6mVqJgAX8MB8GA1UdIwQYMBaAFMnmdJKOEepXrHI/ivM6mVqJgAX8MA8GA1Ud +EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADiXIGEkSsN0SLSfCF1VNWO3 +emBurfOcDq4EGEaxRKAU0814VEmU87btIDx80+z5Dbf+GGHCPrY7odIkxGNn0DJY +W1WcF+DOcbiWoUN6DTkAML0SMnp8aGj9ffx3x+qoggT+vGdWVVA4pgwqZT7Ybntx +bkzcNFW0sqmCv4IN1t4w6L0A87ZwsNwVpre/j6uyBw7s8YoJHDLRFT6g7qgn0tcN +ZufhNISvgWCVJQy/SZjNBHSpnIdCUSJAeTY2mkM4sGxY0Widk8LnjydxZUSxC3Nl +hb6pnMh3jRq4h0+5CZielA4/a+TdrNPv/qok67ot/XJdY3qHCCd8O2b14OVq9jo= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttps/data/server.key b/lib/PsychicHttp/benchmark/psychichttps/data/server.key new file mode 100644 index 0000000..a591325 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/data/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCwYp7epz++0QkH +JioMD7U7BitLgpcYPi8Cid1l7snt6Kp546iQsDBJ3l8xnRtPU7ANEsjT8KxIHmyw +h/NGp94FlOKRw3ahh3yUGtowS9vdHv+S+TAfuj07NjSnKIyv5KnGZJ+fDFl4Q1tT +aQJybY1Z4itirL6/2CGEm8g/iYhLNDBsRMfpDpfXe4URyWiM3Rhf7ztqZdveb9al +3pAJZIDTLWCFQI1MvQjKamkAQkES/gZj0iUZFwbGJPBj54nkuLFLKedw7DbwgrVg +0+n3fQ9b/gQepw5PxQjyobY2DsDgGZV+MFjUmaUTa+XX68SrG4wJ+DwrkdmpHReB +vFi1Hg1hAgMBAAECggEAaTCnZkl/7qBjLexIryC/CBBJyaJ70W1kQ7NMYfniWwui +f0aRxJgOdD81rjTvkINsPp+xPRQO6oOadjzdjImYEuQTqrJTEUnntbu924eh+2D9 +Mf2CAanj0mglRnscS9mmljZ0KzoGMX6Z/EhnuS40WiJTlWlH6MlQU/FDnwC6U34y +JKy6/jGryfsx+kGU/NRvKSru6JYJWt5v7sOrymHWD62IT59h3blOiP8GMtYKeQlX +49om9Mo1VTIFASY3lrxmexbY+6FG8YO+tfIe0tTAiGrkb9Pz6tYbaj9FjEWOv4Vc ++3VMBUVdGJjgqvE8fx+/+mHo4Rg69BUPfPSrpEg7sQKBgQDlL85G04VZgrNZgOx6 +pTlCCl/NkfNb1OYa0BELqWINoWaWQHnm6lX8YjrUjwRpBF5s7mFhguFjUjp/NW6D +0EEg5BmO0ePJ3dLKSeOA7gMo7y7kAcD/YGToqAaGljkBI+IAWK5Su5yldrECTQKG +YnMKyQ1MWUfCYEwHtPvFvE5aPwKBgQDFBWXekpxHIvt/B41Cl/TftAzE7/f58JjV +MFo/JCh9TDcH6N5TMTRS1/iQrv5M6kJSSrHnq8pqDXOwfHLwxetpk9tr937VRzoL +CuG1Ar7c1AO6ujNnAEmUVC2DppL/ck5mRPWK/kgLwZSaNcZf8sydRgphsW1ogJin +7g0nGbFwXwKBgQCPoZY07Pr1TeP4g8OwWTu5F6dSvdU2CAbtZthH5q98u1n/cAj1 +noak1Srpa3foGMTUn9CHu+5kwHPIpUPNeAZZBpq91uxa5pnkDMp3UrLIRJ2uZyr8 +4PxcknEEh8DR5hsM/IbDcrCJQglM19ZtQeW3LKkY4BsIxjDf45ymH407IQKBgE/g +Ul6cPfOxQRlNLH4VMVgInSyyxWx1mODFy7DRrgCuh5kTVh+QUVBM8x9lcwAn8V9/ +nQT55wR8E603pznqY/jX0xvAqZE6YVPcw4kpZcwNwL1RhEl8GliikBlRzUL3SsW3 +q30AfqEViHPE3XpE66PPo6Hb1ymJCVr77iUuC3wtAoGBAIBrOGunv1qZMfqmwAY2 +lxlzRgxgSiaev0lTNxDzZkmU/u3dgdTwJ5DDANqPwJc6b8SGYTp9rQ0mbgVHnhIB +jcJQBQkTfq6Z0H6OoTVi7dPs3ibQJFrtkoyvYAbyk36quBmNRjVh6rc8468bhXYr +v/t+MeGJP/0Zw8v/X2CFll96 +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttps/data/www/alien.png b/lib/PsychicHttp/benchmark/psychichttps/data/www/alien.png new file mode 100644 index 0000000..a030da0 Binary files /dev/null and b/lib/PsychicHttp/benchmark/psychichttps/data/www/alien.png differ diff --git a/lib/PsychicHttp/benchmark/psychichttps/include/README b/lib/PsychicHttp/benchmark/psychichttps/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/PsychicHttp/benchmark/psychichttps/lib/README b/lib/PsychicHttp/benchmark/psychichttps/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#includeLorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.
+ + +)"; + +bool connectToWifi() +{ + Serial.println(); + Serial.print("[WiFi] Connecting to "); + Serial.println(ssid); + + WiFi.setSleep(false); + + WiFi.begin(ssid, password); + + // Will try for about 10 seconds (20x 500ms) + int tryDelay = 500; + int numberOfTries = 20; + + // Wait for the WiFi event + while (true) + { + switch (WiFi.status()) + { + case WL_NO_SSID_AVAIL: + Serial.println("[WiFi] SSID not found"); + break; + case WL_CONNECT_FAILED: + Serial.print("[WiFi] Failed - WiFi not connected! Reason: "); + return false; + break; + case WL_CONNECTION_LOST: + Serial.println("[WiFi] Connection was lost"); + break; + case WL_SCAN_COMPLETED: + Serial.println("[WiFi] Scan is completed"); + break; + case WL_DISCONNECTED: + Serial.println("[WiFi] WiFi is disconnected"); + break; + case WL_CONNECTED: + Serial.println("[WiFi] WiFi is connected!"); + Serial.print("[WiFi] IP address: "); + Serial.println(WiFi.localIP()); + return true; + break; + default: + Serial.print("[WiFi] WiFi Status: "); + Serial.println(WiFi.status()); + break; + } + delay(tryDelay); + + if (numberOfTries <= 0) + { + Serial.print("[WiFi] Failed to connect to WiFi!"); + // Use disconnect function to force stop trying to connect + WiFi.disconnect(); + return false; + } + else + { + numberOfTries--; + } + } + + return false; +} + +void setup() +{ + Serial.begin(115200); + delay(10); + Serial.println("PsychicHTTP Benchmark"); + + if (connectToWifi()) + { + if(!LittleFS.begin()) + { + Serial.println("LittleFS Mount Failed. Do Platform -> Build Filesystem Image and Platform -> Upload Filesystem Image from VSCode"); + return; + } + + File fp = LittleFS.open("/server.crt"); + if (fp) { + server_cert = fp.readString(); + } else { + Serial.println("server.pem not found, SSL not available"); + return; + } + fp.close(); + + File fp2 = LittleFS.open("/server.key"); + if (fp2) { + server_key = fp2.readString(); + } else { + Serial.println("server.key not found, SSL not available"); + return; + } + fp2.close(); + + //start our server + server.listen(443, server_cert.c_str(), server_key.c_str()); + + //our index + server.on("/", HTTP_GET, [](PsychicRequest *request) + { + return request->reply(200, "text/html", htmlContent); + }); + + //serve static files from LittleFS/www on / + server.serveStatic("/", LittleFS, "/www/"); + + //a websocket echo server + websocketHandler.onFrame([](PsychicWebSocketRequest *request, httpd_ws_frame *frame) { + request->reply(frame); + return ESP_OK; + }); + server.on("/ws", &websocketHandler); + + //api - parameters passed in via query eg. /api/endpoint?foo=bar + server.on("/api", HTTP_GET, [](PsychicRequest *request) + { + //create a response object + StaticJsonDocument<128> output; + output["msg"] = "status"; + output["status"] = "success"; + output["millis"] = millis(); + + //work with some params + if (request->hasParam("foo")) + { + String foo = request->getParam("foo")->value(); + output["foo"] = foo; + } + + //serialize and return + String jsonBuffer; + serializeJson(output, jsonBuffer); + return request->reply(200, "application/json", jsonBuffer.c_str()); + }); + } +} + +unsigned long last; +void loop() +{ + if (millis() - last > 1000) + { + Serial.printf("Free Heap: %d\n", esp_get_free_heap_size()); + last = millis(); + } +} \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttps/src/secret.h b/lib/PsychicHttp/benchmark/psychichttps/src/secret.h new file mode 100644 index 0000000..6d4bb15 --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/src/secret.h @@ -0,0 +1,2 @@ +#define WIFI_SSID "Your_SSID" +#define WIFI_PASS "Your_PASS" \ No newline at end of file diff --git a/lib/PsychicHttp/benchmark/psychichttps/test/README b/lib/PsychicHttp/benchmark/psychichttps/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/lib/PsychicHttp/benchmark/psychichttps/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/lib/PsychicHttp/benchmark/results/arduinomongoose-http-loadtest.log b/lib/PsychicHttp/benchmark/results/arduinomongoose-http-loadtest.log new file mode 100644 index 0000000..24a6e34 --- /dev/null +++ b/lib/PsychicHttp/benchmark/results/arduinomongoose-http-loadtest.log @@ -0,0 +1,1172 @@ + + +CLIENTS: *** 1 *** + +Running 60s test @ http://192.168.2.131/ +1 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 720 ms [90m│[39m 14880 ms [90m│[39m 29087 ms [90m│[39m 29519 ms [90m│[39m 15024.03 ms [90m│[39m 8572.14 ms [90m│[39m 29737 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 11 [90m│[39m 11 [90m│[39m 12 [90m│[39m 14 [90m│[39m 12.47 [90m│[39m 0.87 [90m│[39m 11 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 48.2 kB [90m│[39m 48.2 kB [90m│[39m 52.6 kB [90m│[39m 61.3 kB [90m│[39m 54.6 kB [90m│[39m 3.79 kB [90m│[39m 48.2 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 748 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +1k requests in 60.07s, 3.28 MB read +748 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +1 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 781 ms [90m│[39m 15061 ms [90m│[39m 29571 ms [90m│[39m 30046 ms [90m│[39m 15137.29 ms [90m│[39m 8833.98 ms [90m│[39m 30393 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 17 [90m│[39m 18 [90m│[39m 20 [90m│[39m 23 [90m│[39m 20.34 [90m│[39m 1.27 [90m│[39m 17 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 2.99 kB [90m│[39m 3.15 kB [90m│[39m 3.52 kB [90m│[39m 4.03 kB [90m│[39m 3.57 kB [90m│[39m 220 B [90m│[39m 2.99 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1220 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +2k requests in 60.06s, 214 kB read +1k errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +1 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 969 ms [90m│[39m 15300 ms [90m│[39m 29831 ms [90m│[39m 30132 ms [90m│[39m 15143.83 ms [90m│[39m 8807.54 ms [90m│[39m 30385 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 3 [90m│[39m 3 [90m│[39m 3 [90m│[39m 4 [90m│[39m 3.15 [90m│[39m 0.36 [90m│[39m 3 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 86.1 kB [90m│[39m 86.1 kB [90m│[39m 86.1 kB [90m│[39m 115 kB [90m│[39m 90.4 kB [90m│[39m 10.3 kB [90m│[39m 86.1 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 189 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +378 requests in 60.06s, 5.43 MB read +188 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 2 *** + +Running 60s test @ http://192.168.2.131/ +2 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 803 ms [90m│[39m 14773 ms [90m│[39m 29269 ms [90m│[39m 29642 ms [90m│[39m 14925.25 ms [90m│[39m 8556.82 ms [90m│[39m 29974 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 17 [90m│[39m 17 [90m│[39m 19 [90m│[39m 21 [90m│[39m 18.9 [90m│[39m 0.98 [90m│[39m 17 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 74.5 kB [90m│[39m 74.5 kB [90m│[39m 83.3 kB [90m│[39m 92 kB [90m│[39m 82.8 kB [90m│[39m 4.29 kB [90m│[39m 74.5 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1134 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +2k requests in 60.06s, 4.97 MB read +29 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +2 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 772 ms [90m│[39m 15252 ms [90m│[39m 29307 ms [90m│[39m 29709 ms [90m│[39m 15094.92 ms [90m│[39m 8732.51 ms [90m│[39m 30070 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 26 [90m│[39m 27 [90m│[39m 29 [90m│[39m 32 [90m│[39m 29.72 [90m│[39m 1.43 [90m│[39m 26 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 4.58 kB [90m│[39m 4.75 kB [90m│[39m 5.11 kB [90m│[39m 5.63 kB [90m│[39m 5.23 kB [90m│[39m 251 B [90m│[39m 4.58 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1783 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +4k requests in 60.06s, 314 kB read +1k errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +2 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 856 ms [90m│[39m 15635 ms [90m│[39m 28880 ms [90m│[39m 29310 ms [90m│[39m 15261.99 ms [90m│[39m 8577.65 ms [90m│[39m 29700 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 4 [90m│[39m 4 [90m│[39m 5 [90m│[39m 6 [90m│[39m 4.64 [90m│[39m 0.64 [90m│[39m 4 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 115 kB [90m│[39m 115 kB [90m│[39m 144 kB [90m│[39m 172 kB [90m│[39m 133 kB [90m│[39m 18.1 kB [90m│[39m 115 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 278 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +558 requests in 60.06s, 7.98 MB read +17 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 3 *** + +Running 60s test @ http://192.168.2.131/ +3 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 794 ms [90m│[39m 15166 ms [90m│[39m 29323 ms [90m│[39m 29697 ms [90m│[39m 15066.78 ms [90m│[39m 8676.25 ms [90m│[39m 30114 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 22 [90m│[39m 23 [90m│[39m 26 [90m│[39m 29 [90m│[39m 25.99 [90m│[39m 1.42 [90m│[39m 22 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 96.4 kB [90m│[39m 101 kB [90m│[39m 114 kB [90m│[39m 127 kB [90m│[39m 114 kB [90m│[39m 6.22 kB [90m│[39m 96.4 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1559 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +3k requests in 60.06s, 6.83 MB read +14 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +3 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 826 ms [90m│[39m 14949 ms [90m│[39m 29377 ms [90m│[39m 29790 ms [90m│[39m 15049.95 ms [90m│[39m 8720.15 ms [90m│[39m 30168 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 32 [90m│[39m 32 [90m│[39m 36 [90m│[39m 39 [90m│[39m 36.1 [90m│[39m 1.82 [90m│[39m 32 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 5.63 kB [90m│[39m 5.63 kB [90m│[39m 6.34 kB [90m│[39m 6.87 kB [90m│[39m 6.36 kB [90m│[39m 319 B [90m│[39m 5.63 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2166 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +4k requests in 60.1s, 381 kB read +1k errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +3 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬─────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼─────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 995 ms [90m│[39m 15127 ms [90m│[39m 29464 ms [90m│[39m 29993 ms [90m│[39m 15219.94 ms [90m│[39m 8704 ms [90m│[39m 30258 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴─────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 3 [90m│[39m 3 [90m│[39m 6 [90m│[39m 6 [90m│[39m 5.62 [90m│[39m 0.99 [90m│[39m 3 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 86.1 kB [90m│[39m 86.1 kB [90m│[39m 172 kB [90m│[39m 172 kB [90m│[39m 161 kB [90m│[39m 28.3 kB [90m│[39m 86.1 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 337 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +677 requests in 60.07s, 9.67 MB read +54 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 4 *** + +Running 60s test @ http://192.168.2.131/ +4 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 702 ms [90m│[39m 15255 ms [90m│[39m 29811 ms [90m│[39m 30226 ms [90m│[39m 15144.93 ms [90m│[39m 8830.16 ms [90m│[39m 30616 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 26 [90m│[39m 27 [90m│[39m 29 [90m│[39m 32 [90m│[39m 29.05 [90m│[39m 1.58 [90m│[39m 26 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 114 kB [90m│[39m 118 kB [90m│[39m 127 kB [90m│[39m 140 kB [90m│[39m 127 kB [90m│[39m 6.9 kB [90m│[39m 114 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1743 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +3k requests in 60.06s, 7.63 MB read +20 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +4 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬───────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼───────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 762 ms [90m│[39m 15231 ms [90m│[39m 29096 ms [90m│[39m 29534 ms [90m│[39m 15112.66 ms [90m│[39m 8660.6 ms [90m│[39m 29997 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴───────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 35 [90m│[39m 35 [90m│[39m 41 [90m│[39m 44 [90m│[39m 40.89 [90m│[39m 1.9 [90m│[39m 35 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 6.16 kB [90m│[39m 6.16 kB [90m│[39m 7.22 kB [90m│[39m 7.75 kB [90m│[39m 7.2 kB [90m│[39m 334 B [90m│[39m 6.16 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2453 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +5k requests in 60.06s, 432 kB read +977 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +4 connections +1 workers + + +[90m┌─────────[39m[90m┬─────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼─────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 1175 ms [90m│[39m 15413 ms [90m│[39m 29485 ms [90m│[39m 30066 ms [90m│[39m 15217.07 ms [90m│[39m 8604.35 ms [90m│[39m 30126 ms [90m│[39m +[90m└─────────[39m[90m┴─────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 4 [90m│[39m 4 [90m│[39m 8 [90m│[39m 8 [90m│[39m 6.47 [90m│[39m 1.87 [90m│[39m 4 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 115 kB [90m│[39m 115 kB [90m│[39m 230 kB [90m│[39m 230 kB [90m│[39m 186 kB [90m│[39m 53.6 kB [90m│[39m 115 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 388 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +780 requests in 60.05s, 11.1 MB read +39 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 5 *** + +Running 60s test @ http://192.168.2.131/ +5 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 802 ms [90m│[39m 14978 ms [90m│[39m 29391 ms [90m│[39m 29863 ms [90m│[39m 15042.57 ms [90m│[39m 8642.88 ms [90m│[39m 30280 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 26 [90m│[39m 29 [90m│[39m 33 [90m│[39m 37 [90m│[39m 33.19 [90m│[39m 2.13 [90m│[39m 26 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 114 kB [90m│[39m 127 kB [90m│[39m 145 kB [90m│[39m 162 kB [90m│[39m 145 kB [90m│[39m 9.3 kB [90m│[39m 114 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 1991 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +4k requests in 60.07s, 8.72 MB read +10 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +5 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 724 ms [90m│[39m 15356 ms [90m│[39m 29304 ms [90m│[39m 29791 ms [90m│[39m 15198.71 ms [90m│[39m 8761.23 ms [90m│[39m 30174 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 40 [90m│[39m 40 [90m│[39m 45 [90m│[39m 50 [90m│[39m 44.84 [90m│[39m 2.78 [90m│[39m 40 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 7.04 kB [90m│[39m 7.04 kB [90m│[39m 7.92 kB [90m│[39m 8.81 kB [90m│[39m 7.89 kB [90m│[39m 489 B [90m│[39m 7.04 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2690 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +5k requests in 60.07s, 473 kB read +603 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +5 connections +1 workers + + +[90m┌─────────[39m[90m┬─────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼─────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 1250 ms [90m│[39m 15289 ms [90m│[39m 29607 ms [90m│[39m 30193 ms [90m│[39m 15345.82 ms [90m│[39m 8719.55 ms [90m│[39m 30354 ms [90m│[39m +[90m└─────────[39m[90m┴─────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 5 [90m│[39m 5 [90m│[39m 6 [90m│[39m 10 [90m│[39m 7.25 [90m│[39m 2.25 [90m│[39m 5 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 144 kB [90m│[39m 144 kB [90m│[39m 172 kB [90m│[39m 287 kB [90m│[39m 208 kB [90m│[39m 64.5 kB [90m│[39m 144 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 435 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +875 requests in 60.06s, 12.5 MB read +36 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 6 *** + +Running 60s test @ http://192.168.2.131/ +6 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 847 ms [90m│[39m 14920 ms [90m│[39m 28899 ms [90m│[39m 29392 ms [90m│[39m 15008.54 ms [90m│[39m 8456.33 ms [90m│[39m 29870 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 33 [90m│[39m 33 [90m│[39m 36 [90m│[39m 39 [90m│[39m 35.75 [90m│[39m 1.75 [90m│[39m 33 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 145 kB [90m│[39m 145 kB [90m│[39m 158 kB [90m│[39m 171 kB [90m│[39m 157 kB [90m│[39m 7.65 kB [90m│[39m 145 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2145 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +4k requests in 60.06s, 9.4 MB read +3 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +6 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 890 ms [90m│[39m 14807 ms [90m│[39m 29142 ms [90m│[39m 29732 ms [90m│[39m 14934.33 ms [90m│[39m 8513.39 ms [90m│[39m 30168 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 44 [90m│[39m 44 [90m│[39m 48 [90m│[39m 53 [90m│[39m 48.3 [90m│[39m 2.22 [90m│[39m 44 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 7.75 kB [90m│[39m 7.75 kB [90m│[39m 8.5 kB [90m│[39m 9.38 kB [90m│[39m 8.54 kB [90m│[39m 395 B [90m│[39m 7.74 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2898 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +6k requests in 60.07s, 512 kB read +386 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +6 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 853 ms [90m│[39m 15325 ms [90m│[39m 29742 ms [90m│[39m 30578 ms [90m│[39m 15287.1 ms [90m│[39m 8714.92 ms [90m│[39m 30650 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬───────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 6 [90m│[39m 6 [90m│[39m 6 [90m│[39m 12 [90m│[39m 7.7 [90m│[39m 2.44 [90m│[39m 6 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 172 kB [90m│[39m 172 kB [90m│[39m 172 kB [90m│[39m 345 kB [90m│[39m 221 kB [90m│[39m 70 kB [90m│[39m 172 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴───────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 462 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +930 requests in 60.06s, 13.3 MB read +24 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 7 *** + +Running 60s test @ http://192.168.2.131/ +7 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 785 ms [90m│[39m 15141 ms [90m│[39m 29506 ms [90m│[39m 29981 ms [90m│[39m 15124.91 ms [90m│[39m 8769.84 ms [90m│[39m 30379 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 32 [90m│[39m 33 [90m│[39m 37 [90m│[39m 40 [90m│[39m 36.64 [90m│[39m 2.04 [90m│[39m 32 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 140 kB [90m│[39m 145 kB [90m│[39m 162 kB [90m│[39m 175 kB [90m│[39m 160 kB [90m│[39m 8.9 kB [90m│[39m 140 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2198 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +4k requests in 60.06s, 9.63 MB read +1 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +7 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 773 ms [90m│[39m 15322 ms [90m│[39m 29472 ms [90m│[39m 29911 ms [90m│[39m 15145.75 ms [90m│[39m 8792.14 ms [90m│[39m 30238 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 45 [90m│[39m 45 [90m│[39m 51 [90m│[39m 56 [90m│[39m 50.62 [90m│[39m 3.07 [90m│[39m 45 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 7.97 kB [90m│[39m 7.97 kB [90m│[39m 9.03 kB [90m│[39m 9.92 kB [90m│[39m 8.96 kB [90m│[39m 541 B [90m│[39m 7.96 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 3037 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +6k requests in 60.06s, 538 kB read +252 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +7 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 903 ms [90m│[39m 15426 ms [90m│[39m 29337 ms [90m│[39m 30187 ms [90m│[39m 15395.14 ms [90m│[39m 8592.24 ms [90m│[39m 30239 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬───────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 7 [90m│[39m 7 [90m│[39m 7 [90m│[39m 14 [90m│[39m 8.06 [90m│[39m 2.03 [90m│[39m 7 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 201 kB [90m│[39m 201 kB [90m│[39m 201 kB [90m│[39m 402 kB [90m│[39m 231 kB [90m│[39m 58 kB [90m│[39m 201 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴───────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 483 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +973 requests in 60.06s, 13.9 MB read +27 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 8 *** + +Running 60s test @ http://192.168.2.131/ +8 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 947 ms [90m│[39m 15230 ms [90m│[39m 29194 ms [90m│[39m 29710 ms [90m│[39m 15139.81 ms [90m│[39m 8698.37 ms [90m│[39m 30418 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 31 [90m│[39m 33 [90m│[39m 38 [90m│[39m 43 [90m│[39m 37.92 [90m│[39m 2.7 [90m│[39m 31 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 136 kB [90m│[39m 145 kB [90m│[39m 167 kB [90m│[39m 188 kB [90m│[39m 166 kB [90m│[39m 11.8 kB [90m│[39m 136 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2275 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +5k requests in 60.06s, 9.96 MB read +1 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +8 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 818 ms [90m│[39m 15102 ms [90m│[39m 29043 ms [90m│[39m 29502 ms [90m│[39m 14999.69 ms [90m│[39m 8454.75 ms [90m│[39m 30295 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 44 [90m│[39m 45 [90m│[39m 51 [90m│[39m 60 [90m│[39m 51.37 [90m│[39m 3.35 [90m│[39m 44 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 7.79 kB [90m│[39m 7.97 kB [90m│[39m 9.03 kB [90m│[39m 10.6 kB [90m│[39m 9.09 kB [90m│[39m 591 B [90m│[39m 7.79 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 3082 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +6k requests in 60s, 546 kB read +222 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +8 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 951 ms [90m│[39m 15565 ms [90m│[39m 30182 ms [90m│[39m 30252 ms [90m│[39m 15396.59 ms [90m│[39m 8860.08 ms [90m│[39m 31138 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 7 [90m│[39m 8 [90m│[39m 8 [90m│[39m 14 [90m│[39m 8.56 [90m│[39m 1.59 [90m│[39m 7 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 201 kB [90m│[39m 230 kB [90m│[39m 230 kB [90m│[39m 402 kB [90m│[39m 245 kB [90m│[39m 45.5 kB [90m│[39m 201 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 513 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +1k requests in 60.06s, 14.7 MB read +31 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 9 *** + +Running 60s test @ http://192.168.2.131/ +9 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬───────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼───────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 951 ms [90m│[39m 15246 ms [90m│[39m 28914 ms [90m│[39m 29402 ms [90m│[39m 15108.58 ms [90m│[39m 8543.6 ms [90m│[39m 30524 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴───────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 31 [90m│[39m 32 [90m│[39m 37 [90m│[39m 43 [90m│[39m 37.42 [90m│[39m 2.9 [90m│[39m 31 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 136 kB [90m│[39m 140 kB [90m│[39m 162 kB [90m│[39m 188 kB [90m│[39m 164 kB [90m│[39m 12.7 kB [90m│[39m 136 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2245 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +5k requests in 60.05s, 9.83 MB read +1 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +9 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 885 ms [90m│[39m 15043 ms [90m│[39m 29217 ms [90m│[39m 29730 ms [90m│[39m 14953.4 ms [90m│[39m 8530.16 ms [90m│[39m 30399 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 44 [90m│[39m 46 [90m│[39m 52 [90m│[39m 58 [90m│[39m 52.1 [90m│[39m 3.22 [90m│[39m 44 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 7.79 kB [90m│[39m 8.14 kB [90m│[39m 9.21 kB [90m│[39m 10.3 kB [90m│[39m 9.22 kB [90m│[39m 570 B [90m│[39m 7.79 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 3126 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +6k requests in 60.07s, 553 kB read +189 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +9 connections +1 workers + + +[90m┌─────────[39m[90m┬─────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼─────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 1079 ms [90m│[39m 15444 ms [90m│[39m 28978 ms [90m│[39m 29935 ms [90m│[39m 15389.63 ms [90m│[39m 8469.15 ms [90m│[39m 30003 ms [90m│[39m +[90m└─────────[39m[90m┴─────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────[39m[90m┬──────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────[39m[90m┼──────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 0 [90m│[39m 0 [90m│[39m 9 [90m│[39m 10 [90m│[39m 8.56 [90m│[39m 2.21 [90m│[39m 1 [90m│[39m +[90m├───────────[39m[90m┼─────[39m[90m┼──────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 0 B [90m│[39m 0 B [90m│[39m 258 kB [90m│[39m 287 kB [90m│[39m 245 kB [90m│[39m 63.4 kB [90m│[39m 28.7 kB [90m│[39m +[90m└───────────[39m[90m┴─────[39m[90m┴──────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 513 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +1k requests in 60.06s, 14.7 MB read +20 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 10 *** + +Running 60s test @ http://192.168.2.131/ +10 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 996 ms [90m│[39m 15183 ms [90m│[39m 29343 ms [90m│[39m 29946 ms [90m│[39m 15135.07 ms [90m│[39m 8665.13 ms [90m│[39m 30794 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬─────────[39m[90m┬────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Req/Sec [90m│[39m 32 [90m│[39m 32 [90m│[39m 37 [90m│[39m 43 [90m│[39m 37.59 [90m│[39m 2.43 [90m│[39m 32 [90m│[39m +[90m├───────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼─────────[39m[90m┼────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 140 kB [90m│[39m 140 kB [90m│[39m 162 kB [90m│[39m 188 kB [90m│[39m 165 kB [90m│[39m 10.6 kB [90m│[39m 140 kB [90m│[39m +[90m└───────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴─────────[39m[90m┴────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 2255 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +5k requests in 60.06s, 9.88 MB read +5 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/api?foo=bar +10 connections +1 workers + + +[90m┌─────────[39m[90m┬────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 876 ms [90m│[39m 15390 ms [90m│[39m 29322 ms [90m│[39m 29837 ms [90m│[39m 15193.95 ms [90m│[39m 8726.45 ms [90m│[39m 30887 ms [90m│[39m +[90m└─────────[39m[90m┴────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬─────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 46 [90m│[39m 47 [90m│[39m 52 [90m│[39m 60 [90m│[39m 52.42 [90m│[39m 3.63 [90m│[39m 46 [90m│[39m +[90m├───────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼─────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 8.14 kB [90m│[39m 8.32 kB [90m│[39m 9.21 kB [90m│[39m 10.6 kB [90m│[39m 9.28 kB [90m│[39m 642 B [90m│[39m 8.14 kB [90m│[39m +[90m└───────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴─────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 3145 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +6k requests in 60.07s, 557 kB read +193 errors (0 timeouts) + + +---------------- + +Running 60s test @ http://192.168.2.131/alien.png +10 connections +1 workers + + +[90m┌─────────[39m[90m┬─────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬──────────[39m[90m┬─────────────[39m[90m┬────────────[39m[90m┬──────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m 99% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Max [39m[90m│[39m +[90m├─────────[39m[90m┼─────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼──────────[39m[90m┼─────────────[39m[90m┼────────────[39m[90m┼──────────┤[39m +[90m│[39m Latency [90m│[39m 1126 ms [90m│[39m 15812 ms [90m│[39m 30288 ms [90m│[39m 31239 ms [90m│[39m 15913.56 ms [90m│[39m 8747.22 ms [90m│[39m 32439 ms [90m│[39m +[90m└─────────[39m[90m┴─────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴──────────[39m[90m┴─────────────[39m[90m┴────────────[39m[90m┴──────────┘[39m +[90m┌───────────[39m[90m┬─────[39m[90m┬─────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬────────[39m[90m┬───────[39m[90m┬─────────┐[39m +[90m│[39m[31m Stat [39m[90m│[39m[31m 1% [39m[90m│[39m[31m 2.5% [39m[90m│[39m[31m 50% [39m[90m│[39m[31m 97.5% [39m[90m│[39m[31m Avg [39m[90m│[39m[31m Stdev [39m[90m│[39m[31m Min [39m[90m│[39m +[90m├───────────[39m[90m┼─────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Req/Sec [90m│[39m 0 [90m│[39m 2 [90m│[39m 10 [90m│[39m 10 [90m│[39m 8.84 [90m│[39m 2.37 [90m│[39m 2 [90m│[39m +[90m├───────────[39m[90m┼─────[39m[90m┼─────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼────────[39m[90m┼───────[39m[90m┼─────────┤[39m +[90m│[39m Bytes/Sec [90m│[39m 0 B [90m│[39m 57.4 kB [90m│[39m 287 kB [90m│[39m 287 kB [90m│[39m 254 kB [90m│[39m 68 kB [90m│[39m 57.4 kB [90m│[39m +[90m└───────────[39m[90m┴─────[39m[90m┴─────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴────────[39m[90m┴───────[39m[90m┴─────────┘[39m +[90m┌──────[39m[90m┬───────┐[39m +[90m│[39m[31m Code [39m[90m│[39m[31m Count [39m[90m│[39m +[90m├──────[39m[90m┼───────┤[39m +[90m│[39m 200 [90m│[39m 530 [90m│[39m +[90m└──────[39m[90m┴───────┘[39m + +Req/Bytes counts sampled once per second. +# of samples: 60 + +1k requests in 60.06s, 15.2 MB read +42 errors (0 timeouts) + + +---------------- + + + +CLIENTS: *** 15 *** + +Running 60s test @ http://192.168.2.131/ +15 connections +1 workers + +node:internal/event_target:1084 + process.nextTick(() => { throw err; }); + ^ + +TypeError: colorize is not a function + at /Users/hoeken/.nvm/versions/node/v21.1.0/lib/node_modules/autocannon/lib/printResult.js:46:31 + at Array.forEach (