오늘도 웹사이트가 다시 멈춰 섰고, 많은 수면이 발견되었습니다
수면 원인:
1 클라이언트 프로그램은 종료 전에 mysql_close()를 호출하지 않았습니다.
2 클라이언트는 서버에 요청을 보내지 않고 wait_timeout초 또는 interactive_timeout초 이상 잠들어 있었습니다.
3 클라이언트 프로그램이 데이터 전송 도중 갑자기 종료됨
같은 기간 동안 슬립 프로세스 수가 너무 많고, 다른 상태의 총 연결 수가 max_connection 값을 초과하면, MySQL은 루트 사용자 외의 요청을 처리할 수 없거나 어떤 요청으로도 연결을 설정할 수 없거나 직접 멈추게 됩니다
해결책:
1. 먼저 프로그램이 pconnect 메서드를 사용하는지 확인하고, 둘째, mysql_close()가 페이지 실행 전에 호출되었는지 확인하세요. pconnect 방법은 사용하지 말고, 즉 mysql_connect 사용하는 것이 좋습니다. 프로그램이 실행될 때는 mysql_close가 명시적으로 호출되어야 합니다
2. my.cnf에 wait_timeout와 interactive_timeout을 추가하고, 값을 더 작게 설정하세요. 기본값으로 wait_timeout 값은 8시간이고, 1시간이나 30분으로 변경할 수 있습니다. 이렇게 하면 mysql이 더 빨리 죽은 연결도 종료할 수 있습니다. 총 연결 수가 max_connection 값을 초과하지 않도록 하세요.
wait_timeout 너무 크면 MySQL의 SLEEP 프로세스가 제때 많이 해제되어 시스템 성능이 저하되지만, 설정이 너무 작으면 "MySQL이 사라졌다"는 같은 문제가 발생할 수 있습니다.
max_connection 값을 더 높게 설정하세요. 하지만 이는 당연히 적절하지 않습니다. 연결이 많을수록 서버에 더 큰 부담이 가해집니다. 사실 그런 연결은 중복되어 있으며, 가능한 한 빨리 끊는 것이 최선의 방책입니다.
3. 시스템의 SQL 쿼리를 단계별로 분석하고, 너무 느린 SQL을 찾아 최적화합니다
1) interactive_timeout: 매개변수 의미: 서버가 활동을 기다리는 초, 그리고 상호작용 연결을 종료하기 전 그 시간. 인터랙티브 클라이언트는 mysql_real_connect()의 CLIENT_INTERACTIVE 옵션을 사용하는 클라이언트로 정의됩니다. 매개변수 기본값: 28800초 (8시간)
(2)wait_timeout: 매개변수 의미: 서버가 비상호작용 연결을 종료하기 전에 활동이 시작될 때까지 기다리는 초의 시간. 스레드가 시작되면 세션 wait_timeout 값은 클라이언트 유형(mysql_real_connect()의 연결 옵션CLIENT_INTERACTIVE 정의됨)에 따라 글로벌 wait_timeout 또는 글로벌 interactive_timeout 값을 기반으로 초기화됩니다. 매개변수 기본값: 28800초 (8시간)
MySQL 서버가 지원할 수 있는 최대 연결 수에는 상한선이 있는데, 각 연결은 구축되고 메모리를 소모하기 때문에, 클라이언트가 MySQL 서버에 연결한 후 해당 작업을 처리할 수 있도록 분리하고 점유된 메모리를 확보할 것으로 기대합니다. MySQL 서버에 유휴 연결이 많으면 메모리를 낭비할 뿐만 아니라, 연결이 계속 누적되고 열리면 결국 MySQL 서버의 최대 연결에 도달해 '너무 많은 연결' 오류가 발생합니다. wait_timeout의 값 설정은 시스템의 작동 방식에 따라 판단되어야 합니다. 시스템이 일정 시간 실행 중이면 show processlist 명령어를 통해 현재 시스템의 연결 상태를 확인할 수 있습니다. 만약 슬립 상태에서 많은 프로세스가 연결되어 있다면 매개변수 설정이 너무 크다는 뜻이며, 적절히 조정하여 더 작은 조정을 할 수 있습니다.
SQL 명령어:
이 변형 방법은mysql 서비스를 재시작하면 무효가 됩니다따라서 이 두 속성은 MySQL 설정 파일에서 설정하는 것이 가장 좋습니다.
Linux에서 my.cnf 파일을 수정하세요:
|