MySQL-Abfrage verzögert sich zufällig

Lesezeit: 14 Minuten

Benutzer-Avatar
GL_Stephen

Ich habe eine Abfrage, die so aussieht:

SELECT id FROM user WHERE id='47'

Die ID wird indiziert und Lesevorgänge für diese Abfrage sind immer schnell, wenn Profildaten wie diese verwendet werden.

SET profiling = 1;
SHOW PROFILES;

Die Abfragen werden immer in etwa 0,0002 Sekunden ausgeführt.

Wenn ich die Abfrage jedoch von der PHP-Seite aus profiliere, wie folgt:

$current = microtime(true);
$data = $conn->query($full_query);
$elapsed = microtime(true) - $current;

Dann gelegentlich vielleicht dauert 1 von 50 dieser Abfragen etwa 0,2 Sekunden. In meinem Testskript habe ich jedoch Code, um dies zu testen, der die Abfrage mit SET profiling = 1 profiliert; und obwohl der PHP-Roundtrip durch PDO 0,2 Sekunden betragen könnte, war die Abfragezeit immer noch 0,0002.

Dinge, die ich weiß oder weiß, die das Problem nicht verursachen:

  1. Die Abfrage ist nicht langsam. Wenn ich mir dieselbe Abfrage anschaue, aus demselben Abfragelauf, profiliert in PHP und profiliert mit SET PROFILING, ist die Abfrage immer schnell und wird nie im Protokoll für langsame Abfragen protokolliert, selbst wenn sie zeigt, dass sie von der PHP-Seite 0,2 Sekunden dauert.
  2. Dies hängt nicht mit skip-name-resolve zusammen – dies ist inkonsistent und ich habe skip-name-resolve bereits aktiviert
  3. Dies bezieht sich nicht auf den Abfrage-Cache, das Verhalten existiert in beiden
  4. Dieses Verhalten tritt auch bei Abfragen auf, die aus dem Cache kommen.
  5. Die Abfrage wählt die ID nicht wirklich aus, aber ich verwende diese Abfrage zum Testen, um zu zeigen, dass es sich nicht um ein Problem mit dem Festplattenzugriff handelt, da dieses Feld definitiv indiziert ist.
  6. Diese Tabellen sind nur 10-20 MB groß mit so etwas wie einem 1-MB-Index. Die Maschine zeigt sehr wenig Last und innodb verwendet nicht alle seine Puffer.
  7. Dies wird gegen eine Tabelle getestet, die außer meinen Testabfragen keine andere Aktivität hat.

Hat jemand eine Idee, was man noch prüfen könnte? Dies scheint mir ein Netzwerkproblem zu sein, aber ich muss in der Lage sein, es zu sehen und das Problem zu finden, um es zu beheben, und mir gehen die Orte aus, an denen ich als nächstes nachsehen kann. Irgendwelche Ideen?

  • Ist es möglich, dass ein anderer Prozess eine Lesesperre für die Tabellen erhält?

    – Mike

    15. Dezember 2013 um 1:08 Uhr

  • Einfache Anführungszeichen für eine Ganzzahl sind vollkommen akzeptabel und werden von MYSQL problemlos interpretiert.

    – GL_Stephen

    15. Dezember 2013 um 1:09 Uhr

  • Brian, es ist mir wichtig, weil ich in 15 Jahren des Umgangs mit mySQL noch nie ein so unregelmäßiges Abfrageverhalten gesehen habe und die 1 von 50 Lasten, die Sie zitieren, nur das sind, was ich oben angegeben habe. Das ist nicht immer das Verhältnis. Ich weiß, dass Sie nicht über den vollständigen Kontext verfügen, aber wir liefern Millionen von Seiten an Millionen von Uniques pro Monat. Diese Leistungsverhältnisse werden wichtig. Ich bin nicht hergekommen, um zu fragen, ob es ein Problem ist, ich bin gekommen, um zu fragen, ob jemand eine Lösung für das Problem hat, das ich bereits identifiziert habe.

    – GL_Stephen

    15. Dezember 2013 um 1:19 Uhr

  • +1 für die Art und Weise, wie diese Frage nur gestellt wurde. Es ist ein so seltener Anblick, dass eine Frage nach den Regeln gestellt wird. Bitte erinnern Sie mich in 2 Tagen daran – ich werde eine Prämie auf diese Frage setzen. Sonst wird es nie beachtet.

    – Ihr gesunder Menschenverstand

    15. Dezember 2013 um 12:13 Uhr

  • Nun, Sie können das Netzwerkproblem überprüfen, indem Sie einfach dieselbe Abfrage mit einer anderen API ausführen, z. B. dem alten MySQL.

    – Ihr gesunder Menschenverstand

    16. Dezember 2013 um 10:05 Uhr

Benutzer-Avatar
Neu-Alexandria

Ich würde die Maschine profilieren.

Sie sagen, dass dies ungefähr 1 von 50 Mal vorkommt und dass jede Abfrage einen 0,2-Sekunden-Benchmark hat. Sie sollten in der Lage sein, top in einen Bildschirm zu setzen und dann eine Schleife von Abfragen in PHP auszuführen, um das RDBMS einem Lasttest zu unterziehen und Leistungsstatistiken zu sammeln.

Sie müssen wahrscheinlich mehr als laufen 50 * 0.2 =10 seconds, da Ihre “1 von 50”-Statistik wahrscheinlich auf manuell ausgeführten Einzelabfragen basiert – basierend auf dem, was ich in Ihrer Beschreibung gelesen habe. Probieren Sie 30-sekündige und 90-sekündige Belastungstests aus.

Achten Sie während dieser Zeit auf Ihre top Prozessbildschirm. Sortieren Sie es nach CPU, indem Sie drücken P. Jedes Mal, wenn Sie ‘P’ drücken, ändert sich die Sortierreihenfolge für den Prozessor-CPU-Verbrauch, stellen Sie also sicher, dass Sie den Verbrauchsten oben haben. (drücken M sortiert nach Speichernutzung. überprüfen die Manpage für mehr)

Suchen Sie nach allem, was während der Zeit(en) Ihres Belastungstests nach oben sprudelt. Du solltest etwas springen sehen höher – aber momentan.
(Beachten Sie, dass ein solcher Prozess möglicherweise nicht ganz oben auf der Liste steht – er muss es nicht, könnte aber dennoch genügend Festplattenlast oder andere Aktivitäten verursachen, um den MySQL-Server zu verzögern.)

Benutzer-Avatar
Deepu

Ich habe das gleiche Phänomen auf meinen Systemen festgestellt. Abfragen, die normalerweise eine Millisekunde dauern, dauern plötzlich 1-2 Sekunden. Alle meine Fälle sind einfache INSERT/UPDATE/REPLACE-Anweisungen für einzelne Tabellen – nicht für SELECTs. Es ist keine Belastung, Verriegelung oder Gewindeaufbau erkennbar.

Ich hatte vermutet, dass es am Löschen von schmutzigen Seiten, dem Löschen von Änderungen auf der Festplatte oder einem versteckten Mutex liegt, aber ich muss es noch eingrenzen.

Auch ausgeschlossen

  1. Serverlast – keine Korrelation mit hoch

  2. load Engine – geschieht mit InnoDB/MyISAM/Memory MySQL Query

  3. Cache – geschieht unabhängig davon, ob er ein- oder ausgeschaltet ist

  4. Protokollrotationen – keine Korrelation bei Ereignissen

  • Hallo, hast du es geschafft, die Ursache deines Problems zu finden? Ich habe ein ähnliches Problem auf einem virtuellen CentOS-Server eines britischen Hosting-Unternehmens. Ich betreibe einfach eine Datenbank nur mit INNODB-Tabellen, mit einfachen Abfragen, und meistens dauert die Ausführung eines Satzes von 12 Abfragen insgesamt 15 Millisekunden, aber manchmal dauern sie jeweils 300 Millisekunden und sogar 1 Abfrage kann 1000 ms dauern. Es gibt viel RAM , Caching ist aktiviert, Thread-Pools sind in Ordnung. Der MySQL-Server und die PHP-Dienste befinden sich auf demselben Server. Ich denke nur, dass die Virtualisierung schlecht gemacht ist oder die Hardware möglicherweise fehlerhaft ist.

    – NVG

    29. Juni 2020 um 9:16 Uhr

Benutzer-Avatar
Bill Karwin

Gut, dass Sie den Abfrage-Profiler bereits verwendet haben. Wenn Sie MySQL 5.6 verwenden, haben Sie auch Zugriff auf viele neue Leistungsmessungen in der LEISTUNGS_SCHEMA. Dies hat die Fähigkeit, viel mehr Details zu messen als der Abfrage-Profiler, und es misst auch global statt nur einer Sitzung. P_S wird Berichten zufolge den Abfrageprofiler ersetzen.

Um Ihr Problem zu diagnostizieren, würde ich damit beginnen, ein TCP/IP-Problem zu bestätigen oder auszuschließen. Testen Sie beispielsweise das PHP-Skript, um zu sehen, ob es die gleiche intermittierende Latenz erhält, wenn es sich über den UNIX-Socket verbindet. Sie können dies tun, indem Sie sich mit verbinden localhost Das bedeutet, dass das PHP-Skript auf demselben Server wie die Datenbank ausgeführt werden muss. Wenn das Problem verschwindet, wenn Sie TCP/IP umgehen, bedeutet dies, dass die Hauptursache wahrscheinlich TCP/IP ist.

Wenn Sie sich in einer virtuellen Umgebung wie einem Cloud-Hosting befinden, können Sie leicht Leistungsschwankungen feststellen, da andere Benutzer derselben Cloud zeitweise die gesamte Bandbreite verbrauchen. Dies ist einer der Nachteile der Cloud.

Wenn Sie vermuten, dass es sich um ein TCP/IP-Problem handelt, können Sie die TCP/IP-Latenz unabhängig von PHP oder MySQL testen. Typische Tools, die leicht verfügbar sind, umfassen ping oder traceroute. Aber da sind viele andere. Du kannst auch Teste die Netzwerkgeschwindigkeit mit netcat. Verwenden Sie ein Tool, das im Laufe der Zeit wiederholt messen kann, da es so klingt, als hätten Sie die meiste Zeit eine gute Leistung mit gelegentlichen Störungen.

Eine andere Möglichkeit ist, dass der Fehler in PHP liegt. Sie können versuchen, PHP mit zu profilieren XHProf um herauszufinden, wo es seine Zeit verbringt.

Versuchen Sie, das Problem einzugrenzen. Führen Sie ein kleines Skript wie folgt aus:

https://drive.google.com/file/d/0B0P3JM22IdYZYXY3Y0h5QUg2WUk/edit?usp=sharing

… um zu sehen, welche Schritte in der Kette spitzen. Wenn Sie haben ssh2 installiert, es wird auch zurückkehren ps axu unmittelbar nach der am längsten laufenden Testschleife, um zu sehen, was läuft.

Wenn ich auf meiner Heimentwicklungsbox gegen localhost laufe, sehen die Ergebnisse so aus:

Array
(
    [tests summary] => Array
        (
            [host_ping] => Array
                (
                    [total_time] => 0.010216474533081
                    [max_time] => 0.00014901161193848
                    [min_time] => 9.7036361694336E-5
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 9.8943710327148E-5
                    [average] => 0.00010216474533081
                )

            [db_connect] => Array
                (
                    [total_time] => 0.11583232879639
                    [max_time] => 0.0075201988220215
                    [min_time] => 0.0010058879852295
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.0010249614715576
                    [average] => 0.0011583232879639
                )

            [db_select_db] => Array
                (
                    [total_time] => 0.011744260787964
                    [max_time] => 0.00031399726867676
                    [min_time] => 0.00010991096496582
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.0001530647277832
                    [average] => 0.00011744260787964
                )

            [db_dataless_query] => Array
                (
                    [total_time] => 0.023221254348755
                    [max_time] => 0.00026106834411621
                    [min_time] => 0.00021100044250488
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.00021481513977051
                    [average] => 0.00023221254348755
                )

            [db_data_query] => Array
                (
                    [total_time] => 0.075078248977661
                    [max_time] => 0.0010559558868408
                    [min_time] => 0.00023698806762695
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.00076413154602051
                    [average] => 0.00075078248977661
                )

        )

    [worst full loop] => 0.039211988449097
    [times at worst loop] => Array
        (
            [host_ping] => 0.00014400482177734
            [db_connect] => 0.0075201988220215
            [db_select_db] => 0.00012803077697754
            [db_dataless_query] => 0.00023698806762695
            [db_data_query] => 0.00023698806762695
        )

    [ps_at_worst] => USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2884  1368 ?        Ss   Sep19   0:29 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Sep19   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Sep19   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    Sep19   0:06 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Sep19   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    Sep19   0:25 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Sep19   7:42 [events/0]
root         8  0.0  0.0      0     0 ?        S    Sep19   0:00 [cgroup]
root         9  0.0  0.0      0     0 ?        S    Sep19   0:00 [khelper]
root        10  0.0  0.0      0     0 ?        S    Sep19   0:00 [netns]
root        11  0.0  0.0      0     0 ?        S    Sep19   0:00 [async/mgr]
root        12  0.0  0.0      0     0 ?        S    Sep19   0:00 [pm]
root        13  0.0  0.0      0     0 ?        S    Sep19   0:23 [sync_supers]
root        14  0.0  0.0      0     0 ?        S    Sep19   0:24 [bdi-default]
root        15  0.0  0.0      0     0 ?        S    Sep19   0:00 [kintegrityd/0]
root        16  0.0  0.0      0     0 ?        S    Sep19   0:47 [kblockd/0]
root        17  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpid]
root        18  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpi_notify]
root        19  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpi_hotplug]
root        20  0.0  0.0      0     0 ?        S    Sep19   0:00 [ata/0]
root        21  0.0  0.0      0     0 ?        S    Sep19   0:00 [ata_aux]
root        22  0.0  0.0      0     0 ?        S    Sep19   0:00 [ksuspend_usbd]
root        23  0.0  0.0      0     0 ?        S    Sep19   0:00 [khubd]
root        24  0.0  0.0      0     0 ?        S    Sep19   0:00 [kseriod]
root        25  0.0  0.0      0     0 ?        S    Sep19   0:00 [md/0]
root        26  0.0  0.0      0     0 ?        S    Sep19   0:00 [md_misc/0]
root        27  0.0  0.0      0     0 ?        S    Sep19   0:01 [khungtaskd]
root        28  0.0  0.0      0     0 ?        S    Sep19   0:00 [kswapd0]
root        29  0.0  0.0      0     0 ?        SN   Sep19   0:00 [ksmd]
root        30  0.0  0.0      0     0 ?        S    Sep19   0:00 [aio/0]
root        31  0.0  0.0      0     0 ?        S    Sep19   0:00 [crypto/0]
root        36  0.0  0.0      0     0 ?        S    Sep19   0:00 [kthrotld/0]
root        38  0.0  0.0      0     0 ?        S    Sep19   0:00 [kpsmoused]
root        39  0.0  0.0      0     0 ?        S    Sep19   0:00 [usbhid_resumer]
root        70  0.0  0.0      0     0 ?        S    Sep19   0:00 [iscsi_eh]
root        74  0.0  0.0      0     0 ?        S    Sep19   0:00 [cnic_wq]
root        75  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2i_thread/0]
root        87  0.0  0.0      0     0 ?        S    Sep19   0:00 [kstriped]
root       123  0.0  0.0      0     0 ?        S    Sep19   0:00 [ttm_swap]
root       130  0.0  0.0      0     0 ?        S<   Sep19   0:04 [kslowd000]
root       131  0.0  0.0      0     0 ?        S<   Sep19   0:05 [kslowd001]
root       231  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_eh_0]
root       232  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_eh_1]
root       291  0.0  0.0      0     0 ?        S    Sep19   0:35 [kdmflush]
root       293  0.0  0.0      0     0 ?        S    Sep19   0:00 [kdmflush]
root       313  0.0  0.0      0     0 ?        S    Sep19   2:11 [jbd2/dm-0-8]
root       314  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       396  0.0  0.0   2924  1124 ?        S<s  Sep19   0:00 /sbin/udevd -d
root       705  0.0  0.0      0     0 ?        S    Sep19   0:00 [kdmflush]
root       743  0.0  0.0      0     0 ?        S    Sep19   0:00 [jbd2/sda1-8]
root       744  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       745  0.0  0.0      0     0 ?        S    Sep19   0:00 [jbd2/dm-2-8]
root       746  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       819  0.0  0.0      0     0 ?        S    Sep19   0:18 [kauditd]
root      1028  0.0  0.0   3572   748 ?        Ss   Sep19   0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
root      1072  0.0  0.0  13972   828 ?        S<sl Sep19   2:13 auditd
root      1090  0.0  0.0   2052   512 ?        Ss   Sep19   0:00 /sbin/portreserve
root      1097  0.0  0.2  37568  3940 ?        Sl   Sep19   2:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc       1120  0.0  0.0   2568   800 ?        Ss   Sep19   0:09 rpcbind
rpcuser   1138  0.0  0.0   2836  1224 ?        Ss   Sep19   0:00 rpc.statd
root      1161  0.0  0.0      0     0 ?        S    Sep19   0:00 [rpciod/0]
root      1165  0.0  0.0   2636   472 ?        Ss   Sep19   0:00 rpc.idmapd
root      1186  0.0  0.0   2940   756 ?        Ss   Sep19  13:27 lldpad -d
root      1195  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_tgtd/0]
root      1196  0.0  0.0      0     0 ?        S    Sep19   0:00 [fc_exch_workque]
root      1197  0.0  0.0      0     0 ?        S    Sep19   0:00 [fc_rport_eq]
root      1199  0.0  0.0      0     0 ?        S    Sep19   0:00 [fcoe_work/0]
root      1200  0.0  0.0      0     0 ?        S<   Sep19   0:00 [fcoethread/0]
root      1201  0.0  0.0      0     0 ?        S    Sep19   0:00 [bnx2fc]
root      1202  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2fc_l2_threa]
root      1203  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2fc_thread/0]
root      1206  0.0  0.0   2184   564 ?        Ss   Sep19   1:08 /usr/sbin/fcoemon --syslog
root      1240  0.0  0.0   8556   976 ?        Ss   Sep19   1:22 /usr/sbin/sshd
root      1415  0.0  0.1  12376  2088 ?        Ss   Sep19   6:09 sendmail: accepting connections
smmsp     1424  0.0  0.0  12168  1680 ?        Ss   Sep19   0:02 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
root      1441  0.0  0.0   5932  1260 ?        Ss   Sep19   0:56 crond
root      1456  0.0  0.0   2004   504 tty2     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty2
root      1458  0.0  0.0   2004   504 tty3     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty3
root      1460  0.0  0.0   2004   508 tty4     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty4
root      1462  0.0  0.0   2004   504 tty5     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty5
root      1464  0.0  0.0   2004   508 tty6     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty6
root      1467  0.0  0.0   3316  1740 ?        S<   Sep19   0:00 /sbin/udevd -d
root      1468  0.0  0.0   3316  1740 ?        S<   Sep19   0:00 /sbin/udevd -d
apache    3796  0.0  0.4  32668  9452 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3800  0.0  0.4  32404  9444 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3801  0.0  0.4  33184  9556 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    3821  0.0  0.4  32668  9612 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3840  0.0  0.4  32668  9612 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    3841  0.0  0.4  32404  9464 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4032  0.0  0.4  32668  9632 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4348  0.0  0.4  32668  9460 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4355  0.0  0.4  32664  9464 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4356  0.0  0.5  32660  9728 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4422  0.0  0.4  32676  9460 ?        S    Dec16   0:06 /usr/sbin/httpd
root      5002  0.0  0.0   2004   504 tty1     Ss+  Nov21   0:00 /sbin/mingetty /dev/tty1
root      7540  0.0  0.0   5112  1380 ?        S    Dec17   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     7642  0.1  1.0 136712 20140 ?        Sl   Dec17   2:35 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root      8001  0.0  0.4  31028  9600 ?        Ss   Dec13   0:18 /usr/sbin/httpd
root      8092  0.0  0.0      0     0 ?        S    13:47   0:00 [flush-253:2]
root      8511  0.0  0.0      0     0 ?        S    13:48   0:00 [flush-8:0]
root      8551 16.0  0.4  28612  8008 pts/0    S+   13:49   0:00 php test-mysql-connection.php exit
root      8552 44.0  0.1  11836  3252 ?        Ss   13:49   0:00 sshd: root@notty 
root      8560  0.0  0.0   4924  1032 ?        Rs   13:49   0:00 ps axu
root     12520  0.0  0.1  11500  3212 ?        Ss   09:05   0:00 sshd: jonwire [priv]
jonwire  12524  0.0  0.1  11832  1944 ?        S    09:05   0:05 sshd: jonwire@pts/0
jonwire  12525  0.0  0.0   5248  1736 pts/0    Ss   09:05   0:00 -bash
root     16309  0.0  0.0   5432  1436 pts/0    S    12:01   0:00 su -
root     16313  0.0  0.0   5244  1732 pts/0    S    12:01   0:00 -bash
apache   16361  0.0  0.5  32908  9836 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16363  0.0  0.5  32908  9784 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16364  0.0  0.4  32660  9612 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16365  0.0  0.4  32668  9608 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16366  0.0  0.7  35076 13948 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16367  0.0  0.4  32248  9264 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16859  0.0  0.5  32916  9844 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   20379  0.0  0.4  32248  8904 ?        S    Dec15   0:08 /usr/sbin/httpd
root     28368  0.0  0.0      0     0 ?        S    Nov01   0:21 [flush-253:0]
apache   31973  0.0  0.4  31668  8608 ?        S    Dec16   0:08 /usr/sbin/httpd

)

Die ergebnisse von ps axu hier sind ziemlich nutzlos, weil ich mich mit localhost verbinde. Aber ich kann diesen Ergebnissen entnehmen, dass die DB-Verbindungslatenz gelegentlich ansteigt, ebenso wie die “Netzwerk”-Latenz (etwas TCP/IP-Puffer?).

Wenn ich Sie wäre, würde ich die Anzahl der Testzyklen auf 5000 oder 50000 erhöhen.

Benutzer-Avatar
Zsolt Szilagyi

Ich kann nur raten, aber da Sie die Serverlast eliminiert haben, und ich nehme an, Sie haben in den InnoDb-Stats nach roten Fahnen gesucht (phpmyadmin ist eine große Hilfe, obwohl es professionellere Tools gibt), was bleibt, ist eine inkonsistente Verwendung von Schlüsseln. Kann es sein, dass Ihre Abfrage leicht abweicht, und dass es da eine Konstellation gibt suboptimale Indizes werden verwendet?

Bitte fügen Sie eine hinzu FORCE INDEX PRIMARY oder wiederholen Sie Ihre Tests.

Benutzer-Avatar
Macht

Etwas, das ich bei der Diagnose von MySQL-Problemen in dieser Richtung als äußerst nützlich empfunden habe, ist mysqltuner. Es ist ein PERL-Skript, das sich Ihre MySQL-Instanz ansieht und verschiedene Optimierungsverbesserungen vorschlägt. Ehrlich gesagt wird es schwierig, den Überblick über all die Einstellungen zu behalten, die Sie vornehmen können, und dieses Skript ist großartig, um Ihnen eine Aufschlüsselung potenzieller Engpässe zu geben.

Etwas anderes, das Sie berücksichtigen sollten, ist die Funktionsweise von Linux selbst, was auch erklären könnte, warum Sie zufällig zurückbleiben. Beim Laden top Auf einer Linux-Box (jede Box, unabhängig von der Auslastung) werden Sie feststellen, dass Ihr Speicher fast vollständig belegt ist (es sei denn, Sie haben gerade neu gestartet). Dies ist kein Problem oder Überlastung Ihrer Box. Linux lädt so viel wie möglich in den Arbeitsspeicher, um Zeit zu sparen, und lagert selten verwendete Dinge in Ihre Auslagerungsdatei aus, genau wie alle modernen Betriebssysteme (genannt virtueller Arbeitsspeicher). Normalerweise keine große Sache, aber Sie verwenden wahrscheinlich InnoDB als Tabellentyp (der aktuelle Standard), der Dinge in den Arbeitsspeicher lädt, um ebenfalls Zeit zu sparen. Was passieren könnte, ist, dass Ihre Abfrage in den RAM geladen wurde (schnell), aber gerade lange genug im Leerlauf war, um in die Auslagerungsdatei ausgelagert zu werden (viel langsamer). Daher würden Sie einen kleinen Leistungseinbruch erleiden, während Linux es zurück in den RAM verschiebt (Auslagerungsdateien sind dabei effizienter, als MySQL es von der Festplatte verschieben würde). Weder MySQL noch InnoDB haben keine Möglichkeit, dies zu sagen, da es sich ihrer Meinung nach immer noch im RAM befindet. Das Problem ist ausführlich auf beschrieben dieses Blogwobei der relevante Teil ist

Normalerweise könnte ein kleiner Teil der Auslagerungsnutzung in Ordnung sein (wir sind wirklich besorgt über die Aktivität – Ein- und Auslagerungen), aber in vielen Fällen wird „echter“ nützlicher Speicher ausgelagert: hauptsächlich Teile des Pufferpools von InnoDB. Wenn es wieder benötigt wird, wird ein großer Leistungseinbruch vorgenommen, um es wieder einzulagern, was zu zufälligen Verzögerungen bei zufälligen Abfragen führt. Dies kann zu einer insgesamt unvorhersehbaren Leistung auf Produktionssystemen führen, und oft kann das System nach dem Beginn des Austauschs in eine Todesspirale der Leistung geraten.

Benutzer-Avatar
GL_Stephen

Wir haben herausgefunden, dass ein Problem mit der zugrunde liegenden Hardware dies verursacht hat. Wir haben den Server mit VMotion auf neue Hardware umgezogen und das Problem ist verschwunden. VMWare zeigte keine Warnungen oder Probleme mit der Hardware an. Ein Umzug von dieser Hardware hat das Problem jedoch behoben. Sehr sehr seltsam.

1260180cookie-checkMySQL-Abfrage verzögert sich zufällig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy