GH GambleHub

연결 수영장 및 대기 시간

연결 수영장 및 대기 시간

1) 수영장이 필요한 이유

연결 비용이 많이 듭니다 ( 수영장은 다음을 허용합

TTFB 이하의 기성품 연결 (유지) → 재사용.
동시성을 제어하고 후퇴의 눈사태 대신 역압을줍니다.
정확한 크기와 타임 아웃으로 인해 p95/p99 테일을 줄입니다.

주요 위험: 수영장의 대기 대기 대기 대기, 헤드 오브 라인 차단, 연결 내용 및 후퇴 폭풍.

2) 수학 기반: 수영장 크기를 계산하는 방법

우리는 Little의 법칙을 사용합니다: 'L = λ× W'. 수영장의 경우 다음을 의미합니다

'λ' 는 평균 요청 스트림 (RPS) 입니다.
'W' 는 요청 당 평균 연결 바쁘다 (네트워크 대기 시간 및 원격 서비스 운영을 포함한 서비스 시간).

최소 풀 크기는 'N _ min

변형 및 p99에 대한 마진을 추가하십시오: 헤드 룸 20-50%.
예: 300 RPS, 평균 홀드 타임 40ms → 'N _ min = 300 × 0. 04 = 12`. 50% 의 마진으로 18 개의 연결은 → 입니다.

꼬리가 크면 중요한 경로에 대해 'W _ p95' 또는 'W _ p99' 를 고려하십시오. 수영장이 커집니다.

3) 일반 설계 원칙

1. 짧은 데이터 경로: 재사용 (계속 살아 있음, HTT/2/3 멀티플렉싱).
2. 병렬 처리의 제한: 백엔드를 튀기는 것보다 빨리 거부하는 것이 좋습니다 (429/503).
3. 타임 아웃> 후퇴: 작은 타임 아웃 및 희귀 지터 후퇴 설정.
4. 클라이언트 대기열은 서버 대기열보다 짧습니다 (빠른 실패).
5. 역압: 수영장이 가득 차면 즉시 NACK/오류/콜벡이 "나중에" 나옵니다.
6. 대상별 수영장 격리: DB, 캐시, 외부 PSP-한계.

4) HTT/1. 1 vs 해/2/3, 계속 살아있다

HTT/1. 1: 한 번에 하나의 연결 요청 (실제로); 호스트 당 여러 개의 연결이있는 풀이 필요합니다.
TP/2: 하나의 TCP에서 멀티플렉싱 스트림; 연결이 적지 만 패킷이 손실되면 TCP에서 HOL 차단이 가능합니다.
HTP/3 (QUIC): UDP를 통한 독립성 스트리밍-더 적은 HOL 문제, 더 빠른 첫 바이트.

도움이되는 설정:
  • 유지 시간 초과 30-90 (프로필 별), 연결 요청 제한 (우아한 재활용).
  • 작업자의 시작시 예열 (사전 연결).
  • HTT/2 당 최대 흐름을 제한합니다 (예: 100-200).
NGINX (업스트림 기념품):
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 "";
특사 (TH/2 풀):
yaml http2_protocol_options:
max_concurrent_streams: 200 common_http_protocol_options:
idle_timeout: 60s max_connection_duration: 3600s

5) DB 풀: PgBouncer, HikariCP, 드라이버

목표는 경쟁력있는 거래를 제한하고 짧은 연결 유지를 유지하는 것입니다.

5. 1 PgBouncer (PostgreSQL)

모드: '세션 '/' 트랜잭션 '/' 명세서'. API의 경우-더 자주 트랜잭션됩니다.
중요한 매개 변수는 'pool _ size', 'min _ pool _ size', 'reserve _ pool _ size', 'server _ yube _ 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 히카리 CP (자바)

작고 빠른 연결, 어려운 타임 아웃.

properties dataSourceClassName=org. postgresql. ds. PGSimpleDataSource maximumPoolSize=30 minimumIdle=5 connectionTimeout=250 validationTimeout=200 idleTimeout=30000 maxLifetime=1800000 leakDetectionThreshold=5000
규칙:
  • 'maximumPoolSize는 RPS × W × 헤드 룸' 입니다.
  • '연결 시간 초가 아닌 수백 밀리 초' 입니다.
  • 누출 감지 활성화

5. 3 이동/노드/파이썬-예

http. 클라이언트 (재사용 + 타임 아웃):
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
}
노드. js 유지 에이전트:
js const http = require('http');
const agent = new http. Agent({ keepAlive: true, maxSockets: 200, maxFreeSockets: 64, timeout: 60000 });
psycopg/SQLAlchemy (파이썬):
python engine = create_engine(
url, pool_size=30, max_overflow=10, pool_recycle=1800, pool_pre_ping=True, pool_timeout=0. 25
)

6) 대기 대기열과 꼬리 대기 시간

꼬리는 다음과 같은 경우에 발생합니다

풀은 'λ× W' 보다 작으므로 연결 대기열이 커지고 있습니다.
버퍼와 한계없이 불균일 (버스트) 을로드하십시오.
긴 요청은 연결을 취하고 HOL을 만듭니다.

대책:
  • 요청 유형별로 별도의 풀 (빠른/느린).
  • 클라이언트 측 타임 아웃을 구현합니다. 만료되면-빠른 NACK.
  • 경로에서 이상 탐지 및 회로 파괴 (Envoy, HAProxy).
  • "무거운" 노선에 대한 쿼터, 보고서/수출을위한 별도의 풀.
특허 회로 차단기 (예):
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 200 max_pending_requests: 100 max_requests: 1000 max_retries: 2

7) 시간 초과 및 퇴각 (올바른 순서)

1. 시간 초과 연결 (짧은: DC 내부 50-250 ms).
2. TLS 핸드 셰이크 타임 아웃 (500-1000ms виDC).
3. 시간 초과 요청/읽기 (경로 SLO에 더 가깝습니다).
4. 재시도: dempotent 방법에 대해서만 최대 1 시간; 지터 + 백오프.

5. 예산 재조정: RPS 백분율로서의 글로벌 한계 (예:
  • 8) 유지, Nagle, 프로토콜

작은 메시지 RPC에 대해서는 Nagle (할 수 없음) 을 사용하지 않습니다.
가능한 경우 HTTP를 계속 사용하십시오.
TIME _ WAIT-결과를 이해하는 경우에만 '재사용 '/' 재활용' 을 조정하십시오. 더 나은-커널 튜닝이 아닌 재사용 연결.
TLS-사용 세션 재개 및 ALPN.

9) OS/커널 튜닝 (주의 사항)

'넷. 핵심. somaxconn ',' net. ipv4. (PHP 3 = 3.0.6, PHP 4) ipv4. (PHP 3 = 3.0.6, PHP 4)

설명자: 프록시 프로세스 당 '노파일'

트래픽 프로파일별로 IRQ 균형, GRO/LRO.
우선 순위-프로필; 메트릭없이 튜닝하는 것은 종종 유해합니다.

10) 관찰 가능성: 측정 대상

수영장 활용: 바쁜/총, p50/p95 연결 보류 중.
기내 요청 및 보류 시간 (경로 조각).
재 트레이 오류 예산: 반복 비율.
초당 연결 이탈/닫기.
할 수 없습니다.
차이나: 활성 연결, 대기, 긴 트랜잭션, 잠금 장치.

"RPS 대 풀 대기", "보류 시간 분포", "재사용 비율", "회로 트립".

11) 케이스 레시피

11. 게이트웨이 → 백엔드 1 개

(PHP 3 = 3.0.6, PHP 4)

게이트웨이 노드 당 서비스 당 20-40 개의 연결 풀.
타임 아웃: 100ms, 시도당 300-500ms, 1-2, 1 재 시도를 지터로 연결하십시오.

11. PgBouncer를 통한 2 PostgreSQL → 서비스

공식별로 'pool _ mode = trange', 'basic _ pool _ size' (RPS × W × 1). 3).
'연결 시간이 250ms' 에서 짧은 트랜잭션 (<100ms).
무거운보고 요청-별도의 풀/복제.

11. 3 gRPC 내부

스레드 제한이 100-200 인 대상 호스트 당 하나의 채널 (SHT/2).
SLO 경로에서 RPC의 마감일은 demempotent 만 다시 트레이합니다.
긴 RPC 추적 샘플링 및 홀드 타임 메트릭.

12) 구현 점검표 (0-30 일)

0-7 일

주요 경로/클라이언트의 측정 'W' (보류 시간).

(PHP 3 = 3.0.6, PHP 4)

유지 및 짧은 연결 시간 초과를 사용하십시오.

8-20 일

별도의 수영장 (빠른/느린/외부).
회로 차단기 및 재 트레이 예산을 입력하십시오.
대시 보드 추가: 풀 대기 p95, 재사용 비율, 기내.

21-30 일

버스트, 혼돈 테스트 "백엔드의 추락" 으로드가 실행됩니다.
테일 최적화: 무거운 경로, 로컬 캐시의 격리.
런북 'ax의 문서 공식 및 제한.

13) 반 패턴

수영장 크기 "무작위" 이며 헤드 룸이 없습니다.
큰 연결 대기 시간 → 빠른 고장 대신 긴 꼬리.
많은 사람들이 지터와 demmpotency → 폭풍없이 후퇴합니다.
모든 요청 유형에 대한 하나의 공유 풀.
긴 거래는 나머지의 연결 (DB) → 기아를 유지합니다.
장애가있는 유지 또는 너무 작은 유휴 → 이탈 한계 및 TTFB 성장.

14) 성숙도 지표

총 p95 경로의 prod <10% 에서 풀 대기 p95.
재사용 비율 (내부 HTTP의 경우> 90%;> 외부의 경우 80%).
DB txn 시간 p95 <100-200 ms; 긴 거래의 백분율 <1%.
시간 초과로 인한 오류가 안정적이고 예측 가능합니다.
모든 주요 고객을위한 문서화 된 풀 결제.

15) 결론

효과적인 연결 풀링은 대기열 엔지니어링 + 타임 아웃 분야입니다. 측정 값 'W', 여백이있는 풀 'λ× W' 계산, 유지/HTTP2 +, 별도의 느린 경로 켜기, 짧은 타임 아웃 유지 및 지터로 최소한의 레트라 유지. "풀 대기 대 대기 시간" 관찰 가능성과 회로 차단기를 추가하면 백엔드를 과열하지 않고 낮은 TTFB, 제어 된 p99 테일 및 서지 저항력을 얻을 수 있습니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.