아파치가 왜 야생을 실행하고 MySQL을 죽이는가?


8

아파치는 지난 며칠 동안 통제 할 수 없었고 MySQL이 두 번 충돌했다. phpBB 포럼을 포함하는 WordPress 웹 사이트를 마이그레이션했을 때 시작되었습니다.

서버 관리자에 대한 경험이 많지 않아 문제의 원인을 정확히 찾아내는 것이 매우 어렵습니다. MySQL이 다운되었음을 알았을 때 TOP을 실행하여 시스템로드가 98.00으로 급증했습니다. 서버는 10 개의 V-HOST를 실행하여 모두 많은 양의 트래픽을 수신하므로 많은 apache-2 프로세스가 실행되고 있음을 분명히 알았습니다.

높은 서버로드는 10 분 동안 지속 된 후 정상 상태로 돌아 왔습니다. 이 시점에서 네트워크 트래픽이 급증하지 않았습니다.

불행히도, MySQL 오류 로깅이 비활성화되었습니다 (이제 다시 활성화 됨). 단서가 없습니다. 그러나 Apache가 모든 리소스를 소비했기 때문에 MySQL 프로세스 ID가 종료 되었기 때문에 확실합니다.

내 질문은 :

다음에이 문제가 발생하면 시스템로드 스파이크를 일으키는 원인을 어떻게 식별 할 수 있습니까? 미친 PHP 스크립트일까요? DDOS 공격 일 수 있습니까?

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

나는 지금 설치했다 htop. 이보다 더 유용 할 수 top있습니까?

여기 내 서버 통계 :

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

로그가 비활성화되었지만 dmesg도움이 되겠습니까?
Daniel W.

답변:


9

MySQL은 여전히 ​​아무것도 기록하지 않을 수 있습니다. 왜냐하면 아마도 아파치 자식의 시스템 메모리 압력으로 인해 시스템에 의해 시스템이 실수로 종료되고 있기 때문입니다. / var / log / syslog에 이것의 흔적이 있어야합니다.

MySQL은 충돌 또는 강제 종료로 자체 재시작을 시도해야하지만, 충분한 메모리가 사용 가능하지 않으면이를 수행 할 수 없습니다.이 두 번째 실패는 mysqld_safe에서 "크래시"가 아니라 "거부" 시작해 "계속 시도하지 않습니다. 실패한 재시작 시도는 종종 관리자가 "충돌"로 잘못 해석합니다. 원래 오류의 특성은 MySQL 오류 로그에서 쉽게 간과 할 수있는 메시지 뒤에 숨겨져 있기 때문입니다.

mysqld_safe Number of processes running now: 0

내가 당신과 비슷한 상황에 대해서는 InnoDB Crash Post Mortem 을 참조 하십시오.

"why"에 대한 겉보기 간단한 대답은 Apache와 MySQL 사이의 부하와 현재 구성 사이에 시스템에 충분한 메모리가 없으며이 조건을 가져 오는 트래픽로드와 관련된 팁 포인트가 있다는 것입니다 .

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 머신을 사용하는 것이 더 나을 수 있으며, 작은 머신은 큰 머신의 가격의 절반에 해당하므로 비용은 동일합니다. 추가 할인을 위해이 변경을 수행 할 수 있습니다 .


답장을 보내 주셔서 감사합니다. 정말 도움이되었습니다. / ver / log / syslog를 점검하고 다음 줄을 찾았습니다. 12 월 18 일 15:48:38 ip-10-33-164-173 커널 : [29714591.071719] 메모리 부족 : 프로세스 28369 (mysqld) 점수 21 또는 희생 자식 12 월 18 일 15:48:38 ip-10-33-164-173 커널 : [29714591.071753] 종료 된 프로세스 28369 (mysqld) total-vm : 2520332kB, anon-rss : 335304kB, file-rss : 0kB 따라서 아파치의 maxclients 설정은 이것이 일어나지 않도록하는 가장 좋은 방법입니까? 더 안전한 가치는 무엇이라고 생각하십니까?
밥 플레밍

1
나는 maxclients를 제한 하는 것이 어떤 눈사태가 발생 했는지 에 대한 상황을 이해하는 프로세스 를 시작 하는 가장 좋은 방법이라고 제안합니다 . 상황, 시스템의 사용 가능한 메모리 양 및 아파치 어린이가 사용하는 일반적인 메모리 양에 따라 더 안전한 값을 계산해야합니다. 너무 낮아 요청이 백업되기 시작합니다. 너무 높아서 지금 당신이있는 곳입니다. 그런 다음 생성 된 프로세스를 모니터링하고 사용 가능한 메모리 및 서버 로그를 관찰하십시오.
Michael-sqlbot 2016

1

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

-/ var / log / messages 확인 : 사용할 메모리가 더 없으면 oomkiller가 mysql 프로세스를 종료 할 수 있습니다. 캐시없이 free -lm으로 램 확인

-prefork mpm과 함께 아파치를 사용하는 경우 : 프로세스 수를 확인하십시오. 아파치가 mysql에 대한 링크로 많은 수의 프로세스 (과중한 워크로드 동안)를 쌓으면 지연 시간과 사용 된 메모리가 빠르게 증가 할 수 있습니다.

show global status : mysql이 시작한 스레드 수를 확인하십시오 : threads_cached, threads_created 및 threads_running은 확인하는 것이 중요합니다 (threads_created는 0에 가까워 야합니다).

-Mysql에서 사용하는 램을 확인하십시오.


0

mysql을 위해 cpusets 을 구현 하고 리소스를 예약 할 수도 있습니다 . 이는 다른 하드웨어에서 이러한 서비스를 실행하는 데 가장 가깝지만 여전히 단일 서버를 유지 관리하는 이점을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.