English version
German version
Spanish version
French version
Italian version
Portuguese / Brazilian version
Dutch version
Greek version
Russian version
Japanese version
Korean version
Simplified Chinese version
Traditional Chinese version
Hindi version
Czech version
Slovak version
Bulgarian version
 

40/sec à 500/sec

Logiciels RSS Feed





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

Translation by Google Translator





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!

Add to Google RSS Feed See our mobile site See our desktop site Follow us on Twitter!

Soumettez vos articles à Messaggiamo.Com Directory

Catégories


Copyright 2006-2011 Messaggiamo.Com - Plan du site - Privacy - Webmaster soumettre vos articles à Messaggiamo.Com Directory [0.01]
Hosting by webhosting24.com
Dedicated servers sponsored by server24.eu