40/sec à 500/sec
Introduction
Étonnant, par le titre ? bien, c'est une
excursion de la façon dont nous avons fendu le jinx de scalability de
la manipulation les 40 disques pauvres par seconde à 500 disques par
seconde. Prenez garde, la plupart des problèmes que nous avons
faits face étaient directement vers l'avant, ainsi les personnes
expérimentées pourraient trouver ceci superflu.
Table des matières
* 1.0 où étions nous ?
1.1 La mémoire frappe le ciel
1.2 bas taux de traitement
1.3 Perte de données : - (
1.4 Mysql nous abaisse
1.5 Client Lent De Web
* route 2.0 au Nirvâna
2.1 Mémoire de contrôle !
2.2 Amélioration du taux de traitement
2.3 Quel uh-uh de perte de données ?
2.4 Questions D'Accord de SQL
2.5 Schéma d'accord de base de données
2.5 Mysql nous aide à aller de l'avant !
2.6 Plus rapidement... plus rapidement client de
Web
* résultat 3.0 inférieur
Où étions-nous ?
Au commencement nous avons eu un système qui pourrait
mesurer seulement jusqu'à 40 disques /sec. Je pourrais même
rappeler la discussion, au sujet de "ce que devrais être le taux
idéal de disques ? ". Enfin nous avons décidé qu'40/sec
était le taux idéal pour un mur à l'épreuve du feu simple.
Ainsi quand nous devons sortir, nous atleast avons dû soutenir
3 murs à l'épreuve du feu. Par conséquent nous avons décidé
que 120/sec serait le taux idéal. Basé sur les données de
notre competitor(s) nous sommes venus à la conclusion qui, ils
pourrait soutenir autour de 240/sec. Nous avons pensé qu'elle
était correcte ! car c'était notre premier dégagement.
Puisque tous les concurrents ont parlé du nombre de murs à
l'épreuve du feu il a soutenu mais pas sur le taux.
La mémoire frappe le ciel
Notre mémoire frappait toujours le ciel même à
512MB ! (exception d'OutOfMemory) nous avons blâmé cacher
inmemory de cewolf(s) de l'images.But produit que nous ne pourrions
pas nous échapper pour long ! Aucune matière si nous avons
relié le client ou pas nous ne frappait le ciel dans un couple des
jours maximum pendant 3-4 jours à plat ! Intéressant, c'était
reproductible quand nous avons envoyé des données au rates(then)
très élevé, de autour de 50/sec. Vous l'avez deviné droite,
un amortisseur illimité qui se développe jusqu'à ce qu'il frappe le
toit.
Bas taux de traitement
Nous traitions des disques au taux de 40/sec.
Nous employions la mise à jour en bloc du dataobject(s).
Mais il n'a pas donné la vitesse prévue ! Pour cette
raison nous avons commencé à amasser des données dans la mémoire
ayant pour résultat la mémoire de palissade !
Perte De Données : - (
À grande vitesse nous avions l'habitude de manquer
beaucoup d'un packet(s). Nous avons semblé avoir peu de perte
de données, mais cela a eu comme conséquence un porc de mémoire.
Sur certains tordant pour limiter la taille d'amortisseur nous
avons commencé à avoir une perte régulière de données environ de
20% aux taux très élevés.
Mysql nous abaisse
Nous faisions face à un moment difficile où nous
avons importé un dossier de notation environ de 140MB. Mysql a
commencé à acaparer, le rampement commencé par machine et parfois
il même responding.Above arrêté tout, nous avons commencé à
obtenir le timeout(s) de deadlock(s) et de transaction. Ce qui a
par la suite réduit la réponse du système.
Client Lent De Web
Ici encore nous avons blâmé le nombre de
graphiques que nous avons montrés dans une page comme goulot
d'étranglement, ignorant le fait qu'il y avait beaucoup d'autres
facteurs qui abaissaient le système. Les pages prenaient 30
secondes à la charge pour une page avec 6-8 graphiques et tables
après 4 jours au centre de calculs d'Internet.
Route Au Nirvâna
Mémoire De Contrôle !
Nous avons essayé de mettre une limite sur la taille
d'amortisseur de 10.000, mais elle pas durent long. La paille
principale dans la conception était que nous avons supposé que
l'amortisseur environ de 10000 suffirait, c.-à-d. nous serions les
disques de processus avant que l'amortisseur de 10.1000 extensions.
En ligne de pair avec le principe "que quelque chose peut aller
mal il ira mal!" il a mal tourné. Nous avons commencé à
desserrer des données. Subsesquently que nous avons décidé
d'aller de pair avec cacher basé de dossier plat, où les données
ont été vidées dans le dossier plat et chargées dans la base de
données en utilisant des "données de charge infile". C'était
beaucoup de fois plus rapidement qu'une insertion en bloc par
l'intermédiaire de conducteur de base de données que vous pourriez
également vouloir au contrôle quelques optimisations possibles avec
des données de charge infile. Ceci a fixé notre problème
d'augmenter la taille d'amortisseur des disques crus.
Le deuxième problème que nous avons fait face était
l'augmentation du cewolf(s) de la mémoire cachant le mécanisme.
Par défaut il a employé "TransientSessionStorage" qui cache
les objets d'image dans la mémoire, là semblé pour être un certain
problème en nettoyant les objets, même après que les rerferences
ont été perdus ! Ainsi nous avons écrit une petite exécution
d'"FileStorage" qui stockent les objets d'image dans le dossier local.
Et soyez servi au fur et à mesure que la demande entre.
D'ailleurs, nous implmentated également un mécanisme de
nettoyage aux images éventées d'images(de nettoyage plus anciennes
que 10mins).
Un autre aspect intéressant que nous avons trouvé était
ici que le collecteur d'ordures a eu la plus basse priorité ainsi les
objets créés pour le chaque des disques, ont été à peine
nettoyés. Voici des peu de maths pour expliquer l'importance du
problème. Toutes les fois que nous recevons un disque de
notation que nous avons créé l'objects(hashmap ~20, tokenized les
cordes etc..) ainsi au taux de 500/sec pour 1 seconde, le nombre
d'objets était 10,000(20*500*1). En raison du collecteur de
traitement lourd d'ordures n'a jamais eu une chance au nettoyage les
objets. Tellement tout que nous avons dû faire était un coup
sec mineur, nous a juste assigné l'"nulle" aux références d'objet.
Voila ! le collecteur d'ordures était non jamais torturé
je devinent ; -)
Amélioration du taux de traitement
Le taux de traitement était à un 40/sec pauvre
qui signifie que nous pourrions à peine résister même à un petit
accès des disques de notation ! La commande de mémoire nous a
donné une certaine consolation, but que le problème réel était avec
l'application des filtres alertes au-dessus des disques. Nous
avons eu autour 20 propriétés pour chaque disque, nous avions
l'habitude de rechercher toutes les propriétés. Nous avons
changé l'exécution en allumette pour ces propriétés que nous avons
eu des critères pour ! D'ailleurs, nous avons également eu
une fuite de mémoire dans le traitement alerte de filtre. Nous
avons maintenu une file d'attente qui s'est développée pour
toujours. Ainsi nous avons dû maintenir un objet de dossier
plat vidant pour éviter l're-analyse des disques pour former des
objets ! D'ailleurs, nous avions l'habitude de faire l'acte de
rechercher une allumette pour chacune de la propriété même lorsque
nous n'avons fait configurer aucun critère alerte.
Quel uh-uh de perte de données ?
Une fois que nous fixions la mémoire publie en recevant
des données c.-à-d. vidant dans le dossier plat, nous n'a jamais
perdu des données ! En plus de celui nous avons dû enlever un
couple des index non désirés dans la table crue pour éviter les
frais généraux tout en vidant des données. Nous index de hadd
pour les colonnes qui pourraient avoir un maximum de 3 valeurs
possibles. Ce qui a rendu l'insertion plus lente et n'était pas
réellement utile.
Questions D'Accord de SQL
Vos questions sont vos clefs à l'exécution.
Une fois que vous commencez à clouer les issues, vous verrez
que vous pourriez même devoir De-normaliser les tables. Nous
l'avons faite ! Voici certains des learnings principaux :
* L'utilisation "analysent la table" pour identifier
comment la question de mysql fonctionne. Ceci vous donnera
l'perspicacité environ pourquoi la question est lente, c.-à-d. si
elle emploie les index corrects, si elle emploie un balayage etc.. de
niveau de table.
* Jamais rangées d'effacement quand vous traitez
des données énormes dans l'ordre de 50.000 disques dans une table
simple. Toujours essai pour faire une "table de baisse" autant
que possible. S'il n'est pas possible, remodelez votre schéma,
qu'est votre seulement sortie !
* Évitez le join(s) non désiré, n'ont pas peur
De-pour normaliser (c.-à-d. reproduisez les valeurs de colonne)
évitent le join(s) autant que possible, elles tendent à abaisser
votre question. Un avantage caché est le fait qu'ils imposent
la simplicité dans vos questions.
* Si vous traitez des données en bloc, toujours
l'utilisation "données de charge infile" là sont deux options ici,
gens du pays et extérieur. Employez les gens du pays si le
mysql et l'application sont dans le même extérieur d'utilisation de
machine autrement.
* Essayez de couper vos questions complexes en deux
ou trois questions plus simples. Les avantages dans cette
approche sont que la ressource de mysql n'est pas acaparée vers le
haut pour le processus entier. Tendez à employer les tables
provisoires. Au lieu d'employer une question simple qui enjambe
à travers 5-6 ajourne.
* Quand vous traitez la quantité énorme de
données, c.-à-d. vous voulez aux proces dites 50.000 disques ou plus
dans un essai simple de question en utilisant la limite au traitement
par lots les disques. Ceci vous aidera à mesurer le système à
de nouvelles tailles
* Employez toujours un plus petit
transaction(s) au lieu de le grand c.-à-d. qui enjambe à travers des
tables de "n". Ceci ferme vers le haut les ressources de mysql,
qui pourraient causer la lenteur du système même pour des questions
simples
* Employez le join(s) sur des colonnes avec
des index ou des clefs étrangères
* Assurez-vous que les les questions de
l'interface utilisateur ont des critères ou limitez.
* Assurez-vous en outre que les critères de
colonne est classés
* N'ayez pas la valeur numérique dans des
critères de SQL dans des citations, parce que le mysql fait un type
fonte
* employez les tables provisoires autant que
possibles, et laissez- tomberles...
* L'insertion de select/delete est une
double serrure de table... se rende compte...
* Faites attention que vous ne fassiez pas
souffrir la base de données de mysql avec la fréquence de vos mises
à jour à la base de données. Nous avons eu un cas typique que
nous avions l'habitude de vider à la base de données après que
chaque 300 disques. Ainsi quand nous avons commencé à
déterminer 500/sec nous avons commencé à voir que le mysql nous
traînait littéralement vers le bas. C'est quand nous nous
sommes rendus compte que le typicall au taux de 500/sec il y a une
demande "infile" de données de charge chaque seconde à la base de
données de mysql. Ainsi nous avons dû changer pour vider les
disques après 3 minutes plutôt que 300 disques.
Schéma d'accord de base de données
Quand vous traitez la quantité énorme de
données, assurez-vous toujours que vous avez divisé vos données.
C'est votre route au scalability. Une table simple avec
des lakhs du disons 10 peut ne jamais mesurer. Quand vous avez
l'intention d'exécuter des questions pour des rapports. Ayez
toujours deux niveaux de tables, des tableaux crus un pour les
données réelles et d'un ensemble différent pour le tables(de
rapport les tables que les interfaces utilisateur questionnent dessus
!) Assurez-vous toujours que les données sur vos tables de
rapport ne se développent jamais au delà d'une limite.
Emballez-vous projettent employer l'oracle, vous peut essayer la
division basée sur des critères. Mais malheureusement le
mysql ne soutient pas cela. Ainsi nous devrons faire cela.
Maintenez une table de méta en laquelle vous avez l'information
d'en-tête c.-à-d. qui ajournent pour rechercher, pour un ensemble de
critères donnés normalement de temps.
* Nous avons dû marcher par notre schéma de base
de données et nous avons ajouté pour ajouter quelques index, en
supprimons et même le column(s) reproduit pour enlever le join(s)
coûteux.
* Aller en avant nous avons réalisé cela ayant les
tables crues car InnoDB était réellement des frais généraux au
système, ainsi nous l'avons changé en MyISAM
* Nous sommes également allés jusqu'au
degré de réduire le nombre de rangées dans les tables statiques
impliquées dedans se joint
* La NULLE dans des tables de base de
données semble faire frapper une certaine exécution, ainsi
évitez-les
* N'ayez pas les index pour des colonnes qui
a permis des valeurs de 2 ou 3
* Contre-vérification le besoin de chaque
index dans votre table, elles sont coûteuses. Si les tables
sont de contrôle de double d'InnoDB puis leur besoin. Puisque
les tables d'InnoDB semblent prendre autour 10-15 chronomètre la
taille des tables de MyISAM.
* Employez MyISAM toutes les fois qu'il y a une
majorité de, l'un ou l'autre une (choisissez ou insertion) de
questions. Si l'insertion et les choisis vont être puis il vaut
mieux de l'avoir comme InnoDB
Mysql nous aide à aller de l'avant !
Accordez votre serveur de mysql seulement après vous air
fin votre queries/schemas et votre code. Seulement alors vous
pouvez voir une amélioration perceptible d'exécution. Voici
certains des paramètres qui viennent dans maniable :
* Employez la taille de pool de tampons qui
permettra à vos questions d'exécuter plus rapidement --
innodb_buffer_pool_size=64M pour InnoDB et employer --
key-bufer-size=32M pour MyISAM
* Les même questions simples ont commencé
à prendre plus de temps que prévu. Nous avons été
embarassés réellement ! Nous nous sommes rendus compte que le
mysql semble charger l'index de n'importe quelle table qu'il commence
à s'insérer dessus. Ainsi ce qui s'est typiquement produit
était, n'importe quelle question simple à une table avec 5-10
rangées a pris autour 1-2 sec. Sur davantage d'analyse nous
avons constaté que juste avant la question simple, "infile de
données de charge" produit. Ceci a disparu quand nous avons
changé les tables crues en type de MyISAM, parce que la taille
d'amortisseur pour l'innodb et MyISAM sont deux configurations
différentes.
pour des paramètres plus configurables voyez ici.
Bout : commencez votre mysql pour commencer par
l'option suivante -- l'notation-erreur ceci permettra l'enregistrement
d'erreurs
Plus rapidement... plus rapidement client de
Web
L'interface utilisateur est la clef à n'importe
quel produit, particulièrement la vitesse perçue de la page est plus
importante ! Voici une liste de solutions et de learnings qui
pourraient venir dans maniable :
* Si vos données ne vont pas changer pour le disons
3-5 minutes, il vaut mieux de cacher vos pages de côté de client
* Tendez à employer les graphiques
intérieurs etc. d'Iframe(s)for qu'ils donnent une stabilité perçue
à vos pages. Améliorez toujours l'utilisation le mécanisme
content de chargement basé par Javascript. C'est quelque chose
que vous pourriez vouloir pour faire quand vous avez des graphiques de
la parole 3+ dans la même page.
* L'Internet Explorer montre la page entière
seulement quand tout le contenu est reçu du serveur. Ainsi il
est recommandé d'employer des iframes ou le Javascript pour le
chargement content.
* N'employez jamais les entrées de
multiple/duplicate du dossier de CSS dans le HTML page.
L'Internet Explorer tend à charger chaque dossier de CSS comme
entrée séparée et s'applique à la page complète !
La ligne de fond vos questions et schéma rendent le
système plus lent ! Fixez-les d'abord et blâmez ensuite la
base de données !
Voyez Également
* Rendement Élevé Mysql
* Exécution De Question
* Expliquez La Question
* Questions De Linéarisation
* Accord D'InnoDB
* Mysql D'Accord
Catégories : Analyseur De Mur à l'épreuve
du feu | L'exécution incline cette page était le Last modified
18:00, 31 août 2005.
- Ramesh-
Source D'Article: Messaggiamo.Com
Related:
» Seo Elite: New Seo Software!
» AntiSpywareBOT
» Reverse Mobile
» Error Nuker
Webmaster obtenir le code html
Ajouter cet article sur votre site Web dès maintenant!
Webmaster envoyer vos articles
Aucune inscription requise! Remplissez le formulaire et votre article est dans le Messaggiamo.Com répertoire!