카레제육 블로그
Kong postgresql connection refused 본문
에러: Connection refused
Kong이라고 불리는 API 관리 게이트웨이 오픈서비스를 사용하는 중 안정적인 트래픽 스펙 확보를 위해서 부하 테스트를 진행하였다. 그러던 중 1C 2G에서 겨우 200TPS도 못버티고 에러가 발생했다.
일반 환경과 다르게 조건으로 게이트웨이 환경으로 rate-limit을 준상태였고 첫번째로 만난 에러가 있다.
- 5 분
- TPS 200
- 지연 0ms
- 요청바디 사이즈 기본
- 응답바디 사이즈 기본
[2022-02-11 07:47:33] [ERROR] connection to database failed
[2022-02-11 07:47:33] [DETAIL] could not connect to server: Connection refused
디비 커넥션이 부족하다? -> kong 서버에서 디비에 붙는데 사용하는 환경 값을 확인했다. 사용하는 DB인 postgresql에 max_connections항목이 있어서 해당 값을 변경해줬다.
현재 max_connections 확인 sql
select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal
from
(select count(*) used from pg_stat_activity) t1,
(select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) t2,
(select setting::int max_conn from pg_settings where name=$$max_connections$$) t3;
시스템 설정 확인
SELECT *
FROM pg_settings
WHERE name = 'max_connections'
or name = 'checkpoint_completion_target'
or name = 'effective_cache_size'
or name = 'shared_buffers'
or name = 'maintenance_work_mem'
or name = 'work_mem'
or name = 'max_wal_size'
or name = 'min_wal_size'
or name = 'huge_page'
or name = 'autovacuum'
or name = 'autovacuum_analyze_scale_factor'
or name = 'autovacuum_analyze_threshold'
or name = 'autovacuum_freeze_max_age'
or name = 'autovacuum_max_workers'
or name = 'autovacuum_multixact_freeze_max_age'
or name = 'autovacuum_naptime'
or name = 'autovacuum_vacuum_cost_delay'
or name = 'autovacuum_vacuum_cost_limit'
or name = 'autovacuum_vacuum_scale_factor'
or name = 'autovacuum_vacuum_threshold'
or name = 'autovacuum_work_mem'
;
조치: max_connections값 증가.
다행스럽게 한번에 해결!. 된듯 보였으나 해당 에러는 사라졌으나 다른 문제가 발생했다. Kong 서버 자체가 죽어버리는것. 때문에 2C 4G 스펙 향상을 해줘서 해당 문제는 해결했다. 이것으로 rate-limit 정책을 붙이는건 성공했다.
결과1: 250 TPS 30분 성공
Request [header] map[Accept:[*/*] Content-Type:[application/json] Keep-Alive:[timeout=3600]]
[mainXid] 2022y02M16d18h34m14s
[tps, duration, delay] 250, 1800s, 0ms
[bytes size] 0
RunningTime [start] 2022-02-16 18:34:14
[end, total] 2022-02-16 19:04:14, 30m0.006008952s
Requests [total, rate, throughput] 450000, 250.00, 250.00
Duration [total, attack, wait] 30m0.000308079s, 29m59.995793501s, 4.514578ms
Latencies [mean, 50, 95, 99, max] 3.641906ms, 3.575183ms, 4.369151ms, 5.011613ms, 207.223293ms
Bytes In [total, mean] 38250000, 85.00
Bytes Out [total, mean] 47250000, 105.00
Success [ratio] 100.00%
Status Codes [code:count] 200:450000
Error Set
empty
결과2: 500 TPS 5분 성공
Request [header] map[Accept:[*/*] Content-Type:[application/json] Keep-Alive:[timeout=3600]]
[mainXid] 2022y02M16d19h49m31s
[tps, duration, delay] 500, 600s, 0ms
[bytes size] 0
RunningTime [start] 2022-02-16 19:49:31
[end, total] 2022-02-16 19:59:31, 10m0.004432244s
Requests [total, rate, throughput] 300000, 500.00, 500.00
Duration [total, attack, wait] 10m0.001316164s, 9m59.998070398s, 3.245766ms
Latencies [mean, 50, 95, 99, max] 388.61657ms, 3.523988ms, 5.001419354s, 7.86810384s, 13.661994617s
Bytes In [total, mean] 25500000, 85.00
Bytes Out [total, mean] 31500000, 105.00
Success [ratio] 100.00%
Status Codes [code:count] 200:300000
Error Set
empty
* 테스트 도구는 golang으로 작성된 오픈소스 vegeta를 기반으로 요청, 응답서버를 직접만들어 테스트 진행