<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Peak-Average-Ratio on Tarragon</title><link>https://tarrragon.github.io/blog/tags/peak-average-ratio/</link><description>Recent content in Peak-Average-Ratio on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 03 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/peak-average-ratio/index.xml" rel="self" type="application/rss+xml"/><item><title>流量模型建立</title><link>https://tarrragon.github.io/blog/devops/05-capacity-planning/traffic-model/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/devops/05-capacity-planning/traffic-model/</guid><description>&lt;p>流量模型是容量規劃的輸入：它把「這個服務會收到什麼樣的流量」量化成幾個可測量的維度，後面的峰值估算、壓測、資源規格與成本，全部從這個模型推出。模型建錯，後面每一步都在錯誤的前提上算。所以容量規劃的第一步是先把流量長什麼樣描述清楚，而不是急著估要開幾台機器。&lt;/p>
&lt;p>一個完整的流量模型至少量五個維度：平均與峰值的比值、時間上的分布、用戶的分布、操作的分布、以及突發的型態。少量任何一維，模型就會在某個情境下失準——最常見的失準是「模型撐得住、production 撐不住」，那幾乎都是漏了某個維度。&lt;/p>
&lt;h2 id="峰均比是工程意義最大的單一指標">峰均比是工程意義最大的單一指標&lt;/h2>
&lt;p>峰均比（peak/average ratio）是峰值流量除以平均流量，它一個數字就決定了容量要按平均規劃還是按峰值規劃。峰均比 1.5 左右的服務流量平緩，容量可以接近平均值來配、不必大幅超額；峰均比 3 到 5 的服務是 bursty 的，必須按峰值規劃，代價是平日大幅超額配置、多數時間資源閒置。&lt;/p>
&lt;p>這兩種型態的差距在真實服務裡很極端。一個大型電商的公開大促案例，當天 24 小時收 1.67 億請求、峰值 3500 RPS，峰均比約 1.8——算溫和型，按峰值配一點超額就穩。搶票型服務則是另一個極端：整批票 5 分鐘賣完，峰值全集中在開賣的瞬間，峰均比比平緩型高出一個數量級以上，這種流量沒辦法靠「平均值加係數」規劃，得專門為那 5 分鐘設計。峰均比先算出來，才知道自己在哪一端。&lt;/p>
&lt;h2 id="同一秒內怎麼到達比每秒平均更決定壓力">同一秒內怎麼到達，比每秒平均更決定壓力&lt;/h2>
&lt;p>平均 RPS 只說了「每秒幾個請求」，沒說這些請求在那一秒內怎麼分布。同樣是每秒 1000 個請求，均勻到達（接近 Poisson）跟集中在幾十毫秒內爆發（bursty）對系統的壓力完全不同——bursty 的到達會在瞬間打滿連線池、塞爆佇列，即使每秒平均看起來還在容量內。&lt;/p>
&lt;p>所以流量模型要標到達型態，不能只記平均 RPS。bursty 的來源在真實服務裡很具體：一則推播同時喚醒幾百萬 app、一個 KOL 的推廣連結、一部新片上架、一則突發新聞。這些都會製造「平均看起來沒事、瞬間打爆」的流量。模型漏掉到達型態，壓測時用均勻流量測、上線遇到 bursty 就垮。&lt;/p>
&lt;h2 id="操作分布決定容量往哪裡堆">操作分布決定容量往哪裡堆&lt;/h2>
&lt;p>讀寫比直接改變容量該往哪個資源堆。90% 讀的服務跟 50% 讀的服務，容量設計完全不同——讀重的可以靠快取擋掉大部分負載，寫重的擋不了快取、壓力直接落在儲存層的 IOPS。同樣的總 RPS，讀重的瓶頸在快取容量、寫重的瓶頸在磁碟寫入，規劃的方向相反。&lt;/p>
&lt;p>操作分布還要看端點的組合（endpoint mix）跟請求大小的分布。不同端點的成本差幾個數量級，把它們當成等重的請求來估容量會嚴重失準；請求大小（payload size）的分布則影響網路頻寬與序列化成本，要按端點、按用戶分層各自算 percentile，而不是用一個平均值蓋過去。&lt;/p>
&lt;h2 id="從-production-log-抽出可信的模型">從 production log 抽出可信的模型&lt;/h2>
&lt;p>流量模型的來源是真實流量，不是憑感覺估的。從 production 抽模型分四步：先蒐集資料（從 access log、APM trace、metric 系統採樣，涵蓋至少一個完整的週期——含平日、週末、峰谷），再分組統計（按端點、按租戶分組，各算 percentile、標到達型態、算 payload 分布），接著做序列重播（保留請求之間的到達間隔，讓 burst 在壓測時能重現，而不只是灌一個平均 RPS），最後脫敏（雜湊加鹽、但保持資料的 cardinality——不同值的數量、例如有幾個不同的用戶 ID——跟 production 一致，否則快取命中率會失真）。&lt;/p>
&lt;p>抽出來的模型要驗證。拿模型去壓測，比對四類指標跟 production 是否吻合：吞吐型態（總 RPS 加端點組合）、延遲分布（p50/p95/p99）、資源使用率、錯誤與重試型態。若模型在測試環境撐得住、production 卻撐不住，代表漏了維度，要回到蒐集階段補——這個「模型過關但實境失守」的偏差，是流量模型最該防的失準。&lt;/p>
&lt;h2 id="用-littles-law-把流量翻成並發">用 Little&amp;rsquo;s Law 把流量翻成並發&lt;/h2>
&lt;p>流量模型的一個直接用途是反推系統要準備多少並發容量，工具是 Little&amp;rsquo;s Law：&lt;code>L = λ × W&lt;/code>，並發數等於到達率乘以每個請求停留的時間。這條關係在穩態下恆成立、不需要任何分布假設。舉例：到達率 1000 RPS、每個請求平均停留 200 毫秒，穩態並發就是 &lt;code>1000 × 0.2 = 200&lt;/code>——這個 200 直接對應要準備多大的連線池、執行緒池或非同步 worker 數。&lt;/p>
&lt;p>反過來用也成立：一個卡在固定大小的連線池（L）加上已知的處理延遲（W），可以算出它最多支撐多少 RPS。Little&amp;rsquo;s Law 讓「流量」跟「資源規格」之間有一條可計算的橋，不必靠猜。&lt;/p>
&lt;h2 id="模型會過時要定期重抽">模型會過時，要定期重抽&lt;/h2>
&lt;p>流量模型是某個時間點的快照，會隨服務演進失效。失效的訊號很具體：新功能改變了用戶動線、進入新市場改變了用戶組成（例如打進行動優先的市場、mobile 佔比大增）、一場行銷活動改變了 burst 型態、或用戶習慣的長期轉變（遠距工作改變了平日與週末的比例）。&lt;/p>
&lt;p>最劇烈的失效是結構性的流量位移——一個視訊服務在疫情期間流量漲到平時的 30 倍，且不會回落，baseline 永久上移。這種情況舊模型整個作廢，要以新的 baseline 重抽，而不是在舊模型上加係數。維護的節奏是每季 review 一次、遇到重大改動立即重抽。模型不維護，容量規劃就是拿過期的流量在算未來的資源。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>把峰值從模型推出來、加多少安全係數 → &lt;a href="https://tarrragon.github.io/blog/devops/05-capacity-planning/peak-estimation/" data-link-title="峰值估算" data-link-desc="要估一個服務的峰值該準備多少時，先分清峰值屬於哪一種形狀、再用歷史倍率階梯與安全係數推算，並知道安全係數的數學根據在飽和曲線">峰值估算&lt;/a>&lt;/li>
&lt;li>用壓測工具驗證這個模型撐不撐得住 → &lt;a href="https://tarrragon.github.io/blog/devops/05-capacity-planning/load-testing-tools/" data-link-title="壓力測試工具與方法" data-link-desc="要用壓測驗證容量規劃時，釐清壓測到底在找什麼、k6 與 wrk 各自的定位、怎麼讀壓測輸出的延遲分布，以及讓結果失真的幾個反模式">壓力測試工具與方法&lt;/a>&lt;/li>
&lt;li>上游的效能理論與 workload modeling 完整方法 → &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/workload-modeling/" data-link-title="9.2 Workload Modeling" data-link-desc="把 production traffic shape 翻成可重播的壓測模型">backend 效能容量&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>流量模型是容量規劃的輸入：它把「這個服務會收到什麼樣的流量」量化成幾個可測量的維度，後面的峰值估算、壓測、資源規格與成本，全部從這個模型推出。模型建錯，後面每一步都在錯誤的前提上算。所以容量規劃的第一步是先把流量長什麼樣描述清楚，而不是急著估要開幾台機器。</p>
<p>一個完整的流量模型至少量五個維度：平均與峰值的比值、時間上的分布、用戶的分布、操作的分布、以及突發的型態。少量任何一維，模型就會在某個情境下失準——最常見的失準是「模型撐得住、production 撐不住」，那幾乎都是漏了某個維度。</p>
<h2 id="峰均比是工程意義最大的單一指標">峰均比是工程意義最大的單一指標</h2>
<p>峰均比（peak/average ratio）是峰值流量除以平均流量，它一個數字就決定了容量要按平均規劃還是按峰值規劃。峰均比 1.5 左右的服務流量平緩，容量可以接近平均值來配、不必大幅超額；峰均比 3 到 5 的服務是 bursty 的，必須按峰值規劃，代價是平日大幅超額配置、多數時間資源閒置。</p>
<p>這兩種型態的差距在真實服務裡很極端。一個大型電商的公開大促案例，當天 24 小時收 1.67 億請求、峰值 3500 RPS，峰均比約 1.8——算溫和型，按峰值配一點超額就穩。搶票型服務則是另一個極端：整批票 5 分鐘賣完，峰值全集中在開賣的瞬間，峰均比比平緩型高出一個數量級以上，這種流量沒辦法靠「平均值加係數」規劃，得專門為那 5 分鐘設計。峰均比先算出來，才知道自己在哪一端。</p>
<h2 id="同一秒內怎麼到達比每秒平均更決定壓力">同一秒內怎麼到達，比每秒平均更決定壓力</h2>
<p>平均 RPS 只說了「每秒幾個請求」，沒說這些請求在那一秒內怎麼分布。同樣是每秒 1000 個請求，均勻到達（接近 Poisson）跟集中在幾十毫秒內爆發（bursty）對系統的壓力完全不同——bursty 的到達會在瞬間打滿連線池、塞爆佇列，即使每秒平均看起來還在容量內。</p>
<p>所以流量模型要標到達型態，不能只記平均 RPS。bursty 的來源在真實服務裡很具體：一則推播同時喚醒幾百萬 app、一個 KOL 的推廣連結、一部新片上架、一則突發新聞。這些都會製造「平均看起來沒事、瞬間打爆」的流量。模型漏掉到達型態，壓測時用均勻流量測、上線遇到 bursty 就垮。</p>
<h2 id="操作分布決定容量往哪裡堆">操作分布決定容量往哪裡堆</h2>
<p>讀寫比直接改變容量該往哪個資源堆。90% 讀的服務跟 50% 讀的服務，容量設計完全不同——讀重的可以靠快取擋掉大部分負載，寫重的擋不了快取、壓力直接落在儲存層的 IOPS。同樣的總 RPS，讀重的瓶頸在快取容量、寫重的瓶頸在磁碟寫入，規劃的方向相反。</p>
<p>操作分布還要看端點的組合（endpoint mix）跟請求大小的分布。不同端點的成本差幾個數量級，把它們當成等重的請求來估容量會嚴重失準；請求大小（payload size）的分布則影響網路頻寬與序列化成本，要按端點、按用戶分層各自算 percentile，而不是用一個平均值蓋過去。</p>
<h2 id="從-production-log-抽出可信的模型">從 production log 抽出可信的模型</h2>
<p>流量模型的來源是真實流量，不是憑感覺估的。從 production 抽模型分四步：先蒐集資料（從 access log、APM trace、metric 系統採樣，涵蓋至少一個完整的週期——含平日、週末、峰谷），再分組統計（按端點、按租戶分組，各算 percentile、標到達型態、算 payload 分布），接著做序列重播（保留請求之間的到達間隔，讓 burst 在壓測時能重現，而不只是灌一個平均 RPS），最後脫敏（雜湊加鹽、但保持資料的 cardinality——不同值的數量、例如有幾個不同的用戶 ID——跟 production 一致，否則快取命中率會失真）。</p>
<p>抽出來的模型要驗證。拿模型去壓測，比對四類指標跟 production 是否吻合：吞吐型態（總 RPS 加端點組合）、延遲分布（p50/p95/p99）、資源使用率、錯誤與重試型態。若模型在測試環境撐得住、production 卻撐不住，代表漏了維度，要回到蒐集階段補——這個「模型過關但實境失守」的偏差，是流量模型最該防的失準。</p>
<h2 id="用-littles-law-把流量翻成並發">用 Little&rsquo;s Law 把流量翻成並發</h2>
<p>流量模型的一個直接用途是反推系統要準備多少並發容量，工具是 Little&rsquo;s Law：<code>L = λ × W</code>，並發數等於到達率乘以每個請求停留的時間。這條關係在穩態下恆成立、不需要任何分布假設。舉例：到達率 1000 RPS、每個請求平均停留 200 毫秒，穩態並發就是 <code>1000 × 0.2 = 200</code>——這個 200 直接對應要準備多大的連線池、執行緒池或非同步 worker 數。</p>
<p>反過來用也成立：一個卡在固定大小的連線池（L）加上已知的處理延遲（W），可以算出它最多支撐多少 RPS。Little&rsquo;s Law 讓「流量」跟「資源規格」之間有一條可計算的橋，不必靠猜。</p>
<h2 id="模型會過時要定期重抽">模型會過時，要定期重抽</h2>
<p>流量模型是某個時間點的快照，會隨服務演進失效。失效的訊號很具體：新功能改變了用戶動線、進入新市場改變了用戶組成（例如打進行動優先的市場、mobile 佔比大增）、一場行銷活動改變了 burst 型態、或用戶習慣的長期轉變（遠距工作改變了平日與週末的比例）。</p>
<p>最劇烈的失效是結構性的流量位移——一個視訊服務在疫情期間流量漲到平時的 30 倍，且不會回落，baseline 永久上移。這種情況舊模型整個作廢，要以新的 baseline 重抽，而不是在舊模型上加係數。維護的節奏是每季 review 一次、遇到重大改動立即重抽。模型不維護，容量規劃就是拿過期的流量在算未來的資源。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把峰值從模型推出來、加多少安全係數 → <a href="/blog/devops/05-capacity-planning/peak-estimation/" data-link-title="峰值估算" data-link-desc="要估一個服務的峰值該準備多少時，先分清峰值屬於哪一種形狀、再用歷史倍率階梯與安全係數推算，並知道安全係數的數學根據在飽和曲線">峰值估算</a></li>
<li>用壓測工具驗證這個模型撐不撐得住 → <a href="/blog/devops/05-capacity-planning/load-testing-tools/" data-link-title="壓力測試工具與方法" data-link-desc="要用壓測驗證容量規劃時，釐清壓測到底在找什麼、k6 與 wrk 各自的定位、怎麼讀壓測輸出的延遲分布，以及讓結果失真的幾個反模式">壓力測試工具與方法</a></li>
<li>上游的效能理論與 workload modeling 完整方法 → <a href="/blog/backend/09-performance-capacity/workload-modeling/" data-link-title="9.2 Workload Modeling" data-link-desc="把 production traffic shape 翻成可重播的壓測模型">backend 效能容量</a></li>
</ul>
]]></content:encoded></item></channel></rss>