GetUsage () est une fonction native PHP qui obtient l'utilisation des ressources du processus actuel ou de ses processus enfants. Il renvoie un tableau contenant des données à plusieurs niveaux de système, tels que le temps de processeur de l'état utilisateur / du noyau, les défaillances de la page de mémoire, les temps de commutation de contexte, etc.
$usage = getrusage();
Plusieurs champs couramment utilisés comprennent:
ru_utime.tv_sec et ru_utime.tv_usec : temps consommé par l'état utilisateur (secondes et microsecondes)
ru_stime.tv_sec et ru_stime.tv_usec : temps consommé dans l'état du système (secondes et microsecondes)
ru_minflt : nombre d'erreurs de page qui n'ont pas besoin d'être appelées à partir du disque (page douce manquante)
ru_majflt : nombre d'erreurs de page appelées depuis le disque (pages manquantes durs)
ru_nvcsw et ru_nivcsw : temps de commutation de contexte volontaire et involontaire
Le moyen le plus direct de surveiller l'impact des requêtes de base de données sur le système est:
Logs getTrusage () une fois avant la requête;
Exécuter la requête;
Enregistrez à nouveau GetTrusage () après la requête;
Comparez la différence entre les deux enregistrements.
L'exemple de code est le suivant:
function getResourceUsageDiff($start, $end) {
$diff = [];
foreach ($end as $key => $value) {
if (isset($start[$key])) {
$diff[$key] = $value - $start[$key];
}
}
return $diff;
}
$before = getrusage();
// Simuler la requête de base de données
$mysqli = new mysqli("localhost", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM users WHERE email LIKE '%@example.com'");
$after = getrusage();
$usageDiff = getResourceUsageDiff($before, $after);
echo "<pre>";
print_r($usageDiff);
echo "
";
Ce code peut produire des modifications dans les ressources système générées par la requête. Par exemple, si vous voyez une augmentation significative de ru_stime.tv_usec , cela signifie que la requête a provoqué une augmentation du processeur d'état du système et qu'il peut y avoir un grand nombre d'opérations d'E / S.
À des fins plus pratiques, le processus de mesure peut être encapsulé dans une fonction, en prenant en charge l'enregistrement automatique des instructions de requête et des modifications des ressources:
function profileQuery($query, $mysqli) {
$before = getrusage();
$result = $mysqli->query($query);
$after = getrusage();
$usageDiff = getResourceUsageDiff($before, $after);
file_put_contents("/var/log/db_profile.log", json_encode([
'query' => $query,
'usage' => $usageDiff,
'time' => date('c')
]) . PHP_EOL, FILE_APPEND);
return $result;
}
Cette méthode vous permet de collecter en continu l'impact de la requête sur les ressources système sans perturber la logique normale, fournissant ainsi une base pour l'optimisation ultérieure.
Comparaison de l'influence de différentes structures d'index
En utilisant des requêtes avec les mêmes conditions et différentes structures d'index pour comparer l'utilisation des ressources du système, vous pouvez évaluer intuitivement si les ajustements d'index sont efficaces.
Surveiller les requêtes par lots ou les performances de pagination de Big Data
Lorsque vous faites face à la pagination ou à la requête par lots, en observant si RU_MAJFLT et RU_NVCSW se développent, vous pouvez déterminer si la requête déclenche un grand nombre de paginations de mémoire ou de commutation de contexte.
Comparaison de l'utilisation des ressources dans les tests de stress
Coopérez avec des outils tels que Apache Benchmark, JMeter, etc. pour effectuer des tests simultanés, enregistrer les modifications de l'occupation des ressources et analyser les performances du système sous une charge élevée.
Si vous souhaitez voir les modifications de GetTrusage () plus clairement dans le navigateur pendant le débogage, vous pouvez formater la sortie en utilisant le code suivant:
function formatUsage(array $usage) {
return sprintf(
"User CPU: %.4fs, System CPU: %.4fs, Major Faults: %d, Voluntary CS: %d",
$usage['ru_utime.tv_sec'] + $usage['ru_utime.tv_usec'] / 1e6,
$usage['ru_stime.tv_sec'] + $usage['ru_stime.tv_usec'] / 1e6,
$usage['ru_majflt'] ?? 0,
$usage['ru_nvcsw'] ?? 0
);
}
echo formatUsage($usageDiff);