MySQL 프로세스는 CPU 사용량의 100 % 이상을 차지합니다


11

LAMP 서버에 문제가 있습니다. 최근 웹 사이트 방문자 수는 크게 변하지 않았지만 모든 것이 매우 느려졌습니다. top명령을 실행하면 MySQL 프로세스가 CPU의 150-200 % 이상을 차지했다고합니다. 어떻게 가능합니까, 나는 항상 100 %가 최대라고 생각 했습니까?

1,5GB RAM의 Ubuntu 9.04 서버 에디션을 실행하고 있습니다.

my.cnf 설정 :

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

다음은 MySQLTuner 의 출력입니다 .

MySQLTuner 출력

top명령

최고 출력

이 문제의 원인은 무엇입니까? my.cnf서버가 정지되지 않도록 변경할 수 있습니까 ?

답변:


15
  1. 키 버퍼 증가 (현재 64MB이지만 총 인덱스는 116M이므로 128MB 이상이어야 함) 즉시 도움이 될 것입니다.
  2. 테이블에서 mysqloptimizemysqlrepair 를 실행하십시오.
  3. 테이블 캐시 증가 / 총 테이블 수를 줄이면 테이블 캐시 적중률이 증가합니다. 삭제되었거나 사용하지 않거나 오래된 테이블이있을 수 있습니다.

다른 권장되는 confugration 옵션 :

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • 로그 쿼리를 사용하지 않는 인덱스

잠시 후 로그 파일을 확인하십시오.


추천 해 주셔서 감사합니다. 시도해보고 도움이되는지 알려 드리겠습니다.
Temnovit

총 인덱스가 116M이라는 것을 어떻게 계산 했습니까?
Temnovit

그것을 스스로 얻었다 :)
Temnovit

5

둘 이상의 코어가있는 프로세서가 있거나 여러 개의 프로세서가 있습니다. 두 개의 코어가 있고 프로세스가 두 코어의 100 %를 사용하는 경우 맨 위에 200 %로 표시됩니다.

마찬가지로, 이것은 의도 한대로 작동하는 것 같습니다. 구성에 아무런 문제가 없습니다. 게시 한 내용이 자주 중단되는 경우 테이블에 적절한 색인을 추가하거나 쿼리를 최적화하는 것이 좋습니다.


5

top -H전체 프로세스뿐만 아니라 실행중인 모든 스레드를 보려면 실행 하십시오. 또한 1상단에있는 동안 키를 누르면 개별 CPU / 코어의 CPU 사용량이 표시됩니다.


고마워, 이것은 정말 나에게 도움이되었습니다-수년간 최고를 사용하고 있었고이 능력을 가지고 있는지 몰랐습니다. 쿼리 스레드가 계속해서 올라가는 동안 항상 60 %의 사용자 CPU를 소비하는 "영원한"mysql 스레드가 하나 있다는 것을 알았습니다. 이 스레드가 실제로 무엇을하는지 알아 내려면 ...
scipilot

1

MySQL은 독립적으로 작동하는 여러 프로세스 (스레드)를 가지고 있습니다. 예를 들어 하나는 메모리에서 디스크로 데이터를 쓰는 역할을합니다. CPU (및 / 또는 다중 CPU)에 여러 개의 코어가 있으면 둘 이상의 스레드가 작동하므로 단일 코어의 100 % 이상을 단순한 수준으로 실행할 수 있습니다. 두 코어 각각의 75 %가 실행 중일 수 있습니다. 150 %를 제공합니다.


1

CPU와 관련이없는 문제를 발견했습니다. 동일한 서버에서 아파치와 MySQL을 사용하는 경우 아파치 활동이 증가하면 나쁜 상태 ( RAM )에 도달 할 수 있습니다 .

MySQLTunner는 200 개의 사용 가능한 연결 (최대 연결 설정)을 사용하여 RAM을 채울 것이라고 말합니다. 아파치가 150 프로세스로 제한했다고 가정 해 봅시다. MySQL과 아파치가 150 개의 연결을 사용하려고 할 때 RAM이 충분하지 않을 것입니다 (아파치뿐만 아니라 좋은 RAM 먹는 사람).

그래서 이것은 RAM에 관한 것이며 아직 히트하지 않았습니다 :-) 최상위 명령은 15 개의 아파치 프로세스 만 표시합니다 (그러나로드 평균 3/6/16이므로 폭풍은 15 분 전이며 현재는 퇴거).

CPU 문제에 대해 shakalandy 의 좋은 응답을 보완하기 위해 하나의 단일 쿼리 때문일 수 있습니다. 거대한 테이블에 있거나 많은 재 인덱싱 작업을 수행하거나 많은 임시 파일을 사용하거나, 인덱스가 누락되었거나 (삭제 되었습니까?) 등을 감지 할 수 있습니다.이를 감지하는 유일한 방법은 느린 쿼리 로그를 활성화하는 것입니다. 8s와 같은 높은 임계 값으로). 그런 다음 mysqlsla 도구를 사용하여이 느린 쿼리 로그를 분석하고 식별 된 쿼리에 대해 Explain을 실행하십시오.


감사합니다, 실제로, mysql이 유일한 프로세스는 아닙니다 :)
Temnovit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.