返回文章

緩慢接收與 API 回應的實驗資料

測量日期為 2026-11-02。文章數值僅統計正式測量。

條件

Linux 6.12 / aarch64 / glibc 2.36、CPython 3.11.2、Gunicorn 23.0.0、NGINX 1.22.1(Debian 1.22.1-9+deb12u10)。

檔案與統計

API 延遲圖的點是 3 次中位數,線是最小至最大值。寫入/接收長條圖取低速 2 連線共 6 個回應的中位數;黑點是個別寫入時間。時序圖各路徑選 p95 居中的一次。各圖已標示不同的統計單位。

重現

標準函式庫測量程式需要 Linux systemd 使用者服務與 cgroup v2。prepare 下載 Debian bookworm-security arm64 索引與發行檔,解壓到專用目錄,不在主機安裝套件。使用的是當前索引,因此重跑時的 NGINX 套件可能與測量時不同。要完全一致,請確認 dependencies.json 的 URL 與 SHA-256。

以下範例假設 Linux 主機符合原始條件,且有足夠資源。這不是對既有服務或叢集套用設定的步驟。

lab_root=$(mktemp -d /tmp/kamui-slow-client-XXXXXXXX)
cp app.py experiment.py "$lab_root/"
python3 "$lab_root/experiment.py" --root "$lab_root" --stage prepare
lab_unit="$(basename "$lab_root")-controller.service"
systemd-run --user --wait --pipe --collect --unit "$lab_unit" \
  -p CPUQuota=20% -p CPUQuotaPeriodSec=10ms -p MemoryMax=128M \
  -p MemorySwapMax=0 -p TasksMax=24 -p RuntimeMaxSec=720 -p TimeoutStopSec=3 \
  /usr/bin/python3 "$lab_root/experiment.py" --root "$lab_root" \
  --stage main --controller-unit "$lab_unit"

程式會在 finally 停止各次測量的伺服器。結束後先收集結果,確認本實驗專用服務與行程都已結束,再只清理自己建立的專用暫存目錄。

排除項目與限制

8MiB/1MiB/s 與 16MiB 的探索性預備測量不混入正式統計。由 8MiB/1MiB/s 改成 16MiB/2MiB/s,同時改了回應大小與讀取速率,不能把差異歸因於大小。正式測量曾因整台主機 CPU 超過門檻而安全停止一次;排除未完成測量,保留完成的 17 次,再續跑 13 次,安全門檻與應用程式條件未變。

receive_s 量到每次讀取後的速率調整等待完成,包括最後一次讀取後的等待。因此約 8 秒包含節奏控制,不是真實網路的純傳輸效能。gthread 輔助條件同時改變 worker 模型、行程數與並行處理數,無法分離模型效果或找出最佳處理數。

應用程式是未使用框架的手寫 WSGI。未比較 Flask、Django、FastAPI、非同步模式或實際 PaaS 服務配置。未蒐集個別 TCP 緩衝區用量或 worker 堆疊,必須區分實測寫入時間、API 延遲、暫存檔案與依規格做的解釋。

這不是對所有條件施壓至最大吞吐量的實驗。未測量 OS 各 TCP 緩衝區容量、TCP_INFO、真實網際網路、TLS、HTTP/2/3、SSE、WebSocket、緩慢上傳、長時間、大量連線或磁碟耗盡。不能保證其他 Web 伺服器或 PaaS 的效能。

Markdown