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 의 출력입니다 .
top
명령
이 문제의 원인은 무엇입니까? my.cnf
서버가 정지되지 않도록 변경할 수 있습니까 ?
답변
- 키 버퍼 증가 (현재 64MB이지만 총 인덱스는 116M이므로 128MB 이상이어야 함) 즉시 도움이 될 것입니다.
- 테이블에서 mysqloptimize 및 mysqlrepair 를 실행하십시오.
- 테이블 캐시 증가 / 총 테이블 수를 줄이면 테이블 캐시 적중률이 증가합니다. 삭제되었거나 사용하지 않거나 오래된 테이블이있을 수 있습니다.
다른 권장되는 confugration 옵션 :
- log_slow_queries = /var/log/mysql/mysql-slow.log
- long_query_time = 4
- 로그 쿼리를 사용하지 않는 인덱스
잠시 후 로그 파일을 확인하십시오.
답변
둘 이상의 코어가있는 프로세서가 있거나 여러 개의 프로세서가 있습니다. 두 개의 코어가 있고 프로세스가 두 코어의 100 %를 사용하는 경우 맨 위에 200 %로 표시됩니다.
마찬가지로, 이것은 의도 한대로 작동하는 것 같습니다. 구성에 아무런 문제가 없습니다. 게시 한 내용이 자주 중단되는 경우 테이블에 적절한 색인을 추가하거나 쿼리를 최적화하는 것이 좋습니다.
답변
top -H
전체 프로세스뿐만 아니라 실행중인 모든 스레드를 보려면 실행 하십시오. 또한 1
상단에있는 동안 키를 누르면 개별 CPU / 코어의 CPU 사용량이 표시됩니다.
답변
MySQL은 독립적으로 작동하는 여러 프로세스 (스레드)를 가지고 있습니다. 예를 들어 하나는 메모리에서 디스크로 데이터를 쓰는 역할을합니다. CPU (및 / 또는 다중 CPU)에 여러 개의 코어가 있으면 둘 이상의 스레드가 작동하므로 단일 코어의 100 % 이상을 단순한 수준으로 실행할 수 있습니다. 두 코어 각각의 75 %가 실행 중일 수 있습니다. 150 %를 제공합니다.
답변
CPU와 관련이없는 문제를 발견했습니다. 동일한 서버에서 아파치와 MySQL을 사용하는 경우 아파치 활동이 증가하면 나쁜 상태 ( RAM )에 도달 할 수 있습니다 .
MySQLTunner는 200 개의 사용 가능한 연결 (최대 연결 설정)을 사용하여 RAM을 채울 것이라고 말합니다. 아파치가 150 프로세스로 제한했다고 가정 해 봅시다. MySQL과 아파치가 150 개의 연결을 사용하려고 할 때 RAM이 충분하지 않을 것입니다 (아파치뿐만 아니라 좋은 RAM 먹는 사람).
그래서 이것은 RAM에 관한 것이며 아직 히트하지 않았습니다 🙂 최상위 명령은 15 개의 아파치 프로세스 만 표시합니다 (그러나로드 평균 3/6/16이므로 폭풍은 15 분 전이며 현재는 퇴거).
CPU 문제에 대해 shakalandy 의 좋은 응답을 보완하기 위해 하나의 단일 쿼리 때문일 수 있습니다. 거대한 테이블에 있거나 많은 재 인덱싱 작업을 수행하거나 많은 임시 파일을 사용하거나, 인덱스가 누락되었거나 (삭제 되었습니까?) 등을 감지 할 수 있습니다.이를 감지하는 유일한 방법은 느린 쿼리 로그를 활성화하는 것입니다. 8s와 같은 높은 임계 값으로). 그런 다음 mysqlsla 도구를 사용하여이 느린 쿼리 로그를 분석하고 식별 된 쿼리에 대해 Explain을 실행하십시오.