Puls of and latency
Puls of and latency
1) Ինչո՞ ւ է անհրաժեշտ փամփուշտները
Միացությունները թանկ են (TCP/TMS handshakes, վավերացում, warm-up)։ Փուլը թույլ է տալիս
Օգտագործեք պատրաստի կոննեկտներ (keep-alive) TTFB-ից ցածր։
Վերահսկել զուգահեռականությունը և տալ backpressure-ի փոխարեն։
Նվազեցնել պոչերը p95/p99 ճիշտ չափի և թայմաուտների պատճառով։
Հիմնական ռիսկերը 'փամփուշտի, head-of-blocking-ի սպասման հերթերը, կոննեկտների և գետերի փոթորիկների համար։
2) Մաթեմատիկայի հիմքը 'ինչպես հաշվել փամփուշտի չափը
Մենք օգտագործում ենք Լիթլի օրենքը '«L = now.W»։ Փամփուշտի համար դա նշանակում է
«07» -ը հարցումների միջին հոսքն է (RPS)։
«W» -ը հարցման միջին զբաղվածությունն է (Time-ը, ներառյալ ցանցային լատենտությունը և հեռավոր հեռակառավարման աշխատանքը)։
Փամփուշտի նվազագույն չափը '«N _ min nower.W»։
Ավելացրեք պահուստը տատանումների տակ և p99: headrope 20-50 տոկոսը։
Օրինակ ՝ 300 RPS, միջին hold-time 40 no _ N _ min = 300-0։ 04 = 12`. Պահուստով 50 տոկոսը 18 կոննեկտներ են։
Եթե պոչերը մեծ են, հաշվի առեք «W _ p95» կամ «W _ p99» կրիտիկական ճանապարհների համար, փամփուշտները աճում են։
3) Նախագծման ընդհանուր սկզբունքները
1. Կարճ տվյալների ճանապարհը 'reuse (keep-alive, HTTP/2/3 բազմաֆիլմացիա)։
2. Զուգահեռականության սահմանափակումը 'ավելի լավ հրաժարվել արագ (429/503) քան սեղմել backend։
3. Timauts> retray: Տեղադրել փոքրիկ թայմաուտներ և հազվագյուտ հետքեր ջիթերի հետ։
4. Հաճախորդի հերթերը կարճ են, քան սերվերը (արագ fail-fox)։
5. Backpressure: Երբ փամփուշտը լցված է, անմիջապես NACK/սխալ/կոլեկցիոներ «ավելի ուշ»։
6. Փամփուշտների մեկուսացումը նպատակներով 'DB, kash, արտաքին PSA-ները' իրենց սահմանները։
4) HTTP/1. 1 vs HTTP/2/3, keep-alive
HTTP/1. 1: մեկ հարցումը միևնույն ժամանակ (գրեթե); պետք է փամփուշտը մի քանի կոննեկտներով։
HTTP/2 'հոսքերի բազմապատկումը մեկ TCP-ում; ավելի քիչ կոնեկտներ, բայց հնարավոր է HOL-blocking TCP-ում, երբ պարտքը կորցնում է։
HTTP/3 (QUIC) 'UDP-ի վրա հոսող անկախությունը ավելի քիչ HOL խնդիրներ է, ավելի արագ առաջին բայթերը։
Մոսկվան, որոնք օգնում են
keep-alive-alive timeout 30-90s (ըստ ալյումինի), ձիու պահանջների սահմանափակում (graceful recycle)։
Preconnect (preconnect), երբ գողը սկսում է։
Հոսքերի սահմանափակումը HTTP/2 վրա (օրինակ, 100-200)։
NGINX (upstream keepalive):nginx upstream backend {
server app-1:8080;
server app-2:8080;
keepalive 512;
keepalive_requests 1000;
keepalive_timeout 60s;
}
proxy_http_version 1. 1;
proxy_set_header Connection "";
Envoy (HTTP/2 pool):
yaml http2_protocol_options:
max_concurrent_streams: 200 common_http_protocol_options:
idle_timeout: 60s max_connection_duration: 3600s
5) BD 'PgBouncer, HikariCP, վարորդներ
Նպատակը սահմանափակելն է մրցակցային գործարքները և կարճ պահելը։
5. 1 PgBouncer (PostgreSQL)
Ռեժիմները ՝ «session »/« transaction »/« stations»։ API-ի համար ավելի հաճախ transaction է։
Կարևոր պարամետրեր ՝ «pool _ size», «min _ pool _ size», «reserve _ pool _ size», «server _ idle _ timeout», «query _ wait _ timeout»։
ini
[databases]
appdb = host=pg-primary port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction max_client_conn = 5000 default_pool_size = 100 min_pool_size = 20 reserve_pool_size = 20 query_wait_timeout = 500ms server_idle_timeout = 60 server_reset_query = DISCARD ALL
5. 2 HikariCP (Java)
Փոքր, արագ կոնեկտներ, կոշտ թայմաուտներ։
properties dataSourceClassName=org. postgresql. ds. PGSimpleDataSource maximumPoolSize=30 minimumIdle=5 connectionTimeout=250 validationTimeout=200 idleTimeout=30000 maxLifetime=1800000 leakDetectionThreshold=5000
Կանոնները
`maximumPoolSize ≈ RPS × W × headroom`.
«connational Timeout» հարյուրավոր միլիմետրեր, ոչ վայրկյաններ։
Միացրեք leak detics-ը։
5. 3 Go/Node/Python - օրինակներ
Go http. Client (reuse + timeouts):go tr:= &http. Transport{
MaxIdleConns: 512,
MaxIdleConnsPerHost: 128,
IdleConnTimeout: 60 time. Second,
TLSHandshakeTimeout: 2 time. Second,
}
c:= &http. Client{
Transport: tr,
Timeout: 2 time. Second ,//general
}
Node. js keep-alive գործակալ
js const http = require('http');
const agent = new http. Agent({ keepAlive: true, maxSockets: 200, maxFreeSockets: 64, timeout: 60000 });
psycopg / SQLAlchemy (Python):
python engine = create_engine(
url, pool_size=30, max_overflow=10, pool_recycle=1800, pool_pre_ping=True, pool_timeout=0. 25
)
6) Սպասման հերթերը և tail-latency-ը
Պոչերը առաջանում են, երբ
Փամփուշտը ավելի քիչ է, քան «W- ն» աճում է կոննեկտի սպասման հերթը։
Բեռի անհավասարությունը (bursts) առանց ածխաջրածինների և լիմիտների։
Երկար հարցումները զբաղեցնում են ձիավարություն և ստեղծում են HOL-ը։
Ֆինանսական միջոցներ
Կիսեք պուլերը հարցումների տեսակների վրա (արագ/դանդաղ)։
Ներդրեք կոննեկտի սպասման թայմաուտը (client-side)։ Եթե ավարտը արագ NACK-ն է։
Medier detics և circuit-breaking երթուղիներում (Envoy, HAProxy)։
Քվոտաները «ծանր» երթուղիների վրա, առանձին փամփուշտը 108/105 համար։
Envoy circuit breaker (օրինակ)
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 200 max_pending_requests: 100 max_requests: 1000 max_retries: 2
7) Թայմաուտները և գետերը (ճիշտ կարգը)
1. Connational timeout (կարճ ՝ 50-250 ռուբլիներ DC-ի ներսում)։
2. TLS handshake timeout (500–1000 ms вне DC).
3. Request/Read timeout (ավելի մոտ SLO 71)։
4. Retry 'առավելագույնը 1 անգամ, միայն idempotent մեթոդների համար։ Ջիթթեր + backoff.
5. Budget-ի վրա 'գլոբալ սահմանը RPS-ի տոկոսներում (օրինակ ՝ 10%)։
8) Keep-alive, Nagle, արձանագրություն,
Անջատեք Nagle (TCP _ NODELAY) RPC-ի համար փոքր հաղորդագրություններով։
Միացրեք HTTP keep-alive-ը ամենուր, որտեղ հնարավոր է։
Հետևեք TIME _ WAIT-ին 'tune' reuse '/' recycle "միայն եթե հասկանում եք հետևանքները։ ավելի լավ 'reuse connects, ոչ թե միջուկի թյունինգ։
TFC 'օգտագործեք session resumption և ALPN։
9) OS/Kernel tuning (զգուշությամբ)
`net. core. somaxconn`, `net. ipv4. ip_local_port_range`, `net. ipv4. tcp_fin_timeout`.
Էսքիզներ ՝ «nofile» 3664k գործընթացի վրա։
IRQ-ի հավասարակշռությունը, GRO/LRO-ը 'ֆոսֆորով։
Առաջնահերթությունը ավելացնելն է։ թյունինգը առանց մեթրիկի հաճախ վնասում է։
10) Նկատողությունն այն է, որ ինչ չափել
Pool utilization: զբաղված/ընդհանուր, p50/p95 կոննեկտի սպասումներ։
In-flight հարցումները և նրանց hold-time (հատվածները երթուղիներով)։
Error budget Retrav-ը կրկնապատկիչների մասն է։
Connationchurn: Ստեղծում/105 վայրկյանում։
TCP/TLS: SYN RTT, handshakes, session reuse.
Для БД: active connections, waiting, long transactions, locks.
Графики: «RPS vs pool wait», «hold-time distribution», «reuse ratio», «circuit trips».
11) Քեյս բաղադրատոմսեր
11. 1 API դարպաս no backend
HTTP/2 դեպի backends, «max _ concurrent _ streams = 200»։
Պուլ 20-40 կոնեկտներ ծառայելու համար դարպասի հանգույցի վրա։
Թայմաուտները ՝ connational 100.1, per-try 300-500.1, ընդհանուր 1-2s, 1 retry հետ։
11. 2 PostgreSQL ծառայության PgBouncer միջոցով
«pool _ mode = transaction», «բանաձևը _ pool _ size» բանաձևով (RPS 35W 351։ 3).
Connational Timeout-ում 250.1 ", կարճ գործարքներ (<100.1)։
Զեկույցի ծանր հարցումները առանձին փամփուշտներ/կրկնօրինակներ են։
11. 3 GRPC ներքին
Մեկ ջրանցք (HTTP/2) 100-200 հոսքերի սահմանաչափով։
Deadium-ում RPC-ում SLO-ի վրա տեղադրված է, միայն idempotent-ը։
Sampling treiss երկար RPC-ի և hold-time-ի մետրերի համար։
12) Ներդրման թուղթ (0-30 օր)
0-7 օր
Չափեք «W» (hold-time) հիմնական երթուղիներում/հաճախորդների վրա։
Հաշվեք 'N _ min = www.W "և ավելացրեք 30-50 տոկոսը headrome։
Միացրեք keep-alive-ը և կարճ թայմաուտները կոննեկտին սպասելու համար։
8-20 օր
Կիսեք փամփուշտները (արագ/դանդաղ/արտաքին)։
Մուտքագրեք circuit-breakers և budgets retav։
Ավելացնել dashbords: pool wait p95, reuse ratio, in-flight։
21-30 օր
Բուրգերի, քաոս-թեստ «բեկենդների նվազում»։
Պոչերի օպտիմիզացումը 'ծանր երթուղիների մեկուսացումը, տեղական քեշները։
Փաստաթղթավորեք բանաձևերը և սահմանները runbook 'ax-ում։
13) Anti-patterna
«Նաուգադի» փամփուշտի չափը և headrope-ի բացակայությունը։
Ձիասպորտի սպասման մեծ թայմաուտները արագ ձախողումների փոխարեն երկար պոչեր են տալիս։
Շատ գետեր առանց ջիտերի և կուռքերի։
Մեկ ընդհանուր փամփուշտը բոլոր տեսակի հարցումների վրա։
Երկար գործարքները պահում են կոննեկտը (DB) հաստատվում են մնացած starvation։
Անջատված keep-alive կամ չափազանց փոքր idle churn և TTFB աճը։
14) Հասունության մետրերը
Pool wait p95 վաճառքում <10 տոկոսը ընդհանուր p95 ռուբլիից։
Reuse ratio (> 90 տոկոսը ներքին HTTP;> 80 տոկոսը արտաքին համար)։
DB txn time p95 < 100–200 ms; երկար գործարքների մասնաբաժինը <1%։
Retry rate <5% (և www.budget), timeouts-ի սխալները կայուն և կանխատեսելի են։
Փամփուշտի փաստաթղթավորված հաշվարկը բոլոր քննադատական հաճախորդների համար։
15) Եզրակացություն
International pooling-ը հերթափոխի ինժեներություն է + թայմաուտների կարգապահություն։ Չափեք 'W', հաշվեք փամփուշտը 'www.W.' պահուստով, միացրեք keep-alive/HTTP2 +, անջատեք դանդաղ ճանապարհները, պահեք կարճ թայմաուտներ և նվազագույն հոսանքներ ջիթերի հետ։ Ավելացրեք «pool wait vs latency» և circuit-breakers, և կստանաք ցածր TTFB, որը վերահսկվում է p99 պոչի և առանց backends տաքացման դիմադրության։