libpq로 DB에 접속하는 프로그램을 만들었습니다.
빈번하게 DB에 접속하여 데이타를 입력합니다.
하나의 데이타가 있을 때 DB를 열고 입력하고 닫는 형태입니다.
Solaris에서 유독 TIME_WAIT가 많이 나타나고 빨리 사라지지 않습니다.
서버가 오래되어서 성능이 좀 느린감도 있습니다.
TIME_WAIT는 TCP에서 종료 시 four-way handshaking 과정 후 꼭 발생합니다.
일정 시간 후 사라지게 됩니다.
프로세스당 파일을 열 수 있는 개수가 제한이 있습니다.
TIME_WAIT가 계속 늘어나 파일의 개수에 제한에 걸리면 더이상 소켓을 열 수 없게 됩니다.
그래서 생각한 것이 프로그램 시작 시 소켓을 열어 닫지 않고 계속 쓰고 있다가,
프로그램 종료 시 소켓을 닫는 것입니다.
이렇게 하면, 하나의 소켓만 사용하므로 TIME_WAIT가 발생하지 않습니다.
하지만 DB에 연결된 상태이므로 DB를 멈출 수가 없습니다.
다른 방법으로는
1. 커널 레벨에서 커널의 프로세스 당 파일을 열 수 있는 개수를 늘려주던지,
2. 커널 레벨에서의 TIME_WAIT가 빨리 닫힐 수 있는 설정 값을 변경해주던지,
3. 라이브러리 자체의 소켓 여는 부분에서 TIME_WAIT를 재사용할 수 있게 하던지,
등의 방법이 있습니다.
1번과 2번은 임시적인 조치이고, 3번은 PostgreSQL의 소스를 변경해야합니다.
대략 이와 같은 상황을 경험해보신 분 중에 어떤 방법이 좋은지 의견 부탁 드립니다.
|