40/sec zu 500/sec
Einleitung
Überrascht, durch den Titel? gut ist dieses
eine Tour von, wie wir das scalability jinx Behandlung magere 40
Aufzeichnungen pro Sekunde von der zu 500 Aufzeichnungen pro Sekunde
knackten. Passen Sie auf, waren die meisten Problemen, die wir
gegenüberstellten, gerade Vorwärts, also konnten erfahrene Leute
dieses überflüssig finden.
Inhalt
* 1.0, wo wir waren?
1.1 Gedächtnis schlägt den Himmel
1.2 niedrige Verarbeitung Rate
1.3 Datenverlust:- (
1.4 Mysql zieht uns herunter
1.5 Langsames Web client
* Straße 2.0 zum Nirwana
2.1 Steuerndes Gedächtnis!
2.2 Stromlinienverkleidung von von Verarbeitung Rate
2.3 Welches Datenverlust uh-uh?
2.4 Abstimmende Sql Fragen
2.5 Abstimmendes Datenbankschema
2.5 Mysql hilft uns Führung zu übernehmen!
2.6 Schneller... schneller web client
* Endergebnis 3.0
Wo waren wir?
Zuerst hatten wir ein System, das nur bis zu 40
Aufzeichnungen /sec einstufen könnte. Ich könnte die
Diskussion, über "was sogar bedenken sollte die ideale Rate der
Aufzeichnungen sein? ". Schließlich entschieden wir, daß
40/sec die ideale Rate für eine einzelne Brandmauer war. So,
wenn wir erlöschen müssen, mußten wir atleast 3 Brandmauern
stützen. Folglich entschieden wir, daß 120/sec die ideale Rate
sein würde. Gegründet auf den Daten von unserem competitor(s)
kamen wir zur Zusammenfassung, die, sie um 240/sec sich stützen
könnte. Wir dachten, daß sie okay war! da es unsere
erste Freigabe war. Weil alle Konkurrenten über die Zahl
Brandmauern sprachen, stützte sich er aber nicht auf die Rate.
Gedächtnis schlägt den Himmel
Unser Gedächtnis schlug immer den Himmel sogar an
512MB! (OutOfMemory Ausnahme) tadelten wir cewolf(s) das
inmemory Cachieren des erzeugten images.But, das wir nicht für langes
entgehen könnten! Gleichgültig, ob wir den Klienten
anschlossen oder nicht wir verwendeten, den Himmel in einem Paar von
Tagesmaximum flach zu schlagen 3-4 Tage! Interessant war dieses,
als wir Daten am sehr hohen rates(then) sendeten, von um 50/sec
reproduzierbar. Sie schätzten es Recht, ein unbegrenzter
Puffer, der wächst, bis er das Dach schlägt.
Niedrige Verarbeitung Rate
Wir verarbeiteten Aufzeichnungen mit der Rate von
40/sec. Wir benutzten Massenupdate von dataobject(s). Aber
es gab nicht die erwartete Geschwindigkeit! Wegen dieses
begannen wir, Daten im Gedächtnis zu horten, resultierend,
wenn wir Gedächtnis horteten!
Daten-Verlust:- (
Bei sehr hohen Geschwindigkeiten pflegten wir, viel ein
packet(s) zu vermissen. Wir schienen, wenig Datenverlust zu
haben, aber der ergab ein Gedächtnisschwein. Auf einigem, das
zwickt, um die Puffergröße zu begrenzen fingen wir an,
einen unveränderlichen Datenverlust von ungefähr 20% mit sehr hoher
Rate zu haben.
Mysql zieht uns herunter
Wir stellten eine haltbare Zeit gegenüber, als
wir eine Maschinenbordbuchakte von ungefähr 140MB importierten.
Mysql begann in Beschlag zu nehmen, das Maschine begonnene
Kriechen und manchmal es gleichmäßiges gestopptes responding.Above
alle, fingen wir an, deadlock(s) und Verhandlung timeout(s) zu
erhalten. Welches schließlich das Reaktionsvermögen des
Systems verringerte.
Langsames Web client
Hier wieder tadelten wir die Zahl Diagrammen, die
wir in einer Seite als der Engpaß zeigten und ignorierten die
Tatsache, daß es viele andere Faktoren gab, die das System
herunterzogen. Die Seiten verwendeten, 30 Sekunden zur Last für
eine Seite mit 6-8 Diagrammen und Tabellen nach 4 Tagen im
Internet-Rechenzentrum zu dauern.
Straße Zum Nirwana
Steuerndes Gedächtnis!
Wir versuchten, eine Begrenzung auf die Puffergröße von
10.000 zu setzen, aber sie nicht dauert für langes. Der
Hauptfehler im Design war, daß wir annahmen, daß der Puffer von
herum 10000 genügen würde, d.h. würden wir Prozeßaufzeichnungen
bevor der Puffer von 10.1000 Reichweiten sein. Inline mit der
Grundregel ", das etwas falsch gehen kann es, geht falsch!" es
ging falsch. Wir fingen an, Daten zu lösen.
Subsesquently, das wir entschieden, mit einem flache Akte
gegründeten Cachieren zu gehen, worin die Daten in die flache Akte
entleert wurden und in die Datenbank mit "den infile Last Daten"
geladen würden. Dieses war viele Mal schneller als ein
Masseneinsatz über Datenbanktreiber, den Sie zur Prüfung etwas
mögliche Optimierungen mit den infile Last Daten auch wünschen
konnten. Dieses regelte unser Problem der Erhöhung von von
Puffergröße der rohen Aufzeichnungen.
Das zweite Problem, das wir gegenüberstellten, war die
Zunahme von cewolf(s) des Gedächtnisses, das Einheit cachiert.
Durch Rückstellung verwendete es "TransientSessionStorage", das
die Bildgegenstände im Gedächtnis cachiert, dort geschienen, um
irgendein Problem beim Säubern herauf die Gegenstände zu sein,
selbst nachdem die rerferences verloren waren! So schrieben wir
eine kleine "FileStorage" Implementierung, die die Bildgegenstände in
der lokalen Akte speichern. Und seien gedient Sie, wie und wann
den Antrag hereinkommt. Außerdem implmentated wir auch eine
Reinigungeinheit Reinigung zu den verjährten images(Bildern, die
älter als 10mins sind).
Ein anderer interessanter Aspekt, den wir war fanden hier,
daß der Abfallkollektor niedrigste Priorität also die Gegenstände,
die für jedes Aufzeichnungen verursacht wurden hatte, wurden
gesäubert kaum oben. Ist hier wenig Mathe, zum der Größe des
Problems zu erklären. Wann immer wir eine
Maschinenbordbuchaufzeichnung empfangen, die wir objects(hashmap ~20
verursachten, tokenized Zeichenketten usw.) so mit der Rate von
500/sec für 1 zweites, die Zahl Gegenständen war 10,000(20*500*1).
Wegen des schweren verarbeitenabfallkollektors hatte nie eine
Wahrscheinlichkeit zur Reinigung die Gegenstände. So aller, den
wir tun mußten, war ein Minderjähriger zwicken, wir zuwies
gerade "Null" den Gegenstandhinweisen. Voila! der
Abfallsammler war nie gequält ich schätzen; -)
Stromlinienverkleidung von von Verarbeitung Rate
Die Verarbeitung Rate war an einem mageren 40/sec,
das bedeutet, daß wir sogar einem kleinen Ausbruch der
Maschinenbordbuchaufzeichnungen kaum widerstehen könnten! Die
Gedächtnissteuerung gab uns irgendeinen Trost, but, welches
das tatsächliche Problem mit der Anwendung der Alarmfilter über den
Aufzeichnungen war. Wir hatten herum 20 Eigenschaften für jede
Aufzeichnung, wir verwendeten, nach allen Eigenschaften zu suchen.
Wir änderten die Implementierung zum Gleichen für jene
Eigenschaften, die wir Kriterien für hatten! Außerdem hatten
wir auch eine Gedächtnisleckstelle in der Alarmfilterverarbeitung.
Wir behielten eine Warteschlange bei, die für immer wuchs.
So mußten wir einen flache Akte Gegenstand beibehalten, der
entleert, um die Re-Satzgliederung der Aufzeichnungen zu vermeiden, um
Gegenstände zu bilden! Außerdem pflegten wir, die Tat des
Suchens nach einem Gleichen zu tun für jede der Eigenschaft, selbst
wenn wir keine Alarmkriterien zusammenbauen ließen.
Welches Datenverlust uh-uh?
Sobald wir regelten, gibt das Gedächtnis heraus, wenn es
die Daten empfängt d.h., die in flache Akte, wir entleeren, verlor
nie Daten! Zusätzlich zu dem mußten wir ein Paar der
unerwünschten Indizes in der rohen Tabelle entfernen, um die Unkosten
beim Entleeren von von Daten zu vermeiden. Wir hadd Indizes für
Spalten, die ein Maximum von 3 möglichen Werten haben konnten.
Welches wirklich den Einsatz langsamer bildete und nicht
nützlich war.
Abstimmende Sql Fragen
Ihre Fragen sind Ihre Schlüssel zur Leistung.
Sobald Sie anfangen, die Ausgaben zu nageln, sehen Sie, daß Sie
die Tabellen De-normalisieren sogar müssen konnten. Wir taten
sie! Ist hier einige der Schlüssellearnings:
* Gebrauch "analysiert Tabelle", um zu kennzeichnen,
wie die mysql Frage arbeitet. Dieses gibt Ihnen Einblick
ungefähr, warum die Frage langsam ist, d.h., ob sie die korrekten
Indizes verwendet, ob sie einen Tabelle Niveauscan usw. verwendet.
* Nie Löschungreihen, wenn Sie sehr große Daten im
Auftrag von 50.000 Aufzeichnungen in einer einzelnen Tabelle
beschäftigen. Immer Versuch, zum einer "Tropfentabelle" soviel
wie möglich zu tun. Wenn es nicht möglich ist, entwerfen Sie
Ihr Schema neu, daß Ihr nur Ausweg ist!
* Vermeiden Sie unerwünschtes join(s), haben nicht
Angst De-zu normalisieren (kopieren Sie d.h. die Spalte Werte),
vermeiden join(s) soviel wie, möglich, sie neigen, Ihre Frage
herunterzuziehen. Ein versteckter Vorteil ist die Tatsache, daß
sie Einfachheit in Ihren Fragen auferlegen.
* Wenn Sie Massendaten beschäftigen, immer ist
Gebrauch "die infile Last Daten" dort zwei Wahlen hier, Einheimisches
und Direktübertragung. Verwenden Sie Einheimischen, wenn das
mysql und die Anwendung in der gleichen Maschine anders
Gebrauchdirektübertragung sind.
* Versuchen Sie, Ihre komplizierten Fragen in zwei
oder drei einfachere Fragen aufzuspalten. Die Vorteile in dieser
Annäherung sind, daß das mysql Hilfsmittel oben nicht für den
gesamten Prozeß in Beschlag genommen wird. Neigen Sie,
temporäre Tabellen zu benutzen. Anstatt zu verwenden, legt eine
einzelne Frage, die über 5-6 überspannt ver.
* Wenn Sie sehr große Menge Daten beschäftigen,
d.h. wünschen Sie zu den proces sagen 50.000 Aufzeichnungen oder mehr
in einem einzelnen Frage Versuch mit Begrenzung zum Stapelprozeß die
Aufzeichnungen. Dieses hilft Ihnen, das System zu den neuen
Höhen einzustufen
* Benutzen Sie immer kleineres
transaction(s) anstelle von den großen d.h. überspannend über "n"
Tabellen. Dieses verriegelt oben die mysql Betriebsmittel, die
Langsamkeit des Systems sogar für einfache Fragen verursachen
konnten
* Benutzen Sie join(s) auf Spalten mit
Indizes oder fremden Schlüsseln
* Stellen Sie sicher, daß die Fragen von
der Benutzerschnittstelle Kriterien haben oder begrenzen Sie.
* Stellen Sie auch sicher, daß die Kriterien Spalte
registriert ist
* Haben Sie nicht den numerischen Wert in
den sql Kriterien innerhalb der Anführungsstriche, weil mysql eine
Art Form tut
* benutzen Sie temporäre Tabellen soviel wie
möglich, und lassen Sie sie... fallen
* Einsatz von select/delete ist eine
doppelte Tabelle Verriegelung... ist bewußt...
* Mach's gut, daß Sie die mysql Datenbank
mit der Frequenz Ihrer Updates nicht zur Datenbank schmerzen.
Wir hatten einen typischen Fall, den, wir pflegten, zur
Datenbank zu entleeren nachdem jede 300 Aufzeichnungen. So, als
wir anfingen, auf 500/sec zu prüfen, fingen wir an, zu sehen, daß
das mysql uns buchstäblich unten schleppte. Das ist, als wir
feststellten, daß das typicall mit der Rate von 500/sec dort ein
infile "Antrag" der Last Daten jede Sekunde zur mysql Datenbank ist.
So mußten wir ändern, um die Aufzeichnungen nach 3 Minuten
anstatt 300 Aufzeichnungen zu entleeren.
Abstimmendes Datenbankschema
Wenn Sie sehr große Menge Daten beschäftigen,
stellen Sie immer sicher, daß Sie Ihre Daten verteilten. Die
ist Ihre Straße zum scalability. Eine einzelne Tabelle mit
Sagen 10 lakhs kann nie einstufen. Wenn Sie beabsichtigen,
Fragen für Reports durchzuführen. Haben Sie immer zwei Niveaus
Tabellen, rohe Tabellen eine für die tatsächlichen Daten und einen
anderen Satz für das Report tables(die Tabellen, die die
Benutzerschnittstellen an! fragen) Stellen Sie immer sicher,
daß die Daten bezüglich Ihrer Reporttabellen nie über einer
Begrenzung hinaus wachsen. Hüllen Sie Sie planen, Orakel, Sie
ein zu verwenden kann das Verteilen ausprobieren basiert auf
Kriterien. Aber leider stützt mysql nicht das. So müssen
wir das tun. Behalten Sie eine Metatabelle bei, in der Sie die
Kopfzeile d.h., die verlegen, um zu suchen, für einen Satz gegebene
Kriterien normalerweise Zeit haben.
* Wir mußten durch unser Datenbankschema gehen und
wir fügten hinzu, um einige Indizes zu addieren, löschen einiges und
sogar kopiertes column(s), um teures join(s) zu entfernen.
* Vorwärts gehen verwirklichten wir das, welches
die rohen Tabellen hat, da InnoDB wirklich Unkosten zum System war,
also uns änderten es zu MyISAM
* Wir gingen auch im Umfang eines
Verringerns der Zahl Reihen in den statischen Tabellen, die innen
betroffen sind, verbinden
* NULL in den Datenbanktabellen scheint,
irgendeine Leistung zu veranlassen zu schlagen, also vermeiden Sie
sie
* Haben Sie nicht Indizes für Spalten, das
Werte von 2-3 erlaubt hat
* Gegenprüfung die Notwendigkeit an jedem
Index in Ihrer Tabelle, sind sie teuer. Wenn die Tabellen InnoDB
dann von der Doppeltüberprüfung ihre Notwendigkeit sind. Weil
InnoDB Tabellen scheinen zu nehmen herum, setzt 10-15 Zeit Größe der
MyISAM Tabellen fest.
* Verwenden Sie MyISAM, wann immer es eine
Majorität von gibt, irgendein eine von (wählen Sie oder Einsatz)
vor, Fragen. Wenn der Einsatz und die auserwählten sein werden
dann, ist es besser, ihn als InnoDB zu haben
Mysql hilft uns Führung zu übernehmen!
Stimmen Sie Ihren mysql Bediener NUR nach Ihnen feine
Melodie Ihr queries/schemas und Ihr Code ab. Nur dann Sie
können eine spürbare Verbesserung in der Leistung sehen. Sind
hier einige der Parameter, die in handliches kommt:
* Verwenden Sie die Pufferpoolgröße, die Ihren
Fragen ermöglicht, -- innodb_buffer_pool_size=64M für InnoDB und
verwenden -- key-bufer-size=32M für MyISAM schneller durchzuführen
* Gleichmäßige einfache Fragen fingen an,
mehr Zeit als erwartet zu dauern. Wir wurden wirklich verwirrt!
Wir stellten fest, daß mysql scheint, den Index jeder
möglicher Tabelle zu laden, die er anfängt, an einzusetzen. So
was gewöhnlich geschah, war, jede einfache Frage zu einem Tabelle mit
5-10 Reihen dauerte herum 1-2 sek. Auf weiterer Analyse fanden
wir daß kurz vor der einfachen Frage, "Last Daten infile" geschehen.
Dieses verschwand, als wir die rohen Tabellen zur MyISAM Art
änderten, weil die Puffergröße für innodb und MyISAM zwei
unterschiedliche Konfigurationen sind.
für konfigurierbarere Parameter sehen Sie hier.
Spitze: beginnen Sie Ihr mysql, um mit der folgenden
Wahl zu beginnen -- Maschinenbordbuch-Störung dieses ermöglicht der
Störspeicherung
Schneller... schneller web client
Die Benutzerschnittstelle ist der Schlüssel zu
jedem möglichem Produkt, besonders die wahrgenommene Geschwindigkeit
der Seite ist wichtiger! Ist hier eine Liste der Lösungen und
der learnings, die in handliches kommen konnten:
* Wenn Ihre Daten nicht für Sagen ändern werden
3-5 Minuten, ist es besser, Ihre Klient Seite Seiten zu cachieren
* Neigen Sie, Iframe(s)for innere Diagramme
etc. zu benutzen, das sie eine wahrgenommene Festigkeit zu Ihren
Seiten geben. Verbessern Sie noch Gebrauch die Javascript
gegründete zufriedene Ladeneinheit. Dieses ist etwas, das Sie
tun wünschen konnten, wenn Sie Diagramme des Sagens 3+ in der
gleichen Seite haben.
* Internet Explorer zeigt die vollständige Seite
an, nur wenn der ganzer Inhalt vom Bediener empfangen wird. So
ist es ratsam, iframes oder Javascript für zufriedenes Laden zu
verwenden.
* Benutzen Sie nie multiple/duplicate Eintragungen
der CSS Akte im HTML page. Internet Explorer neigt, jede CSS
Akte als unterschiedliche Eintragung zu laden und trifft auf der
kompletten Seite zu!
Grundlinie Ihre Fragen und Schema bilden das System
langsamer! Reparieren Sie sie zuerst und tadeln dann die
Datenbank!
Sehen Sie Auch
* Hohe Leistung Mysql
* Frage Leistung
* Erklären Sie Frage
* Optimierenfragen
* InnoDB Abstimmen
* Abstimmendes Mysql
Kategorien: Brandmauer-Analysator | Leistung spitzt diese Seite war Last modified 18:00,
August 31 2005.
- Ramesh-
Artikel Quelle: Messaggiamo.Com
Related:
» Seo Elite: New Seo Software!
» AntiSpywareBOT
» Reverse Mobile
» Error Nuker
Holen Sie sich den HTML-Code fü Webmaster
Fügen Sie diese Artikel Ihrer Website jetzt hinzu!
Webmaster veröffentlichen Sie Ihre Artikel
Keine Anmeldung erforderlich! Füllen Sie das Formular aus und Ihr Artikel wird im Messaggiamo.Com Artikel-Verzeichnis aufgenommen!