MySQL의 높은 CPU 사용률


191

최근에 서버 CPU가 매우 높아졌습니다.

CPU로드는 평균 13.91 (1 분) 11.72 (5 분) 8.01 (15 분)이며 내 사이트의 트래픽은 약간만 증가했습니다.

top 명령을 실행 한 후 MySQL이 160 % CPU를 사용하고 있음을 알았습니다!

최근에 테이블을 최적화하고 영구 연결로 전환했습니다. 이것이 MySQL이 많은 양의 CPU를 사용하게 만들 수 있습니까?


4
지속적인 연결은 거의 항상 올바른 것이 아닙니다.
Jason Jason

나는 한 달 전에 2 CPU 이상이었던 것을 기억하지 못하기 때문에 지금 그들을 벗고 차이를 지켜 볼 것입니다!
Juddling

2
서버에는 둘 이상의 코어가있는 경향이 있습니다. CPU 사용률은 한 코어를 기준으로 계산되며 두 코어를 완전히 사용하는 프로세스의 CPU 사용량은 200 %입니다. 여기서 MySQL은 한 코어의 100 %와 다른 코어의 60 %를 사용하고 있습니다. 그렇다고 모든 CPU가 다 소모 된 것은 아니며 여전히 최소 2 개의 사용 가능한 CPU가 있습니다.
xaav

높은 CPU는 거의 항상 비효율적 인 쿼리를 의미합니다. 이러한 문제는 일반적으로 더 나은 인덱싱 (특히 '복합') 및 / 또는 쿼리 재구성을 통해 해결됩니다.
Rick James

답변:


265

먼저 영구 연결은 거의 항상 좋은 것보다 더 많은 해를 끼치므로 영구 연결을 해제하고 싶을 것입니다.

둘째, 누군가 원격 서버에서 연결할 수 없도록 MySQL 사용자를 다시 확인하고 싶다고 말하고 싶습니다. 이것은 또한 확인해야 할 주요 보안 사항입니다.

셋째 , 오랜 시간이 걸리는 쿼리를 주시하기 위해 MySQL 느린 쿼리 로그를 켜고 키 ​​테이블을 너무 오래 잠그는 쿼리가 없도록하는 데 사용하고 싶습니다.

확인할 수있는 다른 사항은 CPU로드가 높을 때 다음 쿼리를 실행하는 것입니다.

SHOW PROCESSLIST;

현재 실행 중이거나 큐에서 실행중인 쿼리, 쿼리가 수행하는 작업 및 수행중인 작업이 표시됩니다 (이 명령은 쿼리가 너무 길면 잘립니다. SHOW FULL PROCESSLIST를 사용하여 전체 쿼리 텍스트를 볼 수 있음) .

버퍼 크기, 테이블 캐시 , 쿼리 캐시innodb_buffer_pool_size (innodb 테이블을 사용하는 경우) 와 같은 것들을 주시하고 싶을 것 입니다. 이러한 모든 메모리 할당은 쿼리 성능에 영향을 미치므로 MySQL이 CPU를 먹습니다.

또한 다음과 같은 정보가 포함되어 있으므로 다음 내용을 읽어보십시오.

프로파일 러를 사용하는 것도 좋습니다. 당신이 원할 때 당신이 켤 수있는 것은 당신의 어플리케이션이 어떤 쿼리를 실행하는지, 중복 된 쿼리가 있거나, 얼마나 오래 걸리는지 등을 보여줄 것입니다. 이와 같은 예는 제가 작업 한 것입니다 PHP 프로파일 러 이지만 많은 것들이 있습니다. Drupal, Joomla 또는 Wordpress와 같은 소프트웨어를 사용하는 경우 수동으로 아무것도 통합하지 않고도이 정보를 얻을 수있는 모듈이 있으므로 커뮤니티 내에서 묻고 싶을 것입니다.


12
이것에 대해 대단히 감사합니다. 지속적인 연결을 제거한 다음 느린 쿼리 로그를 설정했습니다. 나는 로그를 읽었으며 대부분의 쿼리는 두 테이블에서 왔으며 테이블은 올바르게 인덱싱되지 않았습니다! CPU로드는 평균 0.48 (1 분) 0.95 (5 분) 2.42 (15 분)입니다. 대단히 감사합니다
Juddling

같은 문제는 프로세스 속도를 늦추는 테이블을 인덱싱함으로써 해결되었습니다. Steven과 Juddling
gabrielem

@Juddling 테이블을 인덱싱하는 방법에 대해 자세히 설명해 주시겠습니까? 아마도 어떤 링크? 나는 그것이 오래되었다는 것을 알고 있지만, 나는 정말로이 일에 익숙하지 않습니다. 죄송합니다 질문
JayVDiyk

느린 쿼리를 기록하면 CPU 사용률이 높은 특정 문제를 찾을 수있었습니다. 내 경우에는 인기있는 태그를 표시하기 위해 모든 적중마다 괴물 쿼리를 수행하는 Wordpress 플러그인 (ultimate-tag-cloud-widget)이었습니다. 훌륭한 플러그인이지만 어떤 종류의 캐싱으로 향상시켜야합니다 (문제가 해결되도록 사용자 정의했습니다).
jkincali

다른 문제를 도와 준 또 다른 것은 위에서 언급 한 innodb_buffer_pool_size 매개 변수를 수정하는 것이 었습니다. 높은 CPU 사용률의 원인을 찾으려고 노력하는 동안 innodb_buffer_pool_size가 최소한 / var / lib / mysql에있는 ibdata1 파일의 크기 여야한다는 것을 읽었습니다. InnoDB는 메모리에 상주 할 수있을 때 훨씬 효율적으로 작동하는 것 같습니다. ibdata1이 클 수 있으므로 일부 상황에서는 수행하기 어려울 수 있습니다! 또한 innodb_log_buffer_size가 innodb_buffer_pool_size 크기의 25 %인지 확인하는 것이 좋습니다.
jkincali

167

MySQL이 높은 CPU 사용량 또는 부하를 위해 Google을 사용하는 경우 이것이 최고의 게시물이므로 추가 답변을 추가하겠습니다.

2012 년 7 월 1 일, 현재 UTC 시간에 윤초가 추가되어 조수로 인한 지구의 느린 회전을 보상합니다. ntp (또는 ntpd)를 실행할 때이 초는 컴퓨터 / 서버 시계에 추가되었습니다. MySQLd는 일부 OS에서이 추가 초를 좋아하지 않는 것으로 보이며 높은 CPU로드를 생성합니다. 빠른 수정은 다음과 같습니다 (루트).

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start

22
원래 게시물은 약 3 년 전 이었으므로 원래 포스터 문제의 원인이 의심됩니다. 그러나 그것은 내 문제의 원인이었고 지금 막 저를 구했습니다. 감사합니다! 더 많은 정보 : blog.mozilla.org/it/2012/06/30/…
Russell G

5
Ubuntu 12.04에서 동일한 문제 및 해결책. 약간 다른 해결 단계 : service ntp stop && date -s " date"&& service ntp start MySQL CPU 사용량이 즉시 50-100 %
David Laing

2
이것을 확인하기 위해서만 실행할 수 있습니까? 이유가 아니더라도 안전하게 운영 할 수 있습니까?
Muhammad Gelbana

2
2015 년 7 월 1 일-Amazon Linux를 실행하는 현재 AWS EC2 서버에서이 두 번째 버그가 발생했습니다. sudo service ntpd stop이 구성에 사용하십시오 .
Matt van Andel

1
이 솔루션의 +1 내 MySQL은 아무 이유없이 몇 달 동안 50-60 %에서 실행 중이었습니다.이 솔루션을 적용 한 후 이제는 0.0-0.3 %로 줄어 들었습니다. 고마워
zeeshan

32

이 서버가 외부 세계에 보이는 경우 외부 세계와의 연결 요청이 많은지 (즉, 침입하려는 사람들) 확인해야합니다.


1
과거에 일부 시스템에서 원인이 되었기 때문에 이것이 익명의 다운 보트를 유인한 이유가 확실하지 않습니다.
Rowland Shaw

2
다운 투표는 MySQL을 외부 세계에 공개하는 것이 좋은 생각이 아니기 때문이라고 생각합니다.
MikeKulls

9
@MikeKulls 아니요, 많은 사람들이 진입하려고 시도하는 대상으로 작동하므로 CPU 부하가 높아 지므로 가능한 한 가지 이유는 내 대답입니다.
Rowland Shaw

16
누군가가 그냥 투표하고 갈 때 나는 그것을 싫어!
Muhammad Gelbana

1
+1 이것은 MySQL이 CPU 사용률을 높이는 합법적 인 이유이기 때문에 이것이 사실 인 사람이라면 누구나 실제로이 정보가 필요하기 때문입니다!
Chris Browne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.