MySQL Hohe Schreiblatenz
Entwickle ich eine social-ähnliche Anwendung, die derzeit für die Nutzung von AWS-services. Insbesondere die DB läuft auf RDS mit MYSQL.
Bisher testen wir die app mit einer begrenzten Anzahl von Benutzern (meist Freunde), die sich in durchschnittlich 15 Write IOPS/Sek.
Das eigentliche problem ist im Zusammenhang mit der sehr hohen schriftlich Latenz der db, die immer über 100ms. Der RDS-Instanz ist ein db.m3.xlarge und das ist viel mehr als das, was wir brauchen.
Ich versuchte, führen Sie einen Belastungstest in einer separaten Instanz (identische Konfiguration der DB und EC2), aber ich war nicht in der Lage zu reproduzieren wie eine hohe Latenz, auch wenn ich das senden war eine wesentlich höhere Zahl von Anfragen. So dachte ich, kann es aufgrund der Tabelle Fragmentierung, aber ich hab noch nicht laufen ein Tisch Optimierung, denn die db würde nicht zugänglich sein, während dieses Vorgangs.
Haben Sie Erfahrungen mit diesem problem?
MEHR INFO
- Verwenden wir mysql-version 5.6.21 mit INNODB als storage-engine.
- Die ganze DB ist über 100MB in der Größe
-
Die größte Tabelle (genannt
Message
) hat über 790k Zeilen. Über diese Tabelle, die folgende Abfrageinsert into Message (user_id, creationDate, talk_id, text, id) values (2015, '2015-02-01 16:40:06.737', 18312, 'Some text ', 904870)
nahm 11s ausgeführt werden.
-
Schlimmer noch, die Abfrage
insert into Comment (anonymous, user_id, creationDate, deleted, post_id, text, id) values (1, 107347, '2015-02-01 16:40:01.849', 0, 124888, 'Comment text', 265742)
nahm 14s, aber die Tabelle Kommentar hat etwa 160k.
Diesen beiden Tabellen werden erzeugt durch:
CREATE TABLE `comment` (
`id` bigint(20) NOT NULL,
`anonymous` bit(1) NOT NULL,
`creationDate` datetime NOT NULL,
`deleted` bit(1) NOT NULL,
`text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` bigint(20) NOT NULL,
`post_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_jhvt6d9ap8gxv67ftrmshdfhj` (`user_id`),
KEY `FK_apirq8ka64iidc18f3k6x5tc5` (`post_id`),
CONSTRAINT `FK_apirq8ka64iidc18f3k6x5tc5` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`),
CONSTRAINT `FK_jhvt6d9ap8gxv67ftrmshdfhj` FOREIGN KEY (`user_id`) REFERENCES `kuser` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
und
CREATE TABLE `message` (
`id` bigint(20) NOT NULL,
`creationDate` datetime NOT NULL,
`text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` bigint(20) NOT NULL,
`talk_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_d0j091jvk2y4mmfbadnqlohtf` (`user_id`),
KEY `FK_64tr15t6wu5y9u143gxt6o3g2` (`thread_id `),
CONSTRAINT `FK_64tr15t6wu5y9u143gxt6o3g2` FOREIGN KEY (`thread_id`) REFERENCES `thread` (`id`),
CONSTRAINT `FK_d0j091jvk2y4mmfbadnqlohtf` FOREIGN KEY (`user_id`) REFERENCES `kuser` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
EINIGE GRUNDSTÜCKE
Mit AppDynamics ich habe in der Lage, extrahieren Sie die folgenden Grundstücke:
-
Wait-States: Ist das nicht der Abfrage Ende der Zeit zu groß?
-
Puffer Seite:
-
Schreiben von Wartezeit und Warteschlange:
Query-Cache
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
Danke für Eure Hilfe!
Andrea
- Wir sind gonna brauchen mehr details. Sie haben nicht angegeben, MySQL-version, Speicher-engine, Datenbank-Schema, die Größe der Daten, Beispiel-queries, etc. Wir haben sehr hohe schreib-system mit kein Problem.
- Vielen Dank für deine Antwort Marcus. Ich habe mehr info.
- Ich erwartete zu sehen
id
als UNSIGNED und AUTO_INCREMENT. Wie sind Sie mit der Generierung der IDs? - Wir verwenden Hibernate (JPA) für die Abfrage der DB. Winterschlaf hält die zuletzt verwendete id für jede Tabelle und verwendet Sie, um neue Zeilen einfügen
- MySQL reserviert Speicherplatz 4 Blöcke (1 MB jeweils) zu einem Zeitpunkt. Profil Sie Ihre Abfragen, um sicherzustellen, dass es die MySQL-Zeit, nicht etwas anderes. Ja, es kann zerschnitten werden, wenn die Fragmentierung nur wirklich Einfluss auf das Lesen große zahlen von sequenziellen Datensätzen, nicht die Suche und Auswahl von einzelnen Datensätzen, die ist am häufigsten.
- Danke! Ich warte auf die db geladen werden, mit Anfragen zu Profil einfügen von Abfragen. Wenn es helfen kann, bekam ich diese timings (14s und 11s) aus der
slow_log
Tabelle in dermysql
schema. - Die slow-log beinhaltet in der Regel mehr Informationen als nur die Zeit.
- Ich habe das update Frage mit einigen stats. Vielen Dank für die Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kam ich in Berührung mit RDS-Ingenieure von amazon und Sie gab mir die Lösung.
Eine so hohe Latenz wurde durch eine sehr geringe Leistung Speicher-Typ. In der Tat, ich war mit dem Standard 5 GB, SSD (die Sie nennen GP2) das gibt 3 IOPS pro GB, was in 15 IOPS, wenn meine Bewerbung erforderlich, über 50 IOPS oder noch mehr.
Daher schlugen Sie vor, mich zu ändern der Speicher-Typ, um
Magnetic
bietet 100 IOPS als baseline. Darüber hinaus habe ich auch in der Lage, verringern Sie den instance-Typ, weil der Engpass war nur die Festplatte.Die migration dauerte etwa 3h aufgrund der sehr geringen Leistung der Quell-Datenträger (GP2).
Hoffe es kann jemand helfen, den es gibt!
Ihre query-Profil zeigt, dass die "Query end" - Zeit, ist sehr groß. Dies kann verursacht werden durch eine sehr (zu) große query-cache. Jedes mal, wenn Sie führen Sie eine update-Anweisung (INSERT, DELETE, UPDATE), die Abfrage-cache, die aktualisiert werden muss (jede Abfrage, liest aus den aktualisierten Tabellen ist ungültig).