Servidor de sobrecarga de consulta SQL

Servidor de sobrecarga de consulta SQL

Eu tenho um arquivo php que é chamado com frequência para uma verificação de sessão de um aplicativo externo. Não sei quantas chamadas ocorrem a cada segundo, mas acho que podem ser de 20 a 100 chamadas por segundo.

No entanto, este arquivo .php inclui uma consulta SQL que atualiza uma única linha. Uma vez que eu não comento essas linhas, todo o banco de dados fica muito lento e, no final, meu fórum não fica mais acessível. Acho que é algo como um problema de servidor (por exemplo, para muitos IOPS?). Infelizmente não sei como localizar o motivo exato da lentidão, nem como posso determinar quantas chamadas recebo a cada segundo para o arquivo php.

Esta é a consulta SQL muito simples (a cláusula where contém apenas a chave primária):

UPDATE bot_sessions SET ip_address = :ip_address, renewal_count = renewal_count + 1
       WHERE username = :username AND session_token = :session_token

Então, duas perguntas:

  1. Como posso descobrir com que frequência meu arquivo php específico é chamado a cada segundo?
  2. Como posso localizar o motivo pelo qual todo o meu banco de dados fica lento depois de usar esta consulta de atualização?

Responder1

Você deve ser capaz de descobrir com que frequência um arquivo PHP específico está sendo chamado examinando os logs do servidor web. Existem alguns outros hacks - por exemplo, usar o Google Analytics (que será menos preciso) ou atualizar um arquivo/contador (mais uso intensivo de recursos).

Como disse @ma.tome, monitorar sua utilização é um bom ponto de partida e geralmente é útil. Um processo Mysql rodando a 135% significa que está usando mais de 1 CPU. (Se você tiver 4 CPUs o total é 400%). A execução do vmstat fornecerá informações de IO.

Outra coisa a fazer pode ser começar a registrar os tempos de consulta em seu banco de dados. Além disso, verifique seus índices - dependendo do seu aplicativo, se ainda não estiver indexado, você poderá obter grandes aumentos de desempenho criando um índice para nome de usuário em bot_sessions. (Não tenho certeza se username ou session_token é a chave primária que você está especificando, talvez você queira criar um índice naquela que não é uma chave primária) - de qualquer forma, a cláusula where contém mais do que apenas a chave primária.

Além disso, seu sistema pode simplesmente estar ficando sem RAM. veja quanto swap você está usando - e, se necessário, jogue mais RAM no problema ou diminua o vm.swappiness.

informação relacionada