7
votes

Comment puis-je mesurer le temps MySQL, l'heure et / ou la charge d'une requête SQL en PHP?

J'ai besoin de trouver une certaine mesure de la durée de mes interrogations et de la charge sur le serveur si possible.

Je doute que c'est possible, mais j'aimerais aussi gagner la consommation de la CPU.

Des idées?


3 commentaires

La question, la base de données et le serveur Web sont les mêmes?


Non, car les temps pris pour traiter une requête ne montrent pas l'utilisation de la CPU sur le serveur. Cela pourrait être une requête rapide / grande ou une requête lente.


MySQL 5.6 a le module de performance. Cela peut aider.


7 Réponses :


6
votes

Regardez le profileur de la requête. Cela peut faire le temps de requête de ce dont vous avez besoin.

https://www.digitalocean.com/ Communauté / Tutoriels / How-User-MySQL-Query-Profiling

https://dev.mysql.com/doc/ Refman / 5.5 / fr / show-profil.html

Il existe différents outils pour voir la charge sur le serveur


4 commentaires

Mais je ne vois pas comment sortir cela dans PHP? Je veux vraiment avoir des erreurs piégeant dans PHP que je peux envoyer un email si les choses deviennent mauvaises.


Vous pouvez activer le profilage au début du script, puis faire un Afficher les profils à la fin. Vous pouvez utiliser les fonctions PHP standard que vous avez utilisées.


Le lien n'existe plus


Le lien est brisé à nouveau



21
votes

syntaxe php xxx

puis calculez la différence entre $ Starttime et $ dedtime.


4 commentaires

Je voterais pour vous, mais vous ne devez utiliser que la syntaxe de la syntaxe pour le code.


Comme la base de données et le serveur Web sont sur différents serveurs, cela ne pourra pas distinguer si la base de données allait lentement ou le serveur Web.


Considérant que la page PHP attend simplement que la requête MySQL ait fini, cela est probablement suffisamment bon pour déterminer le temps d'exécution de la requête. Il est peu probable que même un serveur Web lent aurait une incidence sur la vitesse indiquée; Si c'était si lent, alors vous auriez d'autres problèmes plus évidents. Mais pour des raisons que vous avez déjà mentionnées, cela ne vous aidera pas à trouver l'utilisation de la CPU.


@Matthew, c'est le temps du mur, pas le temps de la CPU.



2
votes

est presque impossible que votre base de données et votre serveur Web se trouvent différemment
De plus, vous essayez de l'atteindre à l'aide de PHP

la limitation b> p>

  • Vous devez avoir accès aux deux serveurs (tels que SSH) LI>
  • Si vous avez incorporé la vérification de la charge de la CPU telle que A EXEC_SHELL SSH dans la base de données et renvoyer UpTime code> sur chaque exécution de la requête, est Overkill li> ul>

    Solution de contournement b> p>

    Incorporer un cronjob dans votre serveur de base de données,
    Envoyé périodiquement un e-mail si la charge du serveur est allée haut p>

    ou p>

    à la base de données,

    Envoyé périodiquement email sur la requête en cours d'exécution en utilisant
    Afficher la liste complète des processus CODE> P>

    Exemple pour stocker Afficher la liste de processus complète forte> p>

    $con = mysqli_connect(...) or die('unable to connect');
    $sql = "show full processlist";
    $res = mysqli_query($con, $sql) or die($sql);
    
    /* optional path is /tmp */
    $fp  = fopen('/tmp/'.date('YmdHis'), 'w+');
    while ($row = $res->fetch_row())
    {
      fputcsv($fp, $row);
    }
    $res->free_result();
    


10 commentaires

J'utilise un serveur partagé avec mon package d'hébergement du FSI, pour que je puisse distinguer quel temps / charge est de ma faute?


@Jules - à peu près sûr que votre base de données est isolée avec d'autres. Demandez à vos FAI de commencer à profiler le Afficher la liste de processus complète et vous envoyer un e-mail comme un enregistrement ou stocké dans un serveur pour vous accéder ultérieurement.


@Jules - Vous pouvez utiliser le Afficher la liste complète de la liste à l'aide de votre connexion de base de données


J'ai demandé à mon ISP Demandez à votre fournisseur de services Internet de démarrer le profil de la liste de processus d'affichage et de vous envoyer un e-mail comme un enregistrement ou stocké dans un serveur pour accéder ultérieurement et il a dit qu'il n'était pas ce que vous voulez dire. Nous avons essayé que le commandez-le pympmyadmin et cela ne devrait que ce qui fonctionnait à ce moment-là. Il a un serveur Windows.


OMG, cela signifie-t-il que votre serveur d'hébergement est dans la fenêtre? Si votre serveur d'hébergement est une boîte Linux, demandez-lui de définir un cron qui explicitement Afficher la liste de processus complète sur votre base de données et tuez-la dans un fichier e-mail ou de disque. N'importe où, votre FAI incapable de suivre l'endroit où la charge provient (une grande question 1), et le gars que vous avez contacté ne sait pas comment configurer un planificateur (une grande question deux). Ceci est ironique.


Vérifiez à nouveau avec l'ISP, ont-ils des utilitaires du planificateur de tâches Windows. Si le serveur le comporte, vous pouvez conseiller votre fournisseur de services Internet de démarrer une tâche moniteur Afficher la liste de processus complète chaque minute. La sortie peut envoyer un email ou une sortie dans un emplacement sur votre serveur. Donc, chaque fois que votre serveur ayant une pointe sur charge, vous pouvez vérifier quelles sont les requêtes qui fonctionnent en même temps. S'il n'y a rien d'une requête lente significative, votre application n'est probablement pas le coupable.


Il n'y a pas une telle tâche de faire tout ça.


Sûr sûr que la fenêtre ou la boîte Linux est capable d'effectuer le planificateur. Lisez ceci - Stackoverflow.com/ Questions / 132971 / ... . Pouvez-vous accéder et installer planificateur sur votre serveur Web de fenêtre? L'alternative est pour vous de configurer un planificateur et do Afficher la liste de processus complète à votre base de données.


Oui, la planification d'une tâche peut être effectuée facilement, mais analysant Afficher la liste de processus complète à un fichier (s) puis en désactivant uniquement les éléments qui sont pour moi, puis envoyer un courrier électronique à la messagerie électronique.


Plus facile, vous préparerez un script PHP, exécutez la requête de spectacle, itérer les résultats (fetch_row) et fppTcsv dans un fichier à l'aide du nom de fichier comme "20101122080000". Se référer à des résultats mis à jour



0
votes

Il y a beaucoup d'informations que vous pouvez obtenir à propos de la base de données à l'aide de

SHOW STATUS;


1 commentaires

Last_Query_cost semble toujours retourner zéro. Je n'ai pas accès à des requêtes lentes car elle détient des requêtes d'autres clients d'hébergement. Les requêtes ralentissent également sont zéro.



0
votes

Utiliser microtime pour mesurer le temps requis pour une requête.

Pour la charge du serveur, voir http://www.php.net /manual/fr/function.sys-getloadavg.php . L'utilisation du processeur est principalement non pertinente, car la mySQL sera la plus basse du disque.


0 commentaires

0
votes

Pour des statistiques plus détaillées, vous devez utiliser mysqli :: get_connection_stats (si vous utilisez php 5.3 +)

http://www.php.net/manual/ fr / mysqli.get-raccord-statists.php


0 commentaires

0
votes

php ne peut vraiment que le temps du mysql_query () code> l'heure d'exécution, qui inclut tout le trajet aller-retour, la latence et les temps de transfert. Pour avoir une pause, vous devrez utiliser le profileur MySQL comme mentionné déjà. Le code suivant devrait émettre les informations que vous devez savoir. Si vous souhaitez incorporer le profilage dans votre processus PHP, vous devrez utiliser le profileur et sélectionner des champs pertinents à partir de la table informations_schema.profiling code>, mais s'il s'agit simplement de vérifier les performances ci-dessous suffisantes. .

<?php

$con = mysql_connect("localhost","root","my-password");
if (!$con)
{
 die('Could not connect: ' . mysql_error());
}

mysql_select_db("my-database", $con);

function microtime_float()
{
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}

mysql_query("set profiling=1;");

$starttime = microtime_float();
$query = mysql_query("SELECT * FROM my-table"); 
$endtime = microtime_float();
$trans_result = mysql_query("select sum(duration) as transtime from information_schema.profiling where query_id=1");
$transtime = mysql_result($trans_result, 0, 'transtime');
$total_time = ($endtime - $starttime); 
$transtime = ($total_time - $transtime); 

echo 'Total time: '.$total_time.' secs<br />';
echo 'Transfer time: '.$transtime.' secs<br />';
echo 'Query time break-down;<br />';

$debug_result = mysql_query("show profile cpu for query 1;");
while ($row = mysql_fetch_assoc($debug_result)) {
     echo $row['Status'].' (Time: '.$row['Duration'].', CPU_User: '.$row['CPU_user'].', CPY_sys: '.$row['CPU_system'].')<br />';    
}
?>


0 commentaires