Da ich den Auslastungstest des API-Servers zum ersten Mal durchgeführt habe, möchte ich kurz den Zweck des damals erlernten Auslastungstests, Beispiele für Vorbereitungs- und Optimierungsmethoden sowie Orte vorstellen, die mir schwer fielen.
Geben Sie für jeden Server die Obergrenze "Keine Leistung besser als XX" an. </ b> ――Wenn Sie dies wissen, können Sie wissen, wie viele Server der Anzahl der Zugriffe standhalten können.
Stimmen Sie ab, um die Leistung zu verbessern. </ b>
Wenn Sie die Obergrenze für einen Server festlegen und der Durchsatz eines Servers gut ist, müssen Sie dies nicht tun. Daher wird während des Belastungstests eine Abstimmung durchgeführt, um die Leistung zu verbessern.
Stellen Sie sicher, dass das System skaliert werden kann. </ b>
Auch wenn Sie die Anzahl der Server erhöhen, macht es keinen Sinn, es sei denn, die Last wird verteilt. Stellen Sie daher sicher, dass die Last im Voraus ordnungsgemäß verteilt wird.
-API-Server mit Django erstellt ・ Locust (Lasttest-Tool, das in Python geschrieben werden kann) ・ Neues Relikt (Leistungsüberwachungsdienst)
Es macht keinen Sinn, blind zu stimmen. Nehmen Sie daher zunächst den minimal erforderlichen Leistungswert als Zielwert an. Diesmal
Bestimmen Sie die CPU-Auslastungsrate, die der Grenzwert für einen Server ist. </ b> ――Bestimmen Sie, wie viel Spielraum Sie als Grenzwert festlegen möchten. ――Bei dieser Entscheidung ist die Anzahl der Anforderungen, die unter Beibehaltung der festgelegten CPU-Auslastungsrate verarbeitet werden können, der Grenzwert dieses Servers während des Auslastungstests.
Angenommen, die maximale Anzahl von Anforderungen, die dieser Server pro Minute verarbeiten muss. </ b> ――Diese Zahl basiert auf der Anzahl der Anfragen, die Sie in maximal Minuten (oder Sekunden) bearbeiten müssen. ――Wenn entschieden wird, wie viele Anforderungen von einer Einheit verarbeitet werden können (Grenzwert einer Einheit), wird schließlich anhand der "maximalen Anzahl von Anforderungen ÷ Grenzwert einer Einheit" bestimmt, wie viele Server erforderlich sind. Ich kann.
Nehmen Sie beispielsweise von DAU usw. an, dass die Anzahl der Zugriffe während der Spitzenzeiten 12000 U / min beträgt und die CPU-Auslastungsrate, die von einem Server verwendet werden kann, 50% beträgt.
In diesem Fall, wenn das Ziel darin besteht, die Anzahl der Server auf vier zu begrenzen, Ziel ist es, 3000 U / min pro Einheit zu verarbeiten, wenn die CPU-Auslastung 50% beträgt. </ b>
Übrigens ist die Serverkonfiguration zum Zeitpunkt des Auslastungstests so.
Um die Anzahl pro Einheit zu ermitteln, haben wir zunächst einen Auslastungstest mit einem API-Server durchgeführt. New Relic wird nur auf API Server Nr. 1 installiert.
Nun bereiten wir Locust auf die nächste Ladung vor. Hier ist eine Referenz zur Verwendung von Locust. Erstellen Sie ein Szenario, indem Sie davon ausgehen, welche API mit welcher Geschwindigkeit aufgerufen wird.
Das folgende Beispiel zeigt ein einfaches Szenario: Die Benutzerregistrierung wird beim Erstellen eines Clients nur einmal durchgeführt, und die Anmelde-API und die Status-API werden danach in keiner bestimmten Reihenfolge aufgerufen. Der Taskdekorator gibt jedoch den Prozentsatz an, zu dem jede API aufgerufen wird.
# -*- coding:utf-8 -*-
"""
Ein Szenario einer Woche allgemeiner Bewegung
"""
from locust import HttpLocust, task, TaskSet
class ScenarioTaskSet(TaskSet):
def on_start(self):
"""
Benutzer Registration
Bereiten Sie hier die notwendigen Informationen für jeden Kunden vor
"""
self.user_id = "xxxxxxxxxxxxxx"
self.client.headers = {
'Content-Type': 'application/json; charset=utf-8',
}
self.client.post(
'/user/signup',
json={
"user_id": self.user_id,
}
)
@task(1)
def signin(self):
"""
Benutzer-Anmeldung
"""
self.client.post(
'/user/signin',
json={
"client_id": self.client_id,
}
)
@task(10)
def status(self):
"""
Benutzerinformationen abrufen
"""
self.client.post(
'/client/status',
json={
"client_id": self.client_id,
}
)
class MyLocust(HttpLocust):
task_set = ScenarioTaskSet
#Minimale Wartezeit für die Ausführung der Aufgabe
min_wait = 1000
#Maximale Wartezeit für die Ausführung der Aufgabe
max_wait = 1000
Führen Sie es dann mit dem folgenden Befehl aus.
locust -H http://apiserver.co.jp(← Server, den Sie laden möchten)
Wenn Sie mit einem Browser darauf zugreifen und der TOP-Bildschirm der Heuschrecke angezeigt wird, ist die Vorbereitung der Heuschrecke abgeschlossen. Danach können Sie den Belastungstest starten, indem Sie die Anzahl der Benutzer und den Verstärkungsfaktor angeben.
Wenn Sie tatsächlich starten, können Sie die Informationen sehen, die wie folgt in den Browser geladen werden.
locust hat eine Funktion zum Synchronisieren mit mehreren Slaves. Dieses Mal haben wir ungefähr 10 Server für locust vorbereitet und schließlich den API-Server von 10 locust-Servern geladen.
Wenn die Heuschrecke fertig ist, versuchen Sie, die Last aufzubringen, und überprüfen Sie den Ladestatus mit New Relic. Bei diesem Lasttest spielt dieses neue Relikt eine führende Rolle. Wenn Sie die Leistung optimieren, laden Sie es mit Heuschrecke, überprüfen Sie den Teil, an dem die Last mit New Relic aufgebracht wird, und reparieren Sie es mit einem Stimmstern. Mach die Arbeit. (Informationen zum Einrichten von New Relic in der Django-App sind hilfreich.](Https://gist.github.com/voluntas/7278351))
Laden wir es tatsächlich und werfen einen Blick auf New Relic. Unten ist die "Übersicht" von New Relic. Sie können die gesamten Informationen auf dieser Seite sehen. Dies sind die Daten vor dem Einstellen, aber der Durchsatz beträgt 43 U / min. Das ist ziemlich schrecklich. Im Diagramm "Antwortzeit für Web-Tarnsaction" ist es für jede Art der Verarbeitung farbcodiert. In diesem Beispiel nimmt Hellblau den größten Teil davon ein, sodass Sie sehen können, dass die Python-Verarbeitung insgesamt zu lange dauert. Ich werde. Wenn Sie sich den Übergang unten ansehen, können Sie auch feststellen, dass die API-Verarbeitung zu lange dauert und dass bei der Fehlerrate viele Fehler auftreten.
Wir werden basierend auf diesen Daten abstimmen und sie auf die Zielleistung erhöhen. Lassen Sie mich nun ein einfaches Beispiel für die Abstimmung geben.
Sehen Sie sich die Transaktionsseite von New Relic an, um festzustellen, welche APIs der Engpass bei langsamer Verarbeitung sind. Wenn Sie Most time conuming auswählen, werden die Anforderungen in der Reihenfolge der langsamsten Verarbeitung angezeigt.
Übrigens sind diesmal die meisten Ursachen die Python-Verarbeitung, daher ist "App Server-Ausfall" ganz blau, aber normalerweise wird das Verhältnis für jede Verarbeitung so dargestellt.
Darüber hinaus wird unter dem Diagramm eine "Aufschlüsselungstabelle" angezeigt, in der Sie sehen können, wo es Zeit braucht, einschließlich SQL. Wenn die Anzahl der SQL-Abfrageaufrufe (durchschnittliche Aufrufe) ungewöhnlich hoch ist oder die Verarbeitung lange dauert, beheben Sie sie. Dieses Mal habe ich Abfragen, die mehrfach aufgerufen wurden, zu einer kombiniert und Avg-Aufrufe auf 1 gesetzt, und für SQL mit langsamer Zeit den INDEX angepasst und die Zeit verkürzt.
Die Details der Funktion, die auf den Teil verweist, den Python verarbeitet, können hier jedoch nicht bestätigt werden. Sie können dann zur Seite "Transaktionsablaufverfolgung" unter "Transaktionsablaufverfolgung" unter "Aufschlüsselungstabelle" gehen, um detailliertere Informationen anzuzeigen.
Beispielsweise wird unter "Trace-Details" der Verarbeitungsinhalt auf diese Weise in der Reihenfolge der Verarbeitung angezeigt. Daher ist es sehr praktisch, wenn Sie den reparierten Teil markieren möchten, welcher Teil der Verarbeitung die Ursache ist.
In diesem Fall wurden vor INSERT die aus den beiden Tabellen ausgewählten Inhalte durch Python-Loop-Verarbeitung zusammengefasst und die Inhalte INSERTed.
Durch Vergleich mit "Trace-Details" können Sie beurteilen, dass der geladene Anwendungscode Teil der Schleifenverarbeitung von Python ist. Durch die Reduzierung der Last der Schleifenverarbeitung konnten wir daher den problematischen Teil des Anwendungscodes beseitigen.
Grundsätzlich kann durch Wiederholen von "Laden → Untersuchen der Ursache → Beheben der Ursache und Verbessern der Leistung" die Anforderung stabil bis zum Zielwert der CPU-Auslastung verarbeitet werden, und es gibt keinen Platz mehr, um sie zu reparieren. Wir werden die Leistung des Servers verbessern, indem wir alle Ursachen einschließlich der SQL-Verarbeitung und der Code-Verarbeitung verbessern.
Nach dem Einstellen des Servers ist es Zeit, die Grenzwerte zu messen. Da die Obergrenze bei 50% CPU-Auslastung liegt, wird die Last angewendet, während die CPU-Auslastung des Servers mit dem Befehl top überprüft wird.
Überprüfen Sie zunächst, bis die CPU-Auslastung 50% erreicht, dass die Verarbeitung auf dem Bildschirm des Ortsbrowsers stabil ist, passen Sie den Ort an und halten Sie die Last eingeschaltet, wenn die CPU-Auslastung bei etwa 50% liegt. .. Zu diesem Zeitpunkt können Sie die Drehzahl aus dem RPS von Locust berechnen. Dieses Mal passen wir die Leistung in Bezug auf den numerischen Wert von New Relic an. Überprüfen Sie daher die Drehzahl von New Relic, um sie zu vereinheitlichen, und das Limit des Servers Es wurde als Wert festgelegt.
Infolgedessen wurde die Leistung eines Servers festgelegt. Wenn Sie also die Anzahl erhöhen und prüfen können, ob die Last ordnungsgemäß verteilt ist, können Sie einfach die erforderliche Anzahl für den Betrieb vorbereiten.
Ich habe kurz die Methode des Belastungstests vorgestellt, aber dies ist nur ein Beispiel, und wenn Sie den Test tatsächlich versuchen, stehen verschiedene Wände auf.
Wenn Sie die diesmal eingeführte Verwendung und Optimierung von New Relic unterdrücken, können Sie möglicherweise einen grundlegenden Lasttest durchführen. In der Realität treten jedoch mehr Probleme auf und es sind unterschiedliche Abstimmungsansätze erforderlich. Wenn Sie zum ersten Mal hier sind, empfehlen wir Ihnen, den Test mit dem Rat einer erfahrenen Person durchzuführen. Wenn Sie der Meinung sind, dass Sie die Leistung ganz gut verbessert haben, wenn Sie eine erfahrene Person bitten, dies zu überprüfen, reicht die Last tatsächlich nicht aus </ b>.
Außerdem ist der Auslastungstest robust. Wenn Sie also über geringe Kenntnisse verfügen, werden Sie möglicherweise jedes Mal überlastet, wenn Sie den Server laden, und Sie wissen möglicherweise nicht, wer der Auslastungstest ist.
Da es sich jedoch um eine Menge Studien handeln wird, bin ich sicher, dass der Durchsatz sowohl des Servers als auch meiner selbst bis zum Abschluss des schmerzhaften Belastungstests erheblich erhöht sein wird! </ b> Wenn Sie eine Chance haben, wird es eine großartige Lernerfahrung sein, sobald Sie sie erlebt haben. Ich bin sicher, auch Sie werden eine Freundschaft mit dem Server aufbauen, mit dem Sie Schwierigkeiten hatten ☆
Recommended Posts