SHOOT - 커넥션 부족

민경찬·2023년 2월 17일
0

백엔드

목록 보기
3/19
post-thumbnail

서론


프론트 개발자 분들이 api를 연결하는 과정에서 자꾸 409에러가 뜬다고 하셨다. 서버에서 무슨 에러 때문에 409응답이 가나 살펴보니 postgreSQL에서 connection수가 부족하다고 에러가 났다고 한다.

문제가 무엇인지 파악하지 못한채 그냥 postgreSQL의 max-connection수를 늘려줬다. 그랬더니 이번엔 인스턴스가 연결이 안됐다.


본론


1. 문제 상황

프론트 팀원분들이 API를 테스트 하는 과정에서 409에러가 계속 발생한다고 했다.

psql의 커넥션이 부족한 상황을 단순히 max-connection수를 늘려 해결하려고 했다. 그랬더니 메모리가 터졌다. 원격접속이 되질 않아 인스턴스를 강제로 재부팅해야했다.

2. 해결 과정

아래 과정은 나의 무지로 인해 발생한 순서이다. 내가 해결하려고 했던 모든 삽집을 포함하여 시간 순서대로 적어보려한다.

1) 최대 커넥션 수 증가

postgreSQL의 커넥션 수를 증가시켰다. 결과적으로 잠시동안은 해결할 수 있었다.

정말 일시적으로 문제를 해결한 "것" 처럼 보였다. 문제가 발생하지 않으니 말이다. 하지만 문제를 더 늦게 발생시킬 뿐이였다. 그리고 인스턴스가 멈추는 더 큰 결과를 가져왔다.

2) 메모리 사용량 확인

free -h

위 명령어로 서버를 켜놨을 때 메모리를 계속 확인했다. 서버 메모리 사용량은 늘어나는데 다시 줄어들기도 하고 내 눈으로 보기에 큰 문제가 안 보였다.

top

위 명령어로도 메모리 사용량이랑 cpu사용량을 확인해봤는데 역시... 잘 모르는 내가 보기엔 뭔가 문제가 많아보이진 않았다.

3) postgreSQL의 프로세스

메모리 사용량을 확인하던 도중 서버 메모리 사용량만을 확인하는 방법을 찾았다. 그 방법은 서버 프로세스의 PID를 찾아서 명령어를 입력하는 방법이였다. 그러려면 현재 서버가 어떤 PID인지 확인해야 했다. 그래서 확인해봤다.

그런데 여기서 결정적인 무언가를 발견했다.

무수히 떠있는 postgreSQL PID

postgreSQL 어쩌구가 엄청나게 많이 활성화 되어있었다. 바로 psql에 접속해서 connection 수를 확인해봤다.

SELECT * FROM pg_stat_activity WHERE datname = 'shoot'

위 명령어로 확인해본 결과 엄청나게 많은 connection이 계속 살아있었다...

찾았다...

4) 최종 해결

커넥션이 끊기지 않는 다는 것... 내가 알던 지식상으로는 postgreSQL의 client를 선언하고 해당 client 객체가 사라질 때 커넥션이 끊긴다는 것이었다. 그런데 업데이트가 된지 좀 되었다고 한다....! 커넥션을 코드상에서 끊어줘야한다고 한다.

try{
    await pgClient.connect();
  
    //do something
}catch...

위 와 같이 코드를 써줬으면 아래처럼 바꿔줘야한다.

try{
    await pgClient.connect();
  
    //do something
  	
    await pgClient.end();
}catch...

그런데 당연히 여기까지만 적으면 안된다.

try{
  await pgClient.connect();
  
    //do something
  	
    await pgClient.end();
}catch(err){
    if(pgClient._connected){
    	await pgClient.end();
    }
}

에러가 발생했다면 커넥션 상태를 확인하고 끊어주는 것 까지 해야된다. 위 과정을 거의 모든 코드에서 생략해버렸다. 고치는데도 꽤 오랜 시간이 걸렸다...


결론


위 해결 과정을 쭉 보다보면 문뜩 드는 생각이 있다. postgreSQL의 connection이 부족한다는 에러를 뱉어줬을 때 왜 바로 connection 상태를 확인하지 않았을까?

이유는 너무나도 간단하다... 옛날에 배웠던 지식을 너무 굳게 믿고 있었다. 당연히 connection에는 문제가 없을 거라고 생각했다.

내가 자주 쓰는 기술에 대해서는 최신 업데이트 내역까지도 확인해야겠다. 개발에 대한 자세를 다시 배우는 느낌이다.



참고


0개의 댓글