지난주부터 특별한 이유 없이 웹사이트가 급격히 느려지기 시작했습니다. MySQL에 로그인하고 show processlist를 실행했는데 결과는 다음과 같습니다.
mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+-----------+---------+---------+------+-------+------------------+
| 2047 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2049 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2050 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2052 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2053 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2054 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2055 | web | localhost | myDB | Sleep | 81 | | NULL |
...
| 2066 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2067 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2178 | web | localhost | myDB | Sleep | 76 | | NULL |
+------+------+-----------+---------+---------+------+-------+------------------+
131 rows in set (0.00 sec)
MySQL을 다시 시작하면 예상되는 프로세스가 없습니다. 웹사이트를 새로 고치고 프로세스를 빠르게 확인할 때 잠시 후 사라지는 일부 쿼리를 볼 수 있습니다. 모든 것이 완벽하지만 얼마 후 갑자기 위에 표시된 것과 같은 많은 프로세스가 다시 발생합니다. 물론 이것은 내 웹사이트를 정지시킵니다.
일정 시간이 지나면 해당 값 이전에 사라지는 것처럼 보이지만 wait_timeout
일정 시간이 지나면 다른 ID로 다시 나타납니다.
이 문제의 원인이 무엇인지 아는 사람이 있습니까?
내 서버 사양 :
CentOS 5
MySQL 버전 : 5.1.33-log 소스 배포
RAM 8GB
my.cnf의 일부
[mysqld]
default-character-set = utf8
character_set_server = utf8
default-collation = utf8_unicode_ci
collation_server = utf8_unicode_ci
ft_min_word_len = 3
port = 5689
socket = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer_size = 256M
group_concat_max_len = 2048
max_allowed_packet = 10M
table_cache = 512
table_definition_cache = 512
sort_buffer_size = 10M
net_buffer_length = 8K
read_buffer_size = 40M
read_rnd_buffer_size = 10M
myisam_sort_buffer_size = 8M
long_query_time = 1
net_read_timeout = 30
net_write_timeout = 60
log_slow_queries = /var/log/slowqueries
query_cache_type = 1
query_cache_limit = 5MB
query_cache_size = 134217728
max_heap_table_size = 24MB
tmp_table_size = 24MB
expire_logs_days = 99
max_connections = 500
init-connect = 'SET NAMES latin1'
thread_cache_size = 4
wait_timeout = 600
여러분 중 한 분이 저를 올바른 방향으로 안내하는 데 도움이 되기를 바랍니다. 아이디어가 부족해요.
편집 모든 것이 MySQL 버그와 관련된 것 같습니다.
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
불행히도 해결되지 않았습니다 :(
답변1
mysql 서버의 값을 확인하십시오. mysql에서 기본 사용자를 사용하고 있습니까? 또한 다음 두 가지 사항도 살펴보겠습니다.
특정 서버만 mysql 데이터베이스에 연결할 수 있는지 확인하십시오. %에서 연결하는 사용자가 있는 경우 올바른 비밀번호(및 타당한 이유)가 있는지 확인하십시오.
애플리케이션을 실행하기 위해 마련한 코드 요구 사항을 벗어나는 사람이 애플리케이션에 쿼리를 보내지 않는지 확인하세요. 누군가 귀하의 사이트를 방문하지 않고도 귀하의 데이터베이스에 데이터를 주입할 수 있습니다.
netstat에 세심한 주의를 기울여 잠시 동안 활성 연결을 추적하세요. wait_timeout은 누군가/무언가가 서버에 쿼리했음을 나타냅니다. 자세히 추적하면 그들이 누구인지 알아내는 데 도움이 됩니다. 급격한 변경 없이 빠르게 차단해야 한다면 iptables를 사용하세요.
마지막으로... mysql 로깅을 잠시 활성화하십시오. 귀하의 서버가 타격을 입을 것입니다하지만mysql에서 무슨 일이 벌어지고 있는지 정확히 알 수 있을 것이다.
my.cnf 파일을 편집하고 다음을 추가(또는 업데이트)하세요.
log = /var/log/mysql/mysql.log
편집: 정보 필드의 NULL 값은 실행 중인 명령문이 없음을 나타내기 때문에 앞의 제안을 했습니다.