pregunta interesante. Lo que REALMENTE desea es una forma de que PHP le haga dos preguntas al servidor mySQL:
servidor, ¿está utilizando casi toda su capacidad de CPU?
servidor, ¿está utilizando casi toda su capacidad de disco IO?
Según las respuestas, supongo que quiere simplificar el trabajo de su aplicación web PHP ... quizás eliminando algún tipo de capacidad de búsqueda, o almacenando en caché algunos datos de forma más agresiva.
Si tiene un intérprete de comandos para su servidor mysql (linux o bsd), sus dos preguntas pueden responderse observando el resultado de estos dos comandos.
sar -u 1 10 # the %idle column tells you about unused cpu cycles
sar -d 1 10 # the %util column tells you which disks are busy and how busy.
Pero no hay una pequeña consulta que obtenga estos datos de mySQL en su aplicación.
Editar: una posibilidad es escribir un pequeño truco PERL u otro programa simple que se ejecute en su servidor, se conecte a la base de datos local, y de vez en cuando (una vez por minuto) determine% inactivo y% util y actualiza una pequeña tabla de una fila en su base de datos. Podrías, sin demasiados problemas, añadir cosas como cuán llenos están tus discos a esta mesa, si te importa. Entonces su aplicación PHP puede consultar esta tabla. Este es un uso ideal del método de acceso MEMORIA. En cualquier caso, manténgalo simple: no quiere que su monitoreo afecte su servidor.
Un segundo mejor truco que PUEDE hacer de su cliente.
Emita el comando SHOW PROCESSLIST FULL, cuente el número de filas (procesos mySQL) para las cuales el comando es "Query", y si tiene muchas de ellas, considere que es una gran carga de trabajo.
También puede agregar los valores de Tiempo para los procesos que tienen Consulta de estado y usar un valor alto de ese tiempo como umbral.
EDIT: si se está ejecutando en el servidor MySQL 5, y su cuenta de servidor tiene acceso a la INFORMATION_SCHEMA amueblado-MySQL, se puede utilizar una consulta directamente para obtener los datos de proceso que he mencionado:
SELECT (COUNT(*)-1) P.QUERYCOUNT, SUM(P.TIME) QUERYTIME
FROM information_schema.PROCESSLIST P
WHERE P.COMMAND = 'Query'
COUNT (*) - 1: porque la consulta anterior en sí cuenta como una consulta.
Tendrá que juguetear con los valores de umbral para que esto funcione bien en producción.
Es una buena idea que la aplicación web PHP se descargue cuando el servidor de la base de datos no pueda mantener el ritmo. Aún así, una mejor idea es identificar sus consultas de larga ejecución y optimizarlas.
Gracias. Esto se ve muy interesante. Se da en el clavo con la cabeza para entender el problema. Me estoy ejecutando en un dedicado servidor de correo electrónico, así que tengo acceso a shell. ¿Cómo podría llamar esos comandos desde PHP? – Pablo
Pablo, ver mis ediciones ... –
Parece que estoy ejecutando mySQL 4 por lo que la consulta no funcionó. ¿Es mysql4 considerablemente peor que 5? ¿Se puede recrear la consulta para 4? – Pablo