Notice
Recent Posts
Recent Comments
Link
Archives
Today
Total
관리 메뉴

윤서율의 블로그

Kong postgresql connection refused 본문

DevOps

Kong postgresql connection refused

Yoon Seo-yul 2022. 3. 8. 11:53

에러: 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를 기반으로 요청, 응답서버를 직접만들어 테스트 진행