40,sec à 500,sec Votre mag libre de droit

ARTICLES EN LIBRE DE DROIT :: Informatique :: 40,sec à 500,sec


40,sec à 500,sec


  • Réussir la mise en ligne d'un nouveau site    par Franck Sublum
  • La création de blogs : un phénomène de société !    par Jean-Marie Noguier
  • Halte aux spams !    par Jean-Marie Noguier
  • Le secret le mieux gardé pour monétiser un site ou un blog !    par Abdelkrim Tahiri
  • Comment reconnaître une tentative de tromperie par email (phishing) ?    par Franck Sublum






  • 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. Prendre garde, la plupart des problèmes que nous avons faits face étaient franches, 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 Web client lent

    * 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 de accord de SQL
    2.5 Schéma de accord de base de données
    2.5 Mysql nous aide à aller de l'avant !
    2.6 Plus rapidement? plus rapidement web client

    * 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é que 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 nos concurrents 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 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 des images produites. Mais 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 aux taux très élevés (puis), 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. 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 paquet. 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 a même cessé de répondre. Surtout, nous avons commencé à obtenir des arrêts d'impasses et de transaction. Ce qui a par la suite réduit la réponse du système.

    Web client lent

    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. 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 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 de « FileStorage » qui stockent les objets d'image dans le dossier local. Et être servi au fur et à mesure que la demande vient le po. D'ailleurs, nous implmentated également un mécanisme de nettoyage aux images éventées de nettoyage (images 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éé ~20 objets (le hashmap, 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é la « nulle » aux références d'objet. Voila ! le collecteur d'ordures était non jamais torturé moi 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, mais 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 propriétés. Nous avons changé l'exécution en match 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 la re-analyse des disques pour former des objets ! D'ailleurs, nous avions l'habitude de faire l'acte de rechercher un match 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 les questions de mémoire en recevant des données c.-à-d. vidant dans le dossier plat, nous n'avons 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 de accord de SQL

    Vos questions sont vos clefs à l'exécution. Une fois que vous commencez à clouer les questions, 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 te donnera la perspicacité au sujet de pourquoi la question est lente, c.-à-d. si elle emploie les index corrects, si elle emploie un balayage etc. de niveau de table.

    * Ne jamais supprimer les rangées quand vous traitez des données énormes dans l'ordre de 50.000 disques dans une table simple. Toujours l'essai pour faire une « baisse ajournent » autant que possible. S'il n'est pas possible, remodeler votre schéma, qu'est votre seulement sortie !

    * Éviter les jointures non désirées, n'ont pas peur De-pour normaliser (c.-à-d. reproduire les valeurs de colonne) évitent des jointures 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. Employer les gens du pays si le mysql et l'application sont dans le même extérieur d'utilisation de machine autrement.

    * Essayer 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. Tendre à 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

    * Employer toujours de plus petites transactions au lieu de les grandes c.-à-d. qui enjambent à 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

    * Employer les jointures sur des colonnes avec des index ou des clefs étrangères

    * S'assurer que les les questions de l'interface utilisateur ont des critères ou limiter.

    * S'assurer en outre que les critères de colonne est classés

    * Ne pas avoir la valeur numérique dans des critères de SQL dans des citations, parce que le mysql fait un type fonte

    * employer les tables provisoires autant que possible, et les laisser tomber?

    * L'insertion de choisi/d'effacement est une double serrure de table? se rende compte?

    * Faire 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 de accord de base de données

    Quand vous traitez la quantité énorme de données, s'assurer 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. Avoir toujours deux niveaux de tables, des tableaux crus un pour les données réelles et d'un ensemble différent pour les tables de rapport (les tables que les interfaces utilisateur questionnent dessus !) S'assurer toujours que les données sur vos tables de rapport ne se développent jamais au delà d'une limite. Vous emballer projettent employer 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. Maintenir 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 les colonnes reproduites pour enlever les jointures coûteuses.

    * 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 les éviter

    * Ne pas avoir 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 d'InnoDB puis vérifier une deuxième fois leur besoin. Puisque les tables d'InnoDB semblent prendre autour 10-15 chronomètre la taille des tables de MyISAM.

    * Employer MyISAM toutes les fois qu'il y a une majorité de, l'un ou l'autre une (choisir 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 !

    Accorder votre serveur de mysql seulement après toi air fin vos questions/schémas et votre code. Seulement alors vous pouvez voir une amélioration perceptible d'exécution. Voici certains des paramètres qui viennent dans maniable :

    * Employer la taille de pool de tampons qui permettra à vos questions de s'exécuter plus rapidement --innodb_buffer_pool_size=64M pour InnoDB et usage --key-bufer-size=32M pour MyISAM

    * Même questions simples commencées 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 voir ici.

    Bout : commencer votre mysql pour commencer par l'option suivante --la notation-erreur ceci permettra l'enregistrement d'erreurs

    Plus rapidement? plus rapidement web client

    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

    * Tendre à employer des trames I pour les graphiques intérieurs etc. qu'elles donnent une stabilité perçue à vos pages. Améliorer 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 contenu est reçu du serveur. Ainsi il est recommandé d'employer des trames I ou le Javascript pour le chargement content.

    * Ne jamais employer entrées multiples/doubles 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 ! Les fixer d'abord et blâment ensuite la base de données !

    Voir également

    * Rendement élevé Mysql

    * Exécution de question

    * Expliquer la question

    * Questions de linéarisation

    * Accord d'InnoDB

    * Mysql de accord

    Catégories : Analyseur de mur à l'épreuve du feu | l'exécution incline cette page était Last modified 18:00, 31 août 2005.



    Le (23/03/2007)



     Je veux recopier l'article

     Envoyer l'article à un ami  -  Imprimer l'article



    Découvrez d'autres articles :

  • Mais que se passe-t-il avec les cartouches d'imprimantes ?    par Franck Sublum
  • Qu'est ce que le marketing de l'affiliation ?    par Michaël Fontaine
  • J'ai oublié de renouveler mon nom de domaine ! que faire ?    par Virtuel Express
  • Comment développer un site internet attractif    par Julie Couderc
  • L'ordinateur est en panne: à qui s'adresser ?    par Jean-Marie Noguier



  • © 2009 Fruitymag
    Comment rendre l'argent en ligneComment établir le dossier simple partageant WinXPAcoustique de DVD : Une introductionHubris - définition : Le passeport de MicrosoftJoint-ventures en participation : Cinq bouts puissants pour des rapports du bâtiment JVL'échange réciproque de lien est-il mort ?Listes de expédition libres : Bon ou mauvais ?6 désastres de conception de site Web et comment les éviter….Navision atteignent l'accès aux bases de données par l'intermédiaire de C/ODBC dans l'application d'Comment obtenir le trafic visé de Search Engine rapidementpaizay le chaptvergne xrgaliaxsauveterrele hameauLeignes-sur-Fontaine (86300)Châtelneuf (39300)Fultot (76560)La Neuville-Bosmont (2250)Tracy-sur-Mer (14117)Robert-Espagne (55000)Binges (21270)Gingsheim (67270)Brebotte (90140)Bayons (4250)