Uso extremamente alto da CPU do mysqld sem consultas ativas

1

Eu tenho um VPS rodando o Ubuntu 12.04 LTS com LEMP stack, segui o guia da Linode Library (desde que eu estou usando um Linode) para configurar, e tudo funcionou bem até agora.

Eu não sei o que está errado, mas o uso da minha CPU só aumenta desde uma semana atrás. Hoje as coisas estão ficando muito ruins - eu tenho 74% de uso da CPU, então fui checar e descobri que o mysqld está tendo muito uso da CPU (algo em torno de 30% ~ 80%)

Então eu fiz algumas pesquisas no Google, tentei desativar o InnoDB, reiniciei o mysql, reiniciei o ntp / system clock (não é este bug supostamente feito há mais de um ano ?!) e reiniciei o meu VPS, nada ajudou. Mesmo com o mysql processlist vazio, eu ainda uso muito o uso do CPU do mysqld.

Eu não sei o que eu perdi e não tenho nenhuma ideia, qualquer conselho seria apreciado.

Obrigado antecipadamente.

Atualização:

Consegui que eles executassem "strace mysqld"

write(2, "InnoDB: Unable to lock ./ibdata1"..., 44) = 44
write(2, "InnoDB: Check that you do not al"..., 115) = 115
select(0, NULL, NULL, NULL, {1, 0}^[[A^[[A)     = 0 (Timeout)
fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbfa496f8) = -1 EAGAIN (Resource temporarily unavailable)

hum ... Eu tentei desativar o InnoDB e isso não resolveu esse problema. Alguma idéia?

Update2:

# ps -e | grep mysqld
13099 ?        00:00:20 mysqld

depois use "strace -p 13099", as seguintes linhas aparecem repetidamente:

fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(12, {sa_family=AF_FILE, NULL}, [2]) = 14
fcntl64(12, F_SETFL, O_RDWR)            = 0
getsockname(14, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, [30]) = 0
fcntl64(14, F_SETFL, O_RDONLY)          = 0
fcntl64(14, F_GETFL)                    = 0x2 (flags O_RDWR)
setsockopt(14, SOL_SOCKET, SO_RCVTIMEO, "
write(2, "InnoDB: Unable to lock ./ibdata1"..., 44) = 44
write(2, "InnoDB: Check that you do not al"..., 115) = 115
select(0, NULL, NULL, NULL, {1, 0}^[[A^[[A)     = 0 (Timeout)
fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbfa496f8) = -1 EAGAIN (Resource temporarily unavailable)
# ps -e | grep mysqld
13099 ?        00:00:20 mysqld
fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(12, {sa_family=AF_FILE, NULL}, [2]) = 14
fcntl64(12, F_SETFL, O_RDWR)            = 0
getsockname(14, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, [30]) = 0
fcntl64(14, F_SETFL, O_RDONLY)          = 0
fcntl64(14, F_GETFL)                    = 0x2 (flags O_RDWR)
setsockopt(14, SOL_SOCKET, SO_RCVTIMEO, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 0
setsockopt(14, SOL_SOCKET, SO_SNDTIMEO, "<%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 0
fcntl64(14, F_SETFL, O_RDWR|O_NONBLOCK) = 0
setsockopt(14, SOL_IP, IP_TOS, [8], 4)  = -1 EOPNOTSUPP (Operation not supported)
futex(0xb786a584, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0xb786a580, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0xb7869998, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=10, events=POLLIN}, {fd=12, events=POLLIN}], 2, -1) = 1 ([{fd=12, revents=POLLIN}])
%pre%%pre%%pre%%pre%", 8) = 0 setsockopt(14, SOL_SOCKET, SO_SNDTIMEO, "<%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 0 fcntl64(14, F_SETFL, O_RDWR|O_NONBLOCK) = 0 setsockopt(14, SOL_IP, IP_TOS, [8], 4) = -1 EOPNOTSUPP (Operation not supported) futex(0xb786a584, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0xb786a580, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 futex(0xb7869998, FUTEX_WAKE_PRIVATE, 1) = 1 poll([{fd=10, events=POLLIN}, {fd=12, events=POLLIN}], 2, -1) = 1 ([{fd=12, revents=POLLIN}])

er ... agora eu não entendi x_x help

    
por RadarNyan 28.10.2013 / 19:38

2 respostas

1

Do seu resultado de strace , seu servidor mysql estava aceitando conexões. As chamadas poll significam esperar por uma conexão e as chamadas accept significam aceitar a conexão de entrada. Portanto, deve haver muitas conexões e consultas.

Você disse que SHOW PROCESSLIST retornou apenas o processo que estava consultando a lista de processos. Na verdade, esse comando só pode mostrar conexões em um determinado instante quando é chamado. Sites PHP populares geralmente não suportam conexão MySQL presistente. E muitas vezes uma consulta não leva muito tempo, mas apenas CPU.

Eu acho que você deveria checar todos os programas / sites que se conectam ao seu servidor MySQL. Talvez você possa ativar o log de consultas do MySQL para mais detalhes.

    
por 29.10.2013 / 12:58
0

Você pode emitir um comando 'SHOW PROCESSLIST'? Quantas conexões existem? Toda conexão leva um thread, talvez a alta carga da CPU seja por causa das conexões ociosas.

    
por 29.10.2013 / 10:17