MySQL이나 PgSQL을 아파치/PHP와 연동하여 사용할 때 db와 연결이 잘 되지 않는 경우가 종종 발생하며 사용자가 많지 않은데도 접속 에러가 뜨는 경우가 많이 있습니다.
이는 db 서버와 웹서버, 그리고 PHP의 설정 파라미터를 조정해 줌으로서 쉽게 해결할 수 있습니다. 점검해볼 항목은 다음과 같습니다.
PgSQL의 경우 /etc/postgresql/postgresql.conf 에 보면
max_connections = 64
와 같은 부분이 있습니다. 이는 PgSQL이 동시에 받아들일 수 있는 최대 접속 수입니다.
아파치 웹서버 설정 파일인 httpd.conf에는
MaxClients 90
과 같은 부분이 있습니다. 이는 아파치 웹서버가 동시에 처리할 수 있는 클라이언트의 숫자입니다.
PgSQL을 예로 들자면, php.ini에 다음과 같은 내용이 있습니다.
pgsql.allow_persistent = On
pgsql.max_persistent = 2 #max persistant links per process
pgsql.max_links = 16 # max pers/non-pers links per process
여기서 웹서버(PHP)가 PgSQL에 정의된 숫자보다 더 많은 접속을 시도할 경우 접속을 하지 못하고 에러가 발생하게 됩니다.
그러므로 MaxClients * pgsql.max_persistent < max_connections 가 되도록 설정값을 조정해 주어야 합니다.
지금 적힌 대로 시스템이 설정되어 있다면 90 * 2 > 64 이므로 위의 식을 만족하지 못하기 때문에 금방 db 커넥션 관련 에러가 발생하게 됩니다.
웹서버가 좀더 많은 사용자를 커버할 수 있도록 튜닝을 하더라도 위의 공식을 염두에 두고 튜닝을 해야 사용자가 얼마 없는 상황에서 db 접속을 하지 못하는 현상을 방지할 수 있습니다.
만약 위의 경우에서 웹서버와 db서버가 분리된 상태라면 각각의 MaxClients * pgsql.max_persistent 값을 더한 것이 db서버측의 max_connections를 넘지 않도록 튜닝해야 합니다.
MySQL의 경우 wait_timeout값을 매우 짧게 설정함으로서 idle 프로세스를 최대한 줄이는 방법도 있습니다만 db서버와 웹서버의 관계를 잘 고려하여 튜닝을 한다면 같은 하드웨어 사양으로도 좀더 효율적인 튜닝이 가능할 것입니다.
저도 이문제 때문에 한참을 고민하다가 postgresql 메일링 리스트에서 힌트를 얻었습니다. 위의 글은 PgSQL기준이지만 MySQL에서도 기본은 같으므로 따로 설명을 하지는 않겠습니다.
도움이 되었기를 바랍니다....
댓글 없음:
댓글 쓰기