# 量測資料說明

實驗日期：2026-10-28。PostgreSQL 16.13、Python 3.11.2、asyncpg 0.31.0、Linux/aarch64、Raspberry Pi 5。
透過同一台機器的Unix socket連線。資料庫上限為0.5 CPU / 768MiB，用戶端另設0.5 CPU / 256MiB。CPU限額週期為10ms。
使用20,000列資料，暖機後執行唯讀實驗。shared_buffers=64MiB、work_mem=1MiB、停用JIT與平行查詢，max_connections固定為110。
連線池5/20/100條連線均在量測前全部建立並事先執行SQL。

## 檔案與欄位

- summary.csv：每個條件的全部量測值彙總。light各7,200次，heavy/heavy_burst各1,440次。
- runs.csv：27次量測的彙總，以run_id對應各請求。
- requests.csv：30,240筆原始請求量測，不含內部主機名稱、帳號、絕對時刻或憑證。

light：每5ms以主鍵查詢1列（每秒200次）。
heavy：每25ms對2,000列執行MD5彙總（每秒40次）。
heavy_burst：相同彙總，每250ms發送10次（每秒40次）。
每次先暖機2秒，再執行12秒的預定發送。每個條件重複3次，輪換連線池順序。觀察全部預定請求直到完成。每秒速率以觀測秒數為分母，並非最大處理能力。

scheduled_s、start_s、end_s為相對每次量測開始的秒數。
latency_ms為預定發送至連線歸還完成，等於schedule_lag_ms、pool_wait_ms、query_roundtrip_ms、release_ms的總和。
query_roundtrip_ms是用戶端觀察的往返時間，並非資料庫內部純粹的SQL執行時間。
release_ms包含asyncpg標準連線重設。worker為相容用途欄位，固定為0。

本文的「較慢一側的回應時間」是量測值排序後的第`ceil(筆數×0.99)`個值，儲存在`latency_p99_ms`等既有CSV欄位；欄位名稱與數值不變。
summary.csv合併每個條件3次的全部請求計算，並非各次值的平均。
`run_p99_min_ms`與`run_p99_max_ms`是3次以相同方法求得的值的最小／最大值，並非信賴區間。
區間平均是全部請求的算術平均；不能把各區間較慢一側的值相加，當作整體的較慢一側回應時間。

db_cpu_cores與client_cpu_cores以1代表1個核心：將usage_usec增量轉成秒，再除以觀測秒數。每個條件的CPU值以觀測秒數加權，db_cpu_quota_percent以0.5核心上限為100%。
db_throttled_periods_percent是cpu.stat的nr_throttled增量除以nr_periods增量，並非延遲時間的比例。
db_memory_mib先平均每次開始／結束的memory.current，再平均3次量測。包含共享記憶體與頁面快取，不是每條連線的專屬記憶體。
max_concurrent_query_roundtrips_derived是從用戶端區間推算的最大同時往返數，不是資料庫內同時使用CPU的數量。

## 量測區塊邊界

r01～r11後因安全監控而停止。r12～r27重建相同設定與資料的臨時資料庫後執行。
恢復時僅將量測結束後的連線關閉改為依序進行，量測期間的SQL、發送排程、資源上限與暖機方式不變。
這不是一次連續完成的實驗，也未分離共享主機的變動影響。更早的closed-loop預備試驗不包含在彙總中。

## SQL

```sql
CREATE UNLOGGED TABLE pool_lab (
  id integer PRIMARY KEY, balance integer NOT NULL, payload text NOT NULL
);
INSERT INTO pool_lab
SELECT i, i % 1000, repeat(md5(i::text), 4)
FROM generate_series(1, 20000) AS i;
VACUUM ANALYZE pool_lab;
```

輕量查詢：`SELECT balance FROM pool_lab WHERE id = $1`。
較重查詢：`SELECT sum(length(md5(payload || id::text))) FROM pool_lab WHERE id BETWEEN $1 AND $1+1999`。
以每次量測的請求序號sequence計算，light的$1為`(sequence*193)%20000+1`，其餘為`(sequence*193)%18001+1`。兩種SQL不混合，各條件分開量測。

規格參考：[asyncpg](https://magicstack.github.io/asyncpg/current/api/index.html#connection-pools)、[PostgreSQL 16](https://www.postgresql.org/docs/16/runtime-config-connection.html)、[Linux cgroup v2](https://docs.kernel.org/admin-guide/cgroup-v2.html#cpu-interface-files)。
