Add broker and web throughput diagnostics
This commit is contained in:
@@ -24,6 +24,7 @@ static void print_usage(void)
|
||||
printf(" web status|start|stop\n");
|
||||
printf(" web counters|clear-counters\n");
|
||||
printf(" web diagnostics enable|disable|show|clear\n");
|
||||
printf(" web performance enable|disable|show|clear\n");
|
||||
printf(" web certificate info\n");
|
||||
printf(" web certificate rotate --force\n");
|
||||
printf(" web reset --force (TLS certificate and private key only)\n");
|
||||
@@ -295,12 +296,60 @@ static int reset_material(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_performance_time(const char *name, const web_serial_performance_timing_t *t)
|
||||
{
|
||||
printf(" %s: count=%" PRIu64 " sum_us=%" PRIu64 " avg_us_est=%" PRIu64 " max_us=%" PRIu64 "\n",
|
||||
name, t->count, t->sum_us, t->count ? t->sum_us / t->count : 0, t->max_us);
|
||||
}
|
||||
|
||||
static int performance_command(const char *action)
|
||||
{
|
||||
esp_err_t result = ESP_OK;
|
||||
if (!strcmp(action, "enable")) result = web_serial_performance_enable(true);
|
||||
else if (!strcmp(action, "disable")) result = web_serial_performance_enable(false);
|
||||
else if (!strcmp(action, "clear")) result = web_serial_performance_clear();
|
||||
else if (strcmp(action, "show")) return 1;
|
||||
if (result != ESP_OK) {
|
||||
printf("Web performance: %s\n", esp_err_to_name(result));
|
||||
return 1;
|
||||
}
|
||||
web_serial_performance_snapshot_t s;
|
||||
web_serial_performance_snapshot(&s);
|
||||
printf("Web performance: enabled=%u epoch=%" PRIu32 " epoch_exhausted=%u; binary TX only\n",
|
||||
s.enabled, s.epoch, s.epoch_exhausted);
|
||||
printf("Send-call return is synchronous HTTPD-owner bytes send, not peer receipt. Timings are instrumented estimates; saturated=1 invalidates averages/count totals.\n");
|
||||
printf("Completion->nonempty includes idle gaps; first-nonempty excludes observed empty attempts, not proof of backlog.\n");
|
||||
for (unsigned i = 0; i < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++i) {
|
||||
const web_serial_performance_session_t *r = &s.sessions[i];
|
||||
if (!r->active) continue;
|
||||
printf("slot=%u fd=%d generation=%" PRIu32 " broker=%" PRIu32
|
||||
" pending=%u measured_pending=%u executing=%u pending_age_us=%" PRIu64 " saturated=%u\n",
|
||||
i, r->socket_fd, r->generation, (uint32_t)r->broker_client_id,
|
||||
r->pending, r->measured_pending, r->executing, r->pending_age_us, r->saturated);
|
||||
printf(" queued_frames=%" PRIu64 " queued_bytes=%" PRIu64 " queue_errors=%" PRIu64
|
||||
" sent_frames=%" PRIu64 " sent_bytes=%" PRIu64 " send_errors=%" PRIu64 " retired=%" PRIu64 "\n",
|
||||
r->queued_frames, r->queued_bytes, r->queue_errors, r->sent_frames,
|
||||
r->sent_bytes, r->send_errors, r->retired);
|
||||
print_performance_time("queue->callback-entry", &r->queue_wait);
|
||||
print_performance_time("send-call", &r->send_call);
|
||||
print_performance_time("completion->first-drain-attempt-return", &r->completion_attempt);
|
||||
print_performance_time("completion->next-nonempty-drain-return (includes idle)", &r->completion_nonempty);
|
||||
print_performance_time("completion->first-attempt-nonempty-return", &r->completion_first_nonempty);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int command_web(int argc, char **argv)
|
||||
{
|
||||
if (argc == 1 || (argc == 2 && strcmp(argv[1], "help") == 0)) {
|
||||
print_usage();
|
||||
return 0;
|
||||
}
|
||||
if (argc == 3 && strcmp(argv[1], "performance") == 0) {
|
||||
if (performance_command(argv[2]) == 0) return 0;
|
||||
print_usage();
|
||||
return 1;
|
||||
}
|
||||
if (argc == 3 && strcmp(argv[1], "diagnostics") == 0) {
|
||||
if (web_diagnostics_command(argv[2]) == 0) return 0;
|
||||
print_usage();
|
||||
|
||||
Reference in New Issue
Block a user