Aktueller Standort: Startseite> Neueste Artikel> Wie kann ich GetUSage () verwenden, um Systemdruckänderungen vor und nach der Datenbankabfrage zu erkennen, um die Leistung zu verbessern?

Wie kann ich GetUSage () verwenden, um Systemdruckänderungen vor und nach der Datenbankabfrage zu erkennen, um die Leistung zu verbessern?

M66 2025-06-11

Was ist GetUsage ()

GetUSage () ist eine native PHP -Funktion, die die Ressourcenverwendung des aktuellen Prozesses oder seiner untergeordneten Prozesse erhält. Es gibt ein Array zurück, das Daten auf mehreren Systemebenen enthält, z.

 $usage = getrusage();

Einige häufig verwendete Felder umfassen:

  • RU_UTIME.TV_SEC und RU_UTIME.TV_USEC : Zeitverbrauch von Benutzerkennzeichen (Sekunden und Mikrosekunden)

  • ru_stime.tv_sec und ru_stime.tv_usec : Zeitverbrauch im Systemzustand (Sekunden und Mikrosekunden)

  • RU_MINFLT : Anzahl der Seitenfehler, die nicht von der Festplatte aufgerufen werden müssen (weiche Seite fehlt)

  • RU_MAJFLT : Anzahl der Seitenfehler, die von der Festplatte aufgerufen werden (harte fehlende Seiten)

  • ru_nvcsw und ru_nivcsw : freiwillige und unfreiwillige Kontextschaltzeiten


Rufen Sie GetUSage () vor und nach der Datenbankabfrage an

Der direkteste Weg, um die Auswirkungen von Datenbankabfragen auf das System zu überwachen, ist:

  1. Protokolle getTrusage () einmal vor der Abfrage;

  2. Abfrage ausführen;

  3. Record GetTrusage () erneut nach der Frage;

  4. Vergleichen Sie den Unterschied zwischen den beiden Datensätzen.

Der Beispielcode lautet wie folgt:

 function getResourceUsageDiff($start, $end) {
    $diff = [];
    foreach ($end as $key => $value) {
        if (isset($start[$key])) {
            $diff[$key] = $value - $start[$key];
        }
    }
    return $diff;
}

$before = getrusage();

// Simulieren Sie die Datenbankabfrage
$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 "
";

Dieser Code kann Änderungen in der Systemressource ausgeben, die durch die Abfrage generiert werden. Wenn Sie beispielsweise eine signifikante Zunahme von Ru_Stime.tv_usec sehen, bedeutet dies, dass die Abfrage zu einer Zunahme der CPU des Systemstaates verursacht wurde und möglicherweise eine große Anzahl von E/A -Operationen vorliegt.


Intuitivere Anzeige: Funktionskapselung und Protokollierung

Für praktischere Zwecke kann der Messprozess in eine Funktion eingekapselt werden, wodurch die automatische Aufzeichnung von Abfragestatements und Ressourcenänderungen unterstützt werden:

 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;
}

Mit dieser Methode können Sie die Auswirkungen der Abfrage auf Systemressourcen kontinuierlich erfassen, ohne die normale Logik zu stören, wodurch eine Grundlage für die anschließende Optimierung bereitgestellt wird.


Praktische Anwendungsvorschläge

  1. Vergleich des Einflusses verschiedener Indexstrukturen
    Unter Verwendung von Abfragen mit denselben Bedingungen und unterschiedlichen Indexstrukturen zum Vergleich der Verwendung von Systemressourcen können Sie intuitiv bewerten, ob Indexanpassungen wirksam sind.

  2. Batch -Abfrage oder Big Data Paging Performance
    überwachen
    Wenn Sie sich an die Paginierung oder die Batch -Abfrage stellen, um zu beobachten, ob Ru_Majflt und Ru_NVCSW wachsen, können Sie feststellen, ob die Abfrage eine große Anzahl von Speicherpaging- oder Kontextschaltschaltungen auslöst.

  3. Vergleich der Ressourcenverbrauch in Stresstests
    Kooperieren Sie mit Tools wie Apache Benchmark, JMeter usw., um gleichzeitige Tests durchzuführen, Änderungen der Ressourcenbeschäftigung aufzunehmen und die Leistung des Systems unter hoher Belastung zu analysieren.


Zusätzlich: Ausgabe verschönern (zum Debuggen)

Wenn Sie die Änderungen in GetTrusage () beim Debuggen deutlicher im Browser sehen möchten, können Sie die Ausgabe mit dem folgenden Code formatieren:

 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);