From 830cb3a7ad2ae8ef81b5a51dbd878fc4ca0ddb9b Mon Sep 17 00:00:00 2001 From: k2safe Date: Wed, 23 Sep 2026 10:06:30 +0800 Subject: [PATCH] test: complete bounded HTTP2 TLS soak and flow control checks --- CHANGELOG.md | 2 + README.md | 4 +- ROADMAP.md | 4 +- performance/http2SoakLinux.json | 2624 +++++++++++++++++++++++++++ performance/http2SoakLinux.txt | 133 ++ transport/http2/admission_test.go | 116 ++ transport/http2/flowControl_test.go | 129 ++ transport/http2/lifecycle_test.go | 4 +- transport/native/HTTP2.md | 10 +- 9 files changed, 3018 insertions(+), 8 deletions(-) create mode 100644 performance/http2SoakLinux.json create mode 100644 performance/http2SoakLinux.txt create mode 100644 transport/http2/admission_test.go create mode 100644 transport/http2/flowControl_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index d33425e..c32987a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,9 @@ - HTTP/2 实验 Runner 增加标准 1 MiB 头部上限、默认 8 MiB 请求体上限、128 路同连接多路复用、2 MiB 慢读取流控验收、协议错误、RST_STREAM 和 GOAWAY 帧计数;已声明超限请求在进入业务 handler 前返回 413。 - 新增可配置时长的 HTTP/2 TLS soak:默认 3 秒,Linux 验收可通过 `GO_OMNI_HTTP2_SOAK_DURATION=30m` 覆盖,混合验证 128 路 stream、慢 handler、请求体、Keep-Alive 和退出回收。 - HTTP/2 soak 每 15 秒输出请求/失败数、Go 堆、Linux RSS、goroutine、FD 和协议统计;校验响应协议、内容和独立请求 ID,不再忽略压测期限附近已发出请求的失败。 +- 补充 HTTP/2 慢响应流窗口为零时的隔离与恢复验收:同连接 204、另一连接带 body 响应、WINDOW_UPDATE 恢复发送及 RST_STREAM 释放请求槽位;补充 TLS 握手未完成时的连接上限拒绝、握手超时回收和正常请求恢复。 - 新增 `scripts/verifyHTTP2.py`,固定在 Go 1.25 Linux 容器中运行 HTTP/2 TLS 长测;默认使用普通模式,`--race` 默认运行 60 秒。容器默认限制为 2 核、2 GiB 内存、256 个进程/线程,带总时限、中断清理和日志大小限制。 +- 完成 Linux amd64 单 TLS 连接、128 个 worker 的 30 分钟 HTTP/2 长测:58,102,476 次请求,0 失败与协议错误,采样 RSS 峰值约 22.6 MiB(包含客户端和服务端),退出后连接/请求/FD 回收;保留原始日志和 120 份采样。多连接、持续慢客户端与 HTTP/2 回源联调仍是后续门槛。 - native TLS 明确限制 ALPN 为 `http/1.1`:缺省自动宣告该协议,误配置 `h2` 等未实现协议时在启动阶段报错。 - native `Server.Stats()` 新增连接和请求过载拒绝计数;新增可信代理配置,访问日志只在 socket 对端属于配置网段时解析 `X-Forwarded-For`。 - 新增 transport-neutral `metrics` 包,支持请求数、错误数、in-flight、累计耗时和状态分布,并可直接注册 `/metrics` 接口。 diff --git a/README.md b/README.md index 4fbfa5b..4a14c8f 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,9 @@ python3 scripts/verifyBusiness.py --version v0.6.0-preview HTTP/2 仍是显式 opt-in 实验适配器,不会改变 native 的 HTTP/1.1 默认路径。Linux TLS 长测使用 `python3 scripts/verifyHTTP2.py --duration 30m`,默认使用普通 Go 运行模式;`--race` 默认改为 60 秒,用于并发检查,其额外内存开销不能当成生产运行基线。 -该脚本默认把测试容器限制为 2 核、2 GiB 内存(禁用 swap)、256 个进程/线程,整个命令最多运行 40 分钟,中断和超时会清理本次容器。这些限制可用 `--cpus`、`--memory-mb`、`--pids-limit`、`--wall-timeout` 调整;共享服务器应先用 `--duration 60s` 短测,再逐步延长。每 15 秒输出的堆、RSS 和 FD 统计包含同一进程内的客户端与服务端;当前验证范围见 [Linux HTTP/2 短测记录](performance/http2SmokeLinux.json)。 +该脚本默认把测试容器限制为 2 核、2 GiB 内存(禁用 swap)、256 个进程/线程,整个命令最多运行 40 分钟,中断和超时会清理本次容器。这些限制可用 `--cpus`、`--memory-mb`、`--pids-limit`、`--wall-timeout` 调整;共享服务器应先用 `--duration 60s` 短测,再逐步延长。每 15 秒输出的堆、RSS 和 FD 统计包含同一进程内的客户端与服务端。 + +Linux amd64 已完成 30 分钟、单 TLS 连接、128 个 worker 的普通模式长测:58,102,476 次请求,0 失败、0 协议错误,采样 RSS 峰值约 22.6 MiB,连接/活动请求归零且 FD 回到基线。完整采样和原始日志见 [HTTP/2 长测报告](performance/http2SoakLinux.json) 与 [原始日志](performance/http2SoakLinux.txt),此前的 race 对照见 [短测记录](performance/http2SmokeLinux.json)。这项结果覆盖单连接复用;多连接、持续慢客户端、连接级流控和代理 GOAWAY/排空的完整矩阵仍未完成,HTTP/2 保持实验状态。 在框架根目录运行: diff --git a/ROADMAP.md b/ROADMAP.md index 6ee0918..f316d29 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -52,7 +52,9 @@ - native TLS 已明确只宣告 HTTP/1.1 ALPN;HTTP/2 暂由边缘代理终止或使用 `transport/nethttp`,已整理独立协议设计、流控和压测门槛,见 [native HTTP/2 进入条件](transport/native/HTTP2.md),完成后再接入 native。 - 已加入独立 `transport/http2` 实验 Runner,验证 h2c/TLS h2、连接上限、全局请求并发拒绝和恢复,以及 GOAWAY 排空、RST_STREAM 单流取消和服务关闭超时;它使用 `x/net/http2` 作为临时帧/流控实现,尚未达到 native 生产协议的流控和长测门槛。 - HTTP/2 实验已补齐头部/请求体上限、128 路同连接多路复用、慢读取流控、协议错误、RST_STREAM 与 GOAWAY 统计,并提供 `scripts/verifyHTTP2.py --duration 30m` 的 Linux TLS 长测入口;长测默认不启用 race,短时并发检查使用 `--race`(默认 60 秒)。测试容器默认限制为 2 核、2 GiB 内存、256 个进程/线程,并设总时限和退出清理;代理联调和长测结果仍是进入 native 前的门槛。 -- 新 Linux amd64 环境在上述硬上限内完成 HTTP/2 普通模式 2 分钟与 race 模式 60 秒短测,分别为 3,885,273 和 377,788 次请求,均为 0 失败;连接/请求归零、FD 回到基线。SIGTERM、SIGHUP 和总时限退出清理已实测。报告见 [HTTP/2 短测记录](performance/http2SmokeLinux.json);旧的无资源上限 race 长测因 RSS 增长被停止,30 分钟 HTTP/2 验收仍未完成。 +- 新 Linux amd64 环境在上述硬上限内完成 HTTP/2 普通模式 2 分钟与 race 模式 60 秒短测,分别为 3,885,273 和 377,788 次请求,均为 0 失败;连接/请求归零、FD 回到基线。SIGTERM、SIGHUP 和总时限退出清理已实测。报告见 [HTTP/2 短测记录](performance/http2SmokeLinux.json);此前无资源上限的 race 长测因 RSS 增长而停止,不作为通过依据。 +- 已完成受限的 HTTP/2 单连接 TLS 30 分钟长测:128 个 worker、58,102,476 次请求、0 失败及协议错误;包含客户端与服务端的采样 RSS 峰值约 22.6 MiB,连接/活动请求归零,FD 由 9 回到 6。120 份定时采样见 [HTTP/2 长测报告](performance/http2SoakLinux.json),测试提交和原始日志校验值保存在报告中。多连接与持续慢客户端混合长测、连接级流控、HTTP/2 回源的 GOAWAY/排空联调仍待完成。 +- 新增 HTTP/2 零 stream 窗口时的慢响应隔离、WINDOW_UPDATE 恢复、RST_STREAM 取消与请求槽位回收测试;补充 TLS 半开握手占满连接上限时的及时拒绝、超时回收及正常请求恢复测试。 - 已用 16 个并发 worker 完成 3,200 次建连/断连 race 验收;MaxConnections 满载拒绝、槽位释放和 TLS 连接上限均已覆盖。 - 新增 `scripts/verifyLinux.py`,固定在 Go 1.25 Linux 容器内运行 race、vet、build 和可选 TLS/非 TLS perfcheck;perfcheck 记录堆、goroutine、连接和 Linux 文件描述符。 - Linux/arm64 已完成 30 秒、128 并发、512 空闲连接的 TLS 与非 TLS 持续回归,报告见 `performance/linuxSoak.json` 和 `performance/linuxSoakTLS.json`,均为 0 错误且连接、goroutine、FD 回收正常。 diff --git a/performance/http2SoakLinux.json b/performance/http2SoakLinux.json new file mode 100644 index 0000000..832cecf --- /dev/null +++ b/performance/http2SoakLinux.json @@ -0,0 +1,2624 @@ +{ + "createdAt": "2026-09-23T02:03:18.381925+00:00", + "status": "passed", + "scenario": "singleConnectionTLSMultiplexing", + "testedCommit": "d94df4fc549d12397cf20a4e179ae0bdc8bcfc04", + "startedAt": "2026-09-23T01:31:31.427444+00:00", + "finishedAt": "2026-09-23T02:01:55.205623+00:00", + "image": "golang:1.25", + "imageId": "sha256:699337d620559a59b4a2bb298ad59611e535d2ee755a34cf2d2a98f37578dc80", + "goVersion": "go1.25.14", + "platform": "linux/amd64", + "workers": 128, + "gomaxprocs": 2, + "command": [ + "python3", + "scripts/verifyHTTP2.py", + "--goproxy", + "https://goproxy.cn,direct", + "--duration", + "30m", + "--timeout", + "35m", + "--wall-timeout", + "2400", + "--cpus", + "2", + "--memory-mb", + "2048" + ], + "containerLimits": { + "nanoCpus": 2000000000, + "memoryBytes": 2147483648, + "memoryAndSwapBytes": 2147483648, + "pidsLimit": 256 + }, + "exitCode": 0, + "logSha256": "d33c9fe6ed67790a5fe315c8964aef4e08a124f1fab28589f77defd59fd42107", + "requests": 58102476, + "failures": 0, + "elapsedSeconds": 1800.067, + "sampledPeakRssBytes": 23724032, + "sampledPeakHeapBytes": 7650552, + "earlySteadyMedianRssBytes": 22255616.0, + "lastFiveMinutesMedianRssBytes": 22519808, + "before": { + "phase": "before", + "elapsedSeconds": 0.0, + "requests": 0, + "failures": 0, + "heapBytes": 168680, + "rssBytes": 8441856, + "goroutines": 2, + "fileDescriptors": 6, + "stats": { + "acceptedConnections": 0, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 0, + "activeRequests": 0 + } + }, + "after": { + "phase": "after", + "elapsedSeconds": 1800.067, + "requests": 58102476, + "failures": 0, + "heapBytes": 4154504, + "rssBytes": 21807104, + "goroutines": 3, + "fileDescriptors": 6, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 1, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 0, + "activeRequests": 0 + } + }, + "samples": [ + { + "phase": "running", + "elapsedSeconds": 15.06, + "requests": 483494, + "failures": 0, + "heapBytes": 6913536, + "rssBytes": 22216704, + "goroutines": 240, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 30.06, + "requests": 961350, + "failures": 0, + "heapBytes": 6818840, + "rssBytes": 22302720, + "goroutines": 327, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 45.06, + "requests": 1434755, + "failures": 0, + "heapBytes": 5234048, + "rssBytes": 21180416, + "goroutines": 267, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 60.06, + "requests": 1917020, + "failures": 0, + "heapBytes": 3959208, + "rssBytes": 21983232, + "goroutines": 256, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 75.06, + "requests": 2405587, + "failures": 0, + "heapBytes": 6696432, + "rssBytes": 22294528, + "goroutines": 355, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 90.06, + "requests": 2893800, + "failures": 0, + "heapBytes": 5880824, + "rssBytes": 21860352, + "goroutines": 335, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 105.06, + "requests": 3381213, + "failures": 0, + "heapBytes": 4176008, + "rssBytes": 22257664, + "goroutines": 331, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 120.06, + "requests": 3867826, + "failures": 0, + "heapBytes": 6923296, + "rssBytes": 22417408, + "goroutines": 299, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 135.06, + "requests": 4355136, + "failures": 0, + "heapBytes": 4863216, + "rssBytes": 22257664, + "goroutines": 331, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 150.06, + "requests": 4844005, + "failures": 0, + "heapBytes": 4875168, + "rssBytes": 22208512, + "goroutines": 352, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 165.06, + "requests": 5331034, + "failures": 0, + "heapBytes": 4053832, + "rssBytes": 22085632, + "goroutines": 354, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 180.061, + "requests": 5824954, + "failures": 0, + "heapBytes": 7276088, + "rssBytes": 22253568, + "goroutines": 276, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 195.06, + "requests": 6316211, + "failures": 0, + "heapBytes": 6082672, + "rssBytes": 22413312, + "goroutines": 340, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 210.06, + "requests": 6795314, + "failures": 0, + "heapBytes": 6157488, + "rssBytes": 22106112, + "goroutines": 266, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 225.06, + "requests": 7279828, + "failures": 0, + "heapBytes": 6538536, + "rssBytes": 22454272, + "goroutines": 296, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 240.06, + "requests": 7763620, + "failures": 0, + "heapBytes": 5209696, + "rssBytes": 22003712, + "goroutines": 371, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 255.06, + "requests": 8245520, + "failures": 0, + "heapBytes": 4119296, + "rssBytes": 22532096, + "goroutines": 325, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 270.06, + "requests": 8728841, + "failures": 0, + "heapBytes": 6352704, + "rssBytes": 22863872, + "goroutines": 336, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 285.06, + "requests": 9206490, + "failures": 0, + "heapBytes": 5696104, + "rssBytes": 21614592, + "goroutines": 227, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 300.06, + "requests": 9692044, + "failures": 0, + "heapBytes": 6982152, + "rssBytes": 22798336, + "goroutines": 266, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 315.06, + "requests": 10181610, + "failures": 0, + "heapBytes": 4842816, + "rssBytes": 23273472, + "goroutines": 233, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 330.06, + "requests": 10674122, + "failures": 0, + "heapBytes": 4987832, + "rssBytes": 21663744, + "goroutines": 390, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 345.06, + "requests": 11158495, + "failures": 0, + "heapBytes": 4861520, + "rssBytes": 21594112, + "goroutines": 255, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 360.06, + "requests": 11643125, + "failures": 0, + "heapBytes": 6995288, + "rssBytes": 22351872, + "goroutines": 370, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 375.06, + "requests": 12134189, + "failures": 0, + "heapBytes": 5791656, + "rssBytes": 22269952, + "goroutines": 322, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 390.06, + "requests": 12617974, + "failures": 0, + "heapBytes": 4615832, + "rssBytes": 22204416, + "goroutines": 293, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 405.06, + "requests": 13109107, + "failures": 0, + "heapBytes": 6241656, + "rssBytes": 22806528, + "goroutines": 331, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 420.06, + "requests": 13597755, + "failures": 0, + "heapBytes": 4717608, + "rssBytes": 22777856, + "goroutines": 355, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 435.06, + "requests": 14082999, + "failures": 0, + "heapBytes": 7078376, + "rssBytes": 23724032, + "goroutines": 352, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 450.06, + "requests": 14573956, + "failures": 0, + "heapBytes": 4402216, + "rssBytes": 21753856, + "goroutines": 364, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 465.06, + "requests": 15062222, + "failures": 0, + "heapBytes": 5805904, + "rssBytes": 22765568, + "goroutines": 366, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 480.06, + "requests": 15550159, + "failures": 0, + "heapBytes": 6706008, + "rssBytes": 22376448, + "goroutines": 332, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 495.06, + "requests": 16032745, + "failures": 0, + "heapBytes": 5471120, + "rssBytes": 22126592, + "goroutines": 318, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 510.061, + "requests": 16516193, + "failures": 0, + "heapBytes": 7097144, + "rssBytes": 22880256, + "goroutines": 365, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 525.061, + "requests": 16995862, + "failures": 0, + "heapBytes": 5984144, + "rssBytes": 22609920, + "goroutines": 288, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 540.06, + "requests": 17480917, + "failures": 0, + "heapBytes": 5254728, + "rssBytes": 22745088, + "goroutines": 284, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 555.06, + "requests": 17969665, + "failures": 0, + "heapBytes": 5609544, + "rssBytes": 22839296, + "goroutines": 264, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 570.06, + "requests": 18456021, + "failures": 0, + "heapBytes": 4073608, + "rssBytes": 22032384, + "goroutines": 291, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 585.06, + "requests": 18943865, + "failures": 0, + "heapBytes": 5703584, + "rssBytes": 22515712, + "goroutines": 250, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 600.06, + "requests": 19427994, + "failures": 0, + "heapBytes": 4484904, + "rssBytes": 23121920, + "goroutines": 286, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 615.06, + "requests": 19911036, + "failures": 0, + "heapBytes": 5654336, + "rssBytes": 22589440, + "goroutines": 330, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 630.06, + "requests": 20398330, + "failures": 0, + "heapBytes": 7287736, + "rssBytes": 22564864, + "goroutines": 262, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 645.06, + "requests": 20885304, + "failures": 0, + "heapBytes": 4866728, + "rssBytes": 22773760, + "goroutines": 340, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 660.06, + "requests": 21377882, + "failures": 0, + "heapBytes": 4500144, + "rssBytes": 22474752, + "goroutines": 197, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 675.06, + "requests": 21859381, + "failures": 0, + "heapBytes": 4837744, + "rssBytes": 22278144, + "goroutines": 346, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 690.06, + "requests": 22340499, + "failures": 0, + "heapBytes": 4255808, + "rssBytes": 22675456, + "goroutines": 265, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 705.06, + "requests": 22831603, + "failures": 0, + "heapBytes": 7122880, + "rssBytes": 22138880, + "goroutines": 322, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 720.06, + "requests": 23322670, + "failures": 0, + "heapBytes": 4139848, + "rssBytes": 22515712, + "goroutines": 325, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 735.06, + "requests": 23810489, + "failures": 0, + "heapBytes": 6155784, + "rssBytes": 22671360, + "goroutines": 281, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 750.06, + "requests": 24298600, + "failures": 0, + "heapBytes": 6864792, + "rssBytes": 22568960, + "goroutines": 196, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 765.06, + "requests": 24784321, + "failures": 0, + "heapBytes": 3708712, + "rssBytes": 22278144, + "goroutines": 295, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 780.06, + "requests": 25270364, + "failures": 0, + "heapBytes": 5901032, + "rssBytes": 22634496, + "goroutines": 337, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 795.06, + "requests": 25748374, + "failures": 0, + "heapBytes": 5453384, + "rssBytes": 22368256, + "goroutines": 313, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 810.06, + "requests": 26231067, + "failures": 0, + "heapBytes": 7024176, + "rssBytes": 22790144, + "goroutines": 259, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 825.06, + "requests": 26712235, + "failures": 0, + "heapBytes": 6159920, + "rssBytes": 23277568, + "goroutines": 332, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 840.06, + "requests": 27192429, + "failures": 0, + "heapBytes": 6571248, + "rssBytes": 22429696, + "goroutines": 281, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 855.06, + "requests": 27674241, + "failures": 0, + "heapBytes": 5498824, + "rssBytes": 22700032, + "goroutines": 307, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 870.06, + "requests": 28161405, + "failures": 0, + "heapBytes": 7281776, + "rssBytes": 22188032, + "goroutines": 365, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 885.06, + "requests": 28643479, + "failures": 0, + "heapBytes": 5348280, + "rssBytes": 22425600, + "goroutines": 257, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 900.06, + "requests": 29126808, + "failures": 0, + "heapBytes": 7028080, + "rssBytes": 23273472, + "goroutines": 264, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 915.06, + "requests": 29606183, + "failures": 0, + "heapBytes": 5075368, + "rssBytes": 21872640, + "goroutines": 363, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 930.06, + "requests": 30083605, + "failures": 0, + "heapBytes": 5377456, + "rssBytes": 22351872, + "goroutines": 343, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 945.06, + "requests": 30567760, + "failures": 0, + "heapBytes": 4157600, + "rssBytes": 22609920, + "goroutines": 266, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 960.06, + "requests": 31051568, + "failures": 0, + "heapBytes": 4455056, + "rssBytes": 22544384, + "goroutines": 369, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 975.06, + "requests": 31534567, + "failures": 0, + "heapBytes": 6660704, + "rssBytes": 22876160, + "goroutines": 271, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 990.06, + "requests": 32010137, + "failures": 0, + "heapBytes": 6978528, + "rssBytes": 22081536, + "goroutines": 359, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1005.06, + "requests": 32497005, + "failures": 0, + "heapBytes": 6214880, + "rssBytes": 21352448, + "goroutines": 252, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1020.06, + "requests": 32977986, + "failures": 0, + "heapBytes": 4009360, + "rssBytes": 21745664, + "goroutines": 265, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1035.06, + "requests": 33456000, + "failures": 0, + "heapBytes": 6263808, + "rssBytes": 23236608, + "goroutines": 344, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1050.06, + "requests": 33943796, + "failures": 0, + "heapBytes": 4312032, + "rssBytes": 22126592, + "goroutines": 316, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1065.06, + "requests": 34422999, + "failures": 0, + "heapBytes": 4311080, + "rssBytes": 21950464, + "goroutines": 237, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1080.06, + "requests": 34905892, + "failures": 0, + "heapBytes": 4459192, + "rssBytes": 22847488, + "goroutines": 378, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1095.06, + "requests": 35387063, + "failures": 0, + "heapBytes": 4965536, + "rssBytes": 22679552, + "goroutines": 272, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1110.06, + "requests": 35872523, + "failures": 0, + "heapBytes": 7317240, + "rssBytes": 22810624, + "goroutines": 356, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 1125.06, + "requests": 36357886, + "failures": 0, + "heapBytes": 7180144, + "rssBytes": 23207936, + "goroutines": 379, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 1140.06, + "requests": 36847661, + "failures": 0, + "heapBytes": 6535800, + "rssBytes": 22257664, + "goroutines": 260, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1155.06, + "requests": 37333781, + "failures": 0, + "heapBytes": 4758968, + "rssBytes": 21053440, + "goroutines": 261, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1170.06, + "requests": 37819005, + "failures": 0, + "heapBytes": 5854656, + "rssBytes": 22798336, + "goroutines": 266, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1185.06, + "requests": 38302079, + "failures": 0, + "heapBytes": 6477368, + "rssBytes": 23130112, + "goroutines": 231, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1200.06, + "requests": 38781438, + "failures": 0, + "heapBytes": 4912296, + "rssBytes": 22179840, + "goroutines": 291, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1215.06, + "requests": 39266527, + "failures": 0, + "heapBytes": 6723304, + "rssBytes": 22417408, + "goroutines": 267, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1230.06, + "requests": 39747087, + "failures": 0, + "heapBytes": 4455048, + "rssBytes": 22949888, + "goroutines": 282, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1245.06, + "requests": 40229194, + "failures": 0, + "heapBytes": 7650552, + "rssBytes": 22667264, + "goroutines": 314, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1260.06, + "requests": 40719856, + "failures": 0, + "heapBytes": 5024096, + "rssBytes": 21934080, + "goroutines": 327, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1275.06, + "requests": 41201734, + "failures": 0, + "heapBytes": 4340216, + "rssBytes": 22867968, + "goroutines": 372, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1290.06, + "requests": 41687427, + "failures": 0, + "heapBytes": 6020200, + "rssBytes": 22179840, + "goroutines": 356, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1305.06, + "requests": 42169416, + "failures": 0, + "heapBytes": 5102400, + "rssBytes": 21901312, + "goroutines": 284, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1320.06, + "requests": 42649854, + "failures": 0, + "heapBytes": 5587144, + "rssBytes": 23244800, + "goroutines": 257, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 1335.061, + "requests": 43134689, + "failures": 0, + "heapBytes": 7256936, + "rssBytes": 22966272, + "goroutines": 247, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1350.06, + "requests": 43615393, + "failures": 0, + "heapBytes": 7194832, + "rssBytes": 23044096, + "goroutines": 370, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1365.06, + "requests": 44094551, + "failures": 0, + "heapBytes": 4162944, + "rssBytes": 22044672, + "goroutines": 298, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1380.06, + "requests": 44581507, + "failures": 0, + "heapBytes": 5801200, + "rssBytes": 21823488, + "goroutines": 266, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1395.06, + "requests": 45066149, + "failures": 0, + "heapBytes": 4212824, + "rssBytes": 22265856, + "goroutines": 359, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 1410.06, + "requests": 45549300, + "failures": 0, + "heapBytes": 4478232, + "rssBytes": 21921792, + "goroutines": 340, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1425.06, + "requests": 46035904, + "failures": 0, + "heapBytes": 6875824, + "rssBytes": 22740992, + "goroutines": 249, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1440.06, + "requests": 46519641, + "failures": 0, + "heapBytes": 6247888, + "rssBytes": 21938176, + "goroutines": 291, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1455.06, + "requests": 46997264, + "failures": 0, + "heapBytes": 7072560, + "rssBytes": 23109632, + "goroutines": 377, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1470.06, + "requests": 47482230, + "failures": 0, + "heapBytes": 5093112, + "rssBytes": 23351296, + "goroutines": 392, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1485.06, + "requests": 47955814, + "failures": 0, + "heapBytes": 5715440, + "rssBytes": 22499328, + "goroutines": 350, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1500.06, + "requests": 48434219, + "failures": 0, + "heapBytes": 5736984, + "rssBytes": 22720512, + "goroutines": 336, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 1515.06, + "requests": 48911328, + "failures": 0, + "heapBytes": 7415632, + "rssBytes": 22880256, + "goroutines": 256, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 1530.06, + "requests": 49400802, + "failures": 0, + "heapBytes": 3811240, + "rssBytes": 21762048, + "goroutines": 347, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1545.06, + "requests": 49885035, + "failures": 0, + "heapBytes": 4371400, + "rssBytes": 22343680, + "goroutines": 374, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 3 + } + }, + { + "phase": "running", + "elapsedSeconds": 1560.06, + "requests": 50365248, + "failures": 0, + "heapBytes": 4201696, + "rssBytes": 23511040, + "goroutines": 324, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1575.06, + "requests": 50845851, + "failures": 0, + "heapBytes": 4646712, + "rssBytes": 22171648, + "goroutines": 274, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1590.06, + "requests": 51332514, + "failures": 0, + "heapBytes": 4957128, + "rssBytes": 22810624, + "goroutines": 264, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 0 + } + }, + { + "phase": "running", + "elapsedSeconds": 1605.06, + "requests": 51818521, + "failures": 0, + "heapBytes": 5534424, + "rssBytes": 22429696, + "goroutines": 361, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1620.06, + "requests": 52303713, + "failures": 0, + "heapBytes": 5460112, + "rssBytes": 22978560, + "goroutines": 264, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1635.06, + "requests": 52785633, + "failures": 0, + "heapBytes": 6919824, + "rssBytes": 22196224, + "goroutines": 293, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1650.06, + "requests": 53270255, + "failures": 0, + "heapBytes": 6976928, + "rssBytes": 22519808, + "goroutines": 273, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1665.06, + "requests": 53754584, + "failures": 0, + "heapBytes": 6265560, + "rssBytes": 23269376, + "goroutines": 300, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1680.06, + "requests": 54243260, + "failures": 0, + "heapBytes": 6019184, + "rssBytes": 22319104, + "goroutines": 304, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1695.06, + "requests": 54727233, + "failures": 0, + "heapBytes": 6646888, + "rssBytes": 22794240, + "goroutines": 289, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1710.06, + "requests": 55211460, + "failures": 0, + "heapBytes": 7514304, + "rssBytes": 22654976, + "goroutines": 345, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1725.06, + "requests": 55691054, + "failures": 0, + "heapBytes": 4597656, + "rssBytes": 21585920, + "goroutines": 337, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 26 + } + }, + { + "phase": "running", + "elapsedSeconds": 1740.06, + "requests": 56175794, + "failures": 0, + "heapBytes": 5366888, + "rssBytes": 22618112, + "goroutines": 240, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1755.06, + "requests": 56657414, + "failures": 0, + "heapBytes": 5976448, + "rssBytes": 22413312, + "goroutines": 393, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1770.06, + "requests": 57140848, + "failures": 0, + "heapBytes": 4945864, + "rssBytes": 23572480, + "goroutines": 276, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 2 + } + }, + { + "phase": "running", + "elapsedSeconds": 1785.06, + "requests": 57624110, + "failures": 0, + "heapBytes": 4265224, + "rssBytes": 22007808, + "goroutines": 164, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 1 + } + }, + { + "phase": "running", + "elapsedSeconds": 1800.06, + "requests": 58102348, + "failures": 0, + "heapBytes": 5912816, + "rssBytes": 21807104, + "goroutines": 333, + "fileDescriptors": 9, + "stats": { + "acceptedConnections": 1, + "rejectedConnections": 0, + "rejectedRequests": 0, + "protocolErrors": 0, + "goAwaySent": 0, + "rstStreams": 0, + "goAwayFrames": 0, + "activeConnections": 1, + "activeRequests": 13 + } + } + ], + "notes": [ + "30-minute ordinary Go run with 128 workers on one reused TLS HTTP/2 connection.", + "Loopback client and server share one test process and the same 2-CPU container quota.", + "RSS, heap and goroutines include both client and server; this is not a server-only production throughput benchmark.", + "MiB uses 1024*1024 bytes. Linux RSS and Go heap are sampled every 15 seconds, not continuous peaks.", + "Every response validates HTTP/2, status, path content and a unique request ID.", + "Workload includes 10ms slow handlers and 64KiB request bodies; it does not simulate slow network clients.", + "The after sample includes one monitor goroutine that is stopped and joined before test return.", + "The full HTTP/2 acceptance matrix remains open: multi-connection/slow-client soak and proxy GOAWAY/drain behavior need separate evidence." + ], + "rawLog": "http2SoakLinux.txt", + "cleanup": { + "testContainerRemoved": true, + "preExistingContainersStillRunning": 7 + } +} diff --git a/performance/http2SoakLinux.txt b/performance/http2SoakLinux.txt new file mode 100644 index 0000000..8b6fe80 --- /dev/null +++ b/performance/http2SoakLinux.txt @@ -0,0 +1,133 @@ +HTTP/2 Linux soak image: golang:1.25 +HTTP/2 TLS soak duration: 30m +HTTP/2 TLS soak mode: regular +HTTP/2 soak container: go-omni-http2-soak-b8d45477120a; limits: 2 CPUs, 2048 MiB, 256 tasks +go: downloading golang.org/x/net v0.25.0 +go: downloading golang.org/x/text v0.15.0 +=== RUN TestTLSSoak + soak_test.go:33: phase=before elapsed=0s requests=0 failures=0 heapBytes=168680 rssBytes=8441856 goroutines=2 fileDescriptors=6 stats={AcceptedConnections:0 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:0 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=15.06s requests=483494 failures=0 heapBytes=6913536 rssBytes=22216704 goroutines=240 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=30.06s requests=961350 failures=0 heapBytes=6818840 rssBytes=22302720 goroutines=327 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=45.06s requests=1434755 failures=0 heapBytes=5234048 rssBytes=21180416 goroutines=267 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=1m0.06s requests=1917020 failures=0 heapBytes=3959208 rssBytes=21983232 goroutines=256 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=1m15.06s requests=2405587 failures=0 heapBytes=6696432 rssBytes=22294528 goroutines=355 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=1m30.06s requests=2893800 failures=0 heapBytes=5880824 rssBytes=21860352 goroutines=335 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=1m45.06s requests=3381213 failures=0 heapBytes=4176008 rssBytes=22257664 goroutines=331 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=2m0.06s requests=3867826 failures=0 heapBytes=6923296 rssBytes=22417408 goroutines=299 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=2m15.06s requests=4355136 failures=0 heapBytes=4863216 rssBytes=22257664 goroutines=331 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=2m30.06s requests=4844005 failures=0 heapBytes=4875168 rssBytes=22208512 goroutines=352 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=2m45.06s requests=5331034 failures=0 heapBytes=4053832 rssBytes=22085632 goroutines=354 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=3m0.061s requests=5824954 failures=0 heapBytes=7276088 rssBytes=22253568 goroutines=276 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=3m15.06s requests=6316211 failures=0 heapBytes=6082672 rssBytes=22413312 goroutines=340 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=3m30.06s requests=6795314 failures=0 heapBytes=6157488 rssBytes=22106112 goroutines=266 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=3m45.06s requests=7279828 failures=0 heapBytes=6538536 rssBytes=22454272 goroutines=296 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=4m0.06s requests=7763620 failures=0 heapBytes=5209696 rssBytes=22003712 goroutines=371 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=4m15.06s requests=8245520 failures=0 heapBytes=4119296 rssBytes=22532096 goroutines=325 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=4m30.06s requests=8728841 failures=0 heapBytes=6352704 rssBytes=22863872 goroutines=336 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=4m45.06s requests=9206490 failures=0 heapBytes=5696104 rssBytes=21614592 goroutines=227 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=5m0.06s requests=9692044 failures=0 heapBytes=6982152 rssBytes=22798336 goroutines=266 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=5m15.06s requests=10181610 failures=0 heapBytes=4842816 rssBytes=23273472 goroutines=233 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=5m30.06s requests=10674122 failures=0 heapBytes=4987832 rssBytes=21663744 goroutines=390 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=5m45.06s requests=11158495 failures=0 heapBytes=4861520 rssBytes=21594112 goroutines=255 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=6m0.06s requests=11643125 failures=0 heapBytes=6995288 rssBytes=22351872 goroutines=370 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=6m15.06s requests=12134189 failures=0 heapBytes=5791656 rssBytes=22269952 goroutines=322 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=6m30.06s requests=12617974 failures=0 heapBytes=4615832 rssBytes=22204416 goroutines=293 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=6m45.06s requests=13109107 failures=0 heapBytes=6241656 rssBytes=22806528 goroutines=331 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=7m0.06s requests=13597755 failures=0 heapBytes=4717608 rssBytes=22777856 goroutines=355 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=7m15.06s requests=14082999 failures=0 heapBytes=7078376 rssBytes=23724032 goroutines=352 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=7m30.06s requests=14573956 failures=0 heapBytes=4402216 rssBytes=21753856 goroutines=364 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=7m45.06s requests=15062222 failures=0 heapBytes=5805904 rssBytes=22765568 goroutines=366 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=8m0.06s requests=15550159 failures=0 heapBytes=6706008 rssBytes=22376448 goroutines=332 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=8m15.06s requests=16032745 failures=0 heapBytes=5471120 rssBytes=22126592 goroutines=318 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=8m30.061s requests=16516193 failures=0 heapBytes=7097144 rssBytes=22880256 goroutines=365 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=8m45.061s requests=16995862 failures=0 heapBytes=5984144 rssBytes=22609920 goroutines=288 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=9m0.06s requests=17480917 failures=0 heapBytes=5254728 rssBytes=22745088 goroutines=284 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=9m15.06s requests=17969665 failures=0 heapBytes=5609544 rssBytes=22839296 goroutines=264 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=9m30.06s requests=18456021 failures=0 heapBytes=4073608 rssBytes=22032384 goroutines=291 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=9m45.06s requests=18943865 failures=0 heapBytes=5703584 rssBytes=22515712 goroutines=250 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=10m0.06s requests=19427994 failures=0 heapBytes=4484904 rssBytes=23121920 goroutines=286 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=10m15.06s requests=19911036 failures=0 heapBytes=5654336 rssBytes=22589440 goroutines=330 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=10m30.06s requests=20398330 failures=0 heapBytes=7287736 rssBytes=22564864 goroutines=262 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=10m45.06s requests=20885304 failures=0 heapBytes=4866728 rssBytes=22773760 goroutines=340 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=11m0.06s requests=21377882 failures=0 heapBytes=4500144 rssBytes=22474752 goroutines=197 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=11m15.06s requests=21859381 failures=0 heapBytes=4837744 rssBytes=22278144 goroutines=346 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=11m30.06s requests=22340499 failures=0 heapBytes=4255808 rssBytes=22675456 goroutines=265 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=11m45.06s requests=22831603 failures=0 heapBytes=7122880 rssBytes=22138880 goroutines=322 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=12m0.06s requests=23322670 failures=0 heapBytes=4139848 rssBytes=22515712 goroutines=325 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=12m15.06s requests=23810489 failures=0 heapBytes=6155784 rssBytes=22671360 goroutines=281 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=12m30.06s requests=24298600 failures=0 heapBytes=6864792 rssBytes=22568960 goroutines=196 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=12m45.06s requests=24784321 failures=0 heapBytes=3708712 rssBytes=22278144 goroutines=295 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=13m0.06s requests=25270364 failures=0 heapBytes=5901032 rssBytes=22634496 goroutines=337 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=13m15.06s requests=25748374 failures=0 heapBytes=5453384 rssBytes=22368256 goroutines=313 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=13m30.06s requests=26231067 failures=0 heapBytes=7024176 rssBytes=22790144 goroutines=259 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=13m45.06s requests=26712235 failures=0 heapBytes=6159920 rssBytes=23277568 goroutines=332 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=14m0.06s requests=27192429 failures=0 heapBytes=6571248 rssBytes=22429696 goroutines=281 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=14m15.06s requests=27674241 failures=0 heapBytes=5498824 rssBytes=22700032 goroutines=307 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=14m30.06s requests=28161405 failures=0 heapBytes=7281776 rssBytes=22188032 goroutines=365 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=14m45.06s requests=28643479 failures=0 heapBytes=5348280 rssBytes=22425600 goroutines=257 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=15m0.06s requests=29126808 failures=0 heapBytes=7028080 rssBytes=23273472 goroutines=264 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=15m15.06s requests=29606183 failures=0 heapBytes=5075368 rssBytes=21872640 goroutines=363 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=15m30.06s requests=30083605 failures=0 heapBytes=5377456 rssBytes=22351872 goroutines=343 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=15m45.06s requests=30567760 failures=0 heapBytes=4157600 rssBytes=22609920 goroutines=266 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=16m0.06s requests=31051568 failures=0 heapBytes=4455056 rssBytes=22544384 goroutines=369 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=16m15.06s requests=31534567 failures=0 heapBytes=6660704 rssBytes=22876160 goroutines=271 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=16m30.06s requests=32010137 failures=0 heapBytes=6978528 rssBytes=22081536 goroutines=359 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=16m45.06s requests=32497005 failures=0 heapBytes=6214880 rssBytes=21352448 goroutines=252 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=17m0.06s requests=32977986 failures=0 heapBytes=4009360 rssBytes=21745664 goroutines=265 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=17m15.06s requests=33456000 failures=0 heapBytes=6263808 rssBytes=23236608 goroutines=344 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=17m30.06s requests=33943796 failures=0 heapBytes=4312032 rssBytes=22126592 goroutines=316 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=17m45.06s requests=34422999 failures=0 heapBytes=4311080 rssBytes=21950464 goroutines=237 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=18m0.06s requests=34905892 failures=0 heapBytes=4459192 rssBytes=22847488 goroutines=378 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=18m15.06s requests=35387063 failures=0 heapBytes=4965536 rssBytes=22679552 goroutines=272 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=18m30.06s requests=35872523 failures=0 heapBytes=7317240 rssBytes=22810624 goroutines=356 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=18m45.06s requests=36357886 failures=0 heapBytes=7180144 rssBytes=23207936 goroutines=379 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=19m0.06s requests=36847661 failures=0 heapBytes=6535800 rssBytes=22257664 goroutines=260 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=19m15.06s requests=37333781 failures=0 heapBytes=4758968 rssBytes=21053440 goroutines=261 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=19m30.06s requests=37819005 failures=0 heapBytes=5854656 rssBytes=22798336 goroutines=266 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=19m45.06s requests=38302079 failures=0 heapBytes=6477368 rssBytes=23130112 goroutines=231 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=20m0.06s requests=38781438 failures=0 heapBytes=4912296 rssBytes=22179840 goroutines=291 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=20m15.06s requests=39266527 failures=0 heapBytes=6723304 rssBytes=22417408 goroutines=267 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=20m30.06s requests=39747087 failures=0 heapBytes=4455048 rssBytes=22949888 goroutines=282 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=20m45.06s requests=40229194 failures=0 heapBytes=7650552 rssBytes=22667264 goroutines=314 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=21m0.06s requests=40719856 failures=0 heapBytes=5024096 rssBytes=21934080 goroutines=327 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=21m15.06s requests=41201734 failures=0 heapBytes=4340216 rssBytes=22867968 goroutines=372 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=21m30.06s requests=41687427 failures=0 heapBytes=6020200 rssBytes=22179840 goroutines=356 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=21m45.06s requests=42169416 failures=0 heapBytes=5102400 rssBytes=21901312 goroutines=284 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=22m0.06s requests=42649854 failures=0 heapBytes=5587144 rssBytes=23244800 goroutines=257 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=22m15.061s requests=43134689 failures=0 heapBytes=7256936 rssBytes=22966272 goroutines=247 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=22m30.06s requests=43615393 failures=0 heapBytes=7194832 rssBytes=23044096 goroutines=370 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=22m45.06s requests=44094551 failures=0 heapBytes=4162944 rssBytes=22044672 goroutines=298 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=23m0.06s requests=44581507 failures=0 heapBytes=5801200 rssBytes=21823488 goroutines=266 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=23m15.06s requests=45066149 failures=0 heapBytes=4212824 rssBytes=22265856 goroutines=359 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=23m30.06s requests=45549300 failures=0 heapBytes=4478232 rssBytes=21921792 goroutines=340 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=23m45.06s requests=46035904 failures=0 heapBytes=6875824 rssBytes=22740992 goroutines=249 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=24m0.06s requests=46519641 failures=0 heapBytes=6247888 rssBytes=21938176 goroutines=291 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=24m15.06s requests=46997264 failures=0 heapBytes=7072560 rssBytes=23109632 goroutines=377 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=24m30.06s requests=47482230 failures=0 heapBytes=5093112 rssBytes=23351296 goroutines=392 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=24m45.06s requests=47955814 failures=0 heapBytes=5715440 rssBytes=22499328 goroutines=350 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=25m0.06s requests=48434219 failures=0 heapBytes=5736984 rssBytes=22720512 goroutines=336 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=25m15.06s requests=48911328 failures=0 heapBytes=7415632 rssBytes=22880256 goroutines=256 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=25m30.06s requests=49400802 failures=0 heapBytes=3811240 rssBytes=21762048 goroutines=347 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=25m45.06s requests=49885035 failures=0 heapBytes=4371400 rssBytes=22343680 goroutines=374 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:3} + soak_test.go:96: phase=running elapsed=26m0.06s requests=50365248 failures=0 heapBytes=4201696 rssBytes=23511040 goroutines=324 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=26m15.06s requests=50845851 failures=0 heapBytes=4646712 rssBytes=22171648 goroutines=274 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=26m30.06s requests=51332514 failures=0 heapBytes=4957128 rssBytes=22810624 goroutines=264 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:0} + soak_test.go:96: phase=running elapsed=26m45.06s requests=51818521 failures=0 heapBytes=5534424 rssBytes=22429696 goroutines=361 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=27m0.06s requests=52303713 failures=0 heapBytes=5460112 rssBytes=22978560 goroutines=264 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=27m15.06s requests=52785633 failures=0 heapBytes=6919824 rssBytes=22196224 goroutines=293 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=27m30.06s requests=53270255 failures=0 heapBytes=6976928 rssBytes=22519808 goroutines=273 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=27m45.06s requests=53754584 failures=0 heapBytes=6265560 rssBytes=23269376 goroutines=300 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=28m0.06s requests=54243260 failures=0 heapBytes=6019184 rssBytes=22319104 goroutines=304 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=28m15.06s requests=54727233 failures=0 heapBytes=6646888 rssBytes=22794240 goroutines=289 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=28m30.06s requests=55211460 failures=0 heapBytes=7514304 rssBytes=22654976 goroutines=345 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=28m45.06s requests=55691054 failures=0 heapBytes=4597656 rssBytes=21585920 goroutines=337 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:26} + soak_test.go:96: phase=running elapsed=29m0.06s requests=56175794 failures=0 heapBytes=5366888 rssBytes=22618112 goroutines=240 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=29m15.06s requests=56657414 failures=0 heapBytes=5976448 rssBytes=22413312 goroutines=393 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=29m30.06s requests=57140848 failures=0 heapBytes=4945864 rssBytes=23572480 goroutines=276 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:2} + soak_test.go:96: phase=running elapsed=29m45.06s requests=57624110 failures=0 heapBytes=4265224 rssBytes=22007808 goroutines=164 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:1} + soak_test.go:96: phase=running elapsed=30m0.06s requests=58102348 failures=0 heapBytes=5912816 rssBytes=21807104 goroutines=333 fileDescriptors=9 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:0 RSTStreams:0 GoAwayFrames:0 ActiveConnections:1 ActiveRequests:13} + soak_test.go:166: phase=after elapsed=30m0.067s requests=58102476 failures=0 heapBytes=4154504 rssBytes=21807104 goroutines=3 fileDescriptors=6 stats={AcceptedConnections:1 RejectedConnections:0 RejectedRequests:0 ProtocolErrors:0 GoAwaySent:1 RSTStreams:0 GoAwayFrames:0 ActiveConnections:0 ActiveRequests:0} +--- PASS: TestTLSSoak (1800.07s) +PASS +ok git.yuntuo.hk/k2safe/go-omni/transport/http2 1800.073s +PASS HTTP/2 TLS soak diff --git a/transport/http2/admission_test.go b/transport/http2/admission_test.go new file mode 100644 index 0000000..3222db5 --- /dev/null +++ b/transport/http2/admission_test.go @@ -0,0 +1,116 @@ +package http2 + +import ( + "context" + "crypto/tls" + "io" + "net" + "net/http" + "sync/atomic" + "testing" + "time" + + xhttp2 "golang.org/x/net/http2" +) + +func TestTLSConnectionLimitRecoversAfterHandshakeTimeout(t *testing.T) { + certificate, roots := testCertificate(t) + var handled atomic.Int32 + server := New(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + handled.Add(1) + _, _ = io.WriteString(writer, "ok") + })) + server.MaxConnections = 1 + server.TLSHandshakeTimeout = time.Second + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + done := make(chan error, 1) + go func() { + done <- server.ServeTLS(context.Background(), listener, &tls.Config{ + Certificates: []tls.Certificate{certificate}, MinVersion: tls.VersionTLS12, + }) + }() + t.Cleanup(func() { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + if err := server.Shutdown(ctx); err != nil { + t.Errorf("shutdown: %v", err) + } + _ = listener.Close() + if err := serveResult(t, done); err != nil { + t.Errorf("serve: %v", err) + } + }) + + // Occupy the only connection slot without sending a TLS ClientHello. + held, err := net.DialTimeout("tcp", listener.Addr().String(), time.Second) + if err != nil { + t.Fatal(err) + } + defer held.Close() + waitHTTP2Stats(t, server, func(stats Stats) bool { return stats.ActiveConnections == 1 }) + + rejected, err := net.DialTimeout("tcp", listener.Addr().String(), time.Second) + if err != nil { + t.Fatal(err) + } + defer rejected.Close() + if err := rejected.SetReadDeadline(time.Now().Add(250 * time.Millisecond)); err != nil { + t.Fatal(err) + } + var buffer [1]byte + if _, err := rejected.Read(buffer[:]); err == nil { + t.Fatal("connection above the cap was not closed") + } else if timeout, ok := err.(net.Error); ok && timeout.Timeout() { + t.Fatal("connection above the cap was not rejected promptly") + } + if stats := server.Stats(); stats.RejectedConnections != 1 || handled.Load() != 0 { + t.Fatalf("unexpected admission state: %+v handled=%d", stats, handled.Load()) + } + + // The handshake deadline, rather than a client disconnect, must release it. + waitHTTP2Stats(t, server, func(stats Stats) bool { return stats.ActiveConnections == 0 }) + if err := held.SetReadDeadline(time.Now().Add(250 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if _, err := held.Read(buffer[:]); err == nil { + t.Fatal("timed-out TLS connection remained open") + } else if timeout, ok := err.(net.Error); ok && timeout.Timeout() { + t.Fatal("timed-out TLS connection was not closed") + } + + transport := &xhttp2.Transport{TLSClientConfig: &tls.Config{ + RootCAs: roots, ServerName: "localhost", MinVersion: tls.VersionTLS12, + NextProtos: []string{"h2"}, + }} + defer transport.CloseIdleConnections() + client := &http.Client{Transport: transport, Timeout: 3 * time.Second} + response, err := client.Get("https://" + listener.Addr().String() + "/health") + if err != nil { + t.Fatal(err) + } + body, readErr := io.ReadAll(response.Body) + response.Body.Close() + if readErr != nil || response.StatusCode != http.StatusOK || response.ProtoMajor != 2 || string(body) != "ok" { + t.Fatalf("TLS admission did not recover: status=%d protocol=%s body=%q err=%v", response.StatusCode, response.Proto, body, readErr) + } + transport.CloseIdleConnections() + waitHTTP2Stats(t, server, func(stats Stats) bool { return stats.ActiveConnections == 0 && stats.ActiveRequests == 0 }) + if stats := server.Stats(); stats.AcceptedConnections != 3 || stats.RejectedConnections != 1 || stats.ProtocolErrors != 0 || handled.Load() != 1 { + t.Fatalf("unexpected recovered admission state: %+v handled=%d", stats, handled.Load()) + } +} + +func waitHTTP2Stats(t *testing.T, server *Server, predicate func(Stats) bool) { + t.Helper() + deadline := time.Now().Add(3 * time.Second) + for time.Now().Before(deadline) { + if predicate(server.Stats()) { + return + } + time.Sleep(time.Millisecond) + } + t.Fatalf("HTTP/2 stats did not reach expected state: %+v", server.Stats()) +} diff --git a/transport/http2/flowControl_test.go b/transport/http2/flowControl_test.go new file mode 100644 index 0000000..6824b15 --- /dev/null +++ b/transport/http2/flowControl_test.go @@ -0,0 +1,129 @@ +package http2 + +import ( + "fmt" + "io" + "net/http" + "strings" + "testing" + "time" + + xhttp2 "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" +) + +// A zero receive window simulates a client that has stopped consuming DATA. +// Headers need no flow-control credit, so a 204 on another stream should still +// complete while the large response waits for a WINDOW_UPDATE or cancellation. +func TestSlowResponseStreamIsolationAndRecovery(t *testing.T) { + payload := strings.Repeat("x", 32<<10) + started := make(chan struct{}, 2) + written := make(chan error, 2) + server := New(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + if request.URL.Path == "/health" { + writer.WriteHeader(http.StatusNoContent) + return + } + if request.URL.Path == "/ready" { + _, _ = io.WriteString(writer, "ready") + return + } + writer.Header().Set("Content-Length", fmt.Sprint(len(payload))) + writer.(http.Flusher).Flush() + started <- struct{}{} + _, err := io.WriteString(writer, payload) + written <- err + })) + server.MaxConnections = 2 + server.MaxConcurrentRequests = 2 + address, stop := startServer(t, server) + defer stop() + + slow := newFramePeer(t, address, xhttp2.Setting{ID: xhttp2.SettingInitialWindowSize, Val: 0}) + defer slow.Close() + slow.framer.ReadMetaHeaders = hpack.NewDecoder(4096, nil) + slow.get(t, 1, "/large") + waitSignal(t, started) + + // The same TCP connection can still carry response headers for other streams. + slow.get(t, 3, "/health") + readNoContent(t, slow, 3) + select { + case err := <-written: + t.Fatalf("large response escaped the zero stream window: %v", err) + default: + } + + // A second connection also remains usable while the first handler is blocked. + fast := newFramePeer(t, address) + defer fast.Close() + fast.framer.ReadMetaHeaders = hpack.NewDecoder(4096, nil) + fast.get(t, 1, "/ready") + if body := fast.body(t, 1); body != "ready" { + t.Fatalf("other connection response: %q", body) + } + if stats := server.Stats(); stats.ActiveConnections != 2 || stats.RejectedRequests != 0 { + t.Fatalf("slow response affected other traffic: %+v", stats) + } + + // Restoring stream credit must resume the existing response without reconnecting. + if err := slow.framer.WriteWindowUpdate(1, uint32(len(payload))); err != nil { + t.Fatal(err) + } + if body := slow.body(t, 1); body != payload { + t.Fatalf("resumed response mismatch: got %d bytes, want %d", len(body), len(payload)) + } + select { + case err := <-written: + if err != nil { + t.Fatalf("resumed write: %v", err) + } + case <-time.After(time.Second): + t.Fatal("resumed write did not return") + } + + // A new zero-window stream must release its handler when the client cancels. + slow.get(t, 5, "/large") + waitSignal(t, started) + if err := slow.framer.WriteRSTStream(5, xhttp2.ErrCodeCancel); err != nil { + t.Fatal(err) + } + select { + case err := <-written: + if err == nil { + t.Fatal("canceled zero-window write unexpectedly succeeded") + } + case <-time.After(time.Second): + t.Fatal("RST_STREAM did not unblock the writer") + } + + slow.get(t, 7, "/health") + readNoContent(t, slow, 7) + deadline := time.Now().Add(time.Second) + for server.Stats().ActiveRequests != 0 && time.Now().Before(deadline) { + time.Sleep(time.Millisecond) + } + if stats := server.Stats(); stats.ActiveRequests != 0 || stats.RSTStreams != 1 || stats.ProtocolErrors != 0 || stats.RejectedRequests != 0 { + t.Fatalf("flow control did not recover: %+v", stats) + } +} + +func readNoContent(t *testing.T, peer *framePeer, streamID uint32) { + t.Helper() + for { + switch frame := peer.read(t).(type) { + case *xhttp2.MetaHeadersFrame: + if frame.StreamID != streamID { + continue + } + if frame.PseudoValue("status") != "204" || !frame.StreamEnded() { + t.Fatalf("stream %d: expected complete 204, got %+v", streamID, frame) + } + return + case *xhttp2.DataFrame: + t.Fatalf("unexpected DATA on zero-window stream %d", frame.StreamID) + case *xhttp2.RSTStreamFrame: + t.Fatalf("unexpected server reset: %+v", frame) + } + } +} diff --git a/transport/http2/lifecycle_test.go b/transport/http2/lifecycle_test.go index 6037b46..10adcde 100644 --- a/transport/http2/lifecycle_test.go +++ b/transport/http2/lifecycle_test.go @@ -20,7 +20,7 @@ type framePeer struct { framer *xhttp2.Framer } -func newFramePeer(t *testing.T, address string) *framePeer { +func newFramePeer(t *testing.T, address string, settings ...xhttp2.Setting) *framePeer { t.Helper() c, err := net.DialTimeout("tcp", address, time.Second) if err != nil { @@ -32,7 +32,7 @@ func newFramePeer(t *testing.T, address string) *framePeer { if _, err = io.WriteString(c, xhttp2.ClientPreface); err != nil { t.Fatal(err) } - if err = p.framer.WriteSettings(); err != nil { + if err = p.framer.WriteSettings(settings...); err != nil { t.Fatal(err) } return p diff --git a/transport/native/HTTP2.md b/transport/native/HTTP2.md index 930ddf1..06ac209 100644 --- a/transport/native/HTTP2.md +++ b/transport/native/HTTP2.md @@ -4,6 +4,8 @@ 当前已提供独立的 `transport/http2` 实验 Runner。它已经验证 TLS/h2、h2c、本地连接和请求闸门、GOAWAY 排空以及 RST_STREAM 取消;这些结果用于验证生命周期设计,不代表 native 已经启用 HTTP/2。实验 Runner 还覆盖了默认 1 MiB 头部上限、8 MiB 请求体上限、128 路同连接 stream 多路复用,以及 2 MiB 慢读取 body 在窗口耗尽后的恢复。`TestTLSSoak` 默认运行 3 秒,Linux 长测通过 `python3 scripts/verifyHTTP2.py --duration 30m` 启动。 +2026-09-23 已在 Linux amd64 完成单 TLS 连接、128 个 worker 的 30 分钟长测:58,102,476 次请求,0 失败与协议错误,采样 RSS 峰值约 22.6 MiB,退出后连接、活动请求和 FD 回收。测试容器限制为 2 核、2 GiB,测量包含同一进程中的客户端与服务端,见 [报告](../../performance/http2SoakLinux.json)。本次包含慢 Handler 与 64 KiB body;多连接、持续慢客户端及代理 HTTP/2 回源验收仍未完成。 + ## 目标边界 - HTTP/2 必须作为显式 opt-in 协议,不改变 `omni.New()`、`transport/nethttp` 或 native HTTP/1.1 的默认行为。 @@ -28,10 +30,10 @@ HTTP/2 版本需要在 native `Stats` 之外至少记录:活动 stream、被 - TLS ALPN:只协商 `h2`,HTTP/1.1 客户端仍由现有 native 路径处理;不支持的 ALPN 在握手前后都不会误入错误解析器。 - 多路复用:一个连接并发至少 128 个 stream,响应和 requestId 不串线,单个慢 stream 不阻塞其他 stream(实验 Runner 已覆盖 128 路同连接 stream)。 -- 流控:慢读取、慢写、窗口耗尽和大 body 都能恢复;内存不会随未消费 body 无限增长(实验 Runner 已覆盖 2 MiB 慢读取 body 和请求体上限)。 +- 流控:慢读取、慢写、窗口耗尽和大 body 都能恢复;内存不会随未消费 body 无限增长。实验 Runner 已覆盖 2 MiB 慢读取 body 和请求体上限,以及客户端将 stream 窗口设为零时的大响应阻塞、同连接 204、其他连接带 body 响应、WINDOW_UPDATE 恢复发送和 RST_STREAM 取消回收;连接级窗口耗尽和持续慢客户端混合长测仍需补齐。 - 取消:RST_STREAM、客户端断开、服务关闭分别只影响应受影响的请求,并能在 metrics 中看到回收;当前实验 Runner 已覆盖 RST_STREAM 与服务关闭。 -- 背压:连接上限、全局 stream 上限、单连接 stream 上限和 header/body 上限均能快速拒绝并自动恢复。 -- 代理联调:Nginx/Cloudflare 的 TLS、Keep-Alive、超时、GOAWAY 和优雅发布行为与 HTTP/1.1 回源结果一致。 -- 长测:Linux amd64 至少 30 分钟 TLS、多连接、多 stream、慢客户端混合场景;要求 0 协议错误、0 请求串线,连接、stream、goroutine 和 FD 在停止后回收。 +- 背压:连接上限、全局 stream 上限、单连接 stream 上限和 header/body 上限均能快速拒绝并自动恢复。实验 Runner 已增加 TLS 未完成握手占满连接槽位时的及时拒绝、握手超时回收及后续正常 HTTPS 请求恢复验收。 +- 代理联调:Nginx/Cloudflare 的 TLS、Keep-Alive、超时、GOAWAY 和优雅发布行为与 HTTP/1.1 回源结果一致。现有 `verifyProxy.py` 检查边缘 HTTP/2 协商与 native HTTP/1.1 TLS 回源,不构成 HTTP/2 上游 GOAWAY/排空的验收依据。 +- 长测:Linux amd64 至少 30 分钟 TLS、多连接、多 stream、慢客户端混合场景;要求 0 协议错误、0 请求串线,连接、stream、goroutine 和 FD 在停止后回收。单连接 30 分钟场景已通过,完整混合场景仍待验证。 只有上述矩阵完成,才把 `h2` 加入 native 的 TLS ALPN,并考虑把 HTTP/2 作为独立版本能力发布。此前生产环境使用 Nginx/Cloudflare 终止 HTTP/2 后以 HTTP/1.1 回源,或使用支持 HTTP/2 的 `transport/nethttp`。