Apache가 난폭하게 실행되고 MySQL을 죽이는 이유는 무엇입니까?

Apache가 난폭하게 실행되고 MySQL을 죽이는 이유는 무엇입니까?

Apache는 지난 며칠 동안 통제 불능 상태가 되어 MySQL이 두 번 충돌했습니다. 모든 것은 phpBB 포럼이 포함된 WordPress 웹사이트를 마이그레이션했을 때 시작되었습니다.

저는 서버 관리에 대한 경험이 많지 않아서 문제의 원인을 정확히 찾아내는 것이 매우 어려웠습니다. MySQL이 다운된 것을 발견했을 때 TOP를 실행했는데 시스템 로드가 98.00으로 급증했습니다. 서버는 10개의 V-HOSTS를 실행하며 모두 건강한 양의 트래픽을 수신하므로 분명히 많은 apache-2 프로세스가 실행되는 것을 볼 수 있습니다.

높은 서버 부하가 10분간 지속되다가 정상 상태로 돌아왔습니다. 이 시점에서는 네트워크 트래픽이 급증하는 것을 보지 못했습니다.

불행하게도 MySQL 오류 로깅은 비활성화되어(이제 다시 활성화되었습니다) 아무런 단서도 없습니다. 그러나 나는 Apache가 모든 리소스를 소비했기 때문에 MySQL 프로세스 ID가 종료되었다고 확신합니다.

내 질문은 다음과 같습니다

다음에 이런 일이 발생하면 시스템 로드 급증의 원인을 어떻게 식별할 수 있습니까? 미친 PHP 스크립트일까요? DDOS 공격일 수도 있나요?

MySQL이 충돌할 때 자동으로 MySQL을 다시 시작하는 방법이 있습니까?

이제 을(를) 설치했습니다 htop. 이것이 보다 더 유용할 수 있을까요 top?

내 서버 통계는 다음과 같습니다.

m1.xlarge (8 ECUs, 4 vCPUs, 15 GiB memory, 4 x 420 GiB Storage Capacity)
Ubuntu Server 12.04.3 LTS 

답변1

MySQL은 여전히 ​​아무 것도 기록하지 않을 수 있습니다. 왜냐하면 Apache 자식의 시스템 메모리 압박으로 인해 시스템이 MySQL을 무의식적으로 종료할 가능성이 높기 때문입니다. /var/log/syslog에 이에 대한 흔적이 있어야 합니다.

MySQL은 충돌이나 강제 종료 시 스스로 다시 시작을 시도해야 하지만 충분한 메모리를 사용할 수 없으면 그렇게 할 수 없습니다... 그리고 이 두 번째 실패는 mysqld_safe에 의해 "충돌"이 아니라 "거절"로 간주됩니다. 시작하세요." 그러면 계속 시도하지 않습니다. 실패한 재시작 시도는 관리자가 "충돌"로 잘못 해석하는 경우가 많습니다. 왜냐하면 원래 실패의 성격은 MySQL 오류 로그에서 쉽게 간과할 수 있는 메시지 뒤에 숨겨져 있기 때문입니다.

mysqld_safe Number of processes running now: 0

보다InnoDB 충돌 사후 분석내가 생각하기에 당신과 비슷한 상황입니다.

"이유"에 대한 단순해 보이는 대답은 Apache와 MySQL, 현재 로드, 현재 구성 사이에 시스템에 충분한 메모리가 없으며 이러한 상황을 초래하는 트래픽 로드와 관련된 몇 가지 전환점이 있다는 것입니다. .

Apache는 하위 프로세스의 각 동시 브라우저 요청을 처리하므로 동시 연결 수가 증가하면 하위 프로세스 수도 늘어납니다. 실제로 동시 연결 증가의 원인이 무엇인지 이해할 수 있도록 먼저 Apache 구성에서 이 값을 제한해야 합니다. 단순히 무겁지만 합법적인 트래픽 급증입니까? 일종의 서비스 거부? 너무 오래 실행되기 때문에 요청을 지연시키는 DB 쿼리가 있습니까? 최적화가 필요한 부분이 있나요?

http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients

동시 Apache 프로세스를 제한하면 이를 방지하는 데 도움이 되지만 분명히 말하면 이것이 완전한 솔루션이라고 생각하는 것은 순진하므로 암시하고 싶지 않습니다. 프로세스가 합리적이거나 최소한 더 안전한 수준으로 제한되면 실제로 무슨 일이 일어나고 있는지 식별할 수 있습니다. (Apache에는 다른 제한 제어 기능이 있지만 이는 내 전문 분야가 아닙니다.)

물론 "모범 사례"는 애플리케이션이 데이터베이스를 종료할 수 없도록 다른 하드웨어에서 데이터베이스를 실행하는 것입니다. 표면적으로는 하나의 기계를 공유하여 "활용도를 최대화"하는 것이 더 효율적인 것처럼 보이지만 이는 잘못된 경제입니다. 일반적인 워크로드에서 MySQL이 사용하는 메모리의 대부분은 시작 시 할당되며 MySQL 서버가 실행되는 동안 유지됩니다. CPU에 대한 수요는 궁극적으로 동일한 로드를 제공하기 때문에 MySQL과 Apache의 피크 시간을 공유할 가능성이 높습니다. 실제로 단일 m1.xlarge 대신 두 대의 m1.large 머신을 사용하는 것이 더 나을 수 있으며, 더 작은 머신이 더 큰 머신 가격의 정확히 절반이므로 비용은 동일합니다... 이미 미리 지불한 경우에도 마찬가지입니다. 추가 할인을 받으시려면,이 변화는 달성될 수 있다.

답변2

확인해야 할 몇 가지 사항이 있습니다.

- /var/log/messages 확인: 사용할 메모리가 더 이상 없으면 oomkiller는 mysql 프로세스를 종료할 수 있습니다. free -lm(캐시 없음)으로 RAM을 확인하세요.

- prefork mpm과 함께 apache를 사용하는 경우 : 프로세스 수를 확인하세요. Apache가 mysql에 대한 링크를 사용하여 많은 수의 프로세스(과중한 작업 부하 동안)를 스택하는 경우 사용되는 대기 시간과 메모리가 빠르게 늘어날 수 있습니다.

-mysql이 시작한 스레드 수를 확인하십시오.전역 상태 표시: thread_cached, thread_created 및 thread_running을 확인하는 것이 중요합니다(threads_created는 0에 가까워야 함).

-Mysql에서 사용하는 램을 확인해보세요.

답변3

구현을 살펴볼 수도 있습니다.CPU세트mysql을 위한 리소스를 예약합니다. 이는 다양한 하드웨어에서 이러한 서비스를 실행하는 것과 가장 유사하면서도 단일 서버를 유지 관리하는 이점을 제공합니다.

관련 정보