Débordement de pile: l'architecture - édition 2016 Pour avoir une idée de ce que tout cela fait, permettez-moi de commencer avec une mise à jour sur la journée moyenne au débordement de pile. Ainsi, vous pouvez comparer aux numéros précédents à partir de Novembre 2013. heres un jour de statistiques à partir du 9 Février 2016 avec des différences depuis le 12 Novembre 2013: 209,420,973 (61,336,090) demandes HTTP à notre équilibreur de charge 66,294,789 (30,199,477) de ceux étaient charge de la page 1,240,266,346,053 (406,273,363,426) octets (1,24 To) de trafic HTTP envoyé 569,449,470,023 (282 874 825 991) octets (569 Go) total reçu 3 084 303 599 266 (1 958 311 041 954) octets total envoyé 504 816 843 (170 244 740) Redis hits 17,158,874 (non suivi en 2013) Elastic recherches 3,661,134 (57,716) Tag Engine requêtes 607,073,066 (48,848,481) ms (168 heures) passé exécutant des requêtes SQL 10,396,073 (-88,950,843) ms (2,8 heures) passé sur Redis hits 147,018,571 (14,634,512) ms (40,8 heures) dépensées sur les requêtes de moteur de balises 1.609.944.301 (-1.118.232.744) ms (447 heures) passé le traitement en ASP. Net 22.71 (-5.29) ms moyenne (19.12 ms en ASP. Net) pour 49.180.275 page question rend 11,80 (-53,2) Ms moyenne (8,81 ms en ASP. Net) pour 6 370 076 rendus page d'accueil Vous pouvez vous demander sur la réduction drastique ASP. Net de temps de traitement par rapport à 2013 (qui était de 757 heures) malgré 61 millions de demandes de plus par jour. Cela est dû à la fois une mise à niveau du matériel au début de 2015 ainsi que beaucoup de réglage des performances à l'intérieur des applications elles-mêmes. S'il vous plaît ne pas oublier: la performance est toujours une fonctionnalité. Si vous êtes curieux de plus de spécificités matérielles que Im sur le point de fournir fear pas. Le prochain post sera une annexe avec des spécifications matérielles détaillées pour tous les serveurs qui exécutent les sites (mis à jour ce avec un lien lorsqu'il est en direct). Donc ce qui a changé au cours des 2 dernières années Outre le remplacement de certains serveurs et des équipements de réseau, pas beaucoup. Voici une liste de niveau supérieur du matériel qui exécute les sites aujourd'hui (notant ce qui est différent depuis 2013): 4 serveurs Microsoft SQL (nouveau matériel pour 2 d'entre eux) 11 serveurs Web IIS (nouveau matériel) 2 Redis serveurs (nouveau matériel) 3 Tag 2 serveurs de moteur (nouveau matériel pour 2 des 3) 3 serveurs Elasticsearch (identiques) 4 HAProxy Load Balancers (2 ajoutés pour prendre en charge CloudFlare) 2 réseaux (chacun un Nexus 5596 Core 2232TM Fabric Extenders) mis à niveau vers 10Gbps partout) 2 Fortinet 800C Firewalls Cisco ASR-1001-x Routeurs (nouveau) Qu'avons-nous besoin pour exécuter le dépassement de pile Cela n'a pas changé beaucoup depuis 2013. mais en raison des optimisations Et le nouveau matériel mentionné ci-dessus, étaient en bas à avoir besoin seulement d'un serveur Web. Nous avons testé ce test de manière non intentionnelle, avec succès, quelques fois. Pour être clair: Im dire qu'il fonctionne. Je ne dis pas que c'est une bonne idée. Son amusement cependant, chaque fois. Maintenant que nous avons quelques numéros de base pour une idée d'échelle, voyons comment nous faisons ces pages Web de fantaisie. Puisque peu de systèmes existent dans l'isolement complet (et le nôtre ne fait pas exception), les décisions d'architecture font souvent beaucoup moins de sens sans une image plus grande de comment ces morceaux s'insèrent dans le tout. C'est le but ici, pour couvrir la grande image. De nombreux postes ultérieurs feront des plongées profondes dans des domaines spécifiques. Ce sera un aperçu logistique avec des points forts du matériel que le prochain post aura les détails du matériel. Pour ceux d'entre vous ici pour voir ce que le matériel ressemble ces jours-ci, voici quelques images que j'ai prises de rack A (il a un rack correspondant B) de soeur pendant notre mise à jour de février 2015: et si youre dans ce genre de chose, heres L'album de 256 images entières de cette semaine (vous avez bien raison que les nombres intentionnels). Maintenant, permet de creuser dans la mise en page. Heres un aperçu logique des principaux systèmes en jeu: Règles de base Voici quelques règles qui s'appliquent globalement je n'ai pas à les répéter à chaque configuration: Tout est redondant. Tous les serveurs et équipements réseau ont au moins 2x connectivité 10Gbps. Tous les serveurs disposent de 2 alimentations via 2 alimentations à partir de 2 onduleurs avec 2 générateurs et 2 alimentations. Tous les serveurs ont un partenaire redondant entre le rack A et le B. Tous les serveurs et les services sont doublement redondants via un autre centre de données (Colorado), bien que je parle principalement de New York ici. Tout est redondant. Les Internets Vous devez d'abord nous trouver DNS. Nous devons être rapides, donc nous avons besoin de CloudFlare (actuellement) car ils ont des serveurs DNS plus proches de presque tout le monde. Nous mettons à jour nos enregistrements DNS via une API et ils font l'hébergement de DNS. Mais depuis, il y avait des secousses avec des problèmes de confiance profondément enracinés, nous avons encore nos propres serveurs DNS. Si l'apocalypse se produit (probablement causé par la GPL, Punyon ou mise en cache) et les gens veulent encore programmer pour prendre leur esprit hors de lui, bien les retourner. Après avoir trouvé notre cachette secrète, le trafic HTTP provient d'un de nos quatre FAI (niveau 3, Zayo, Cogent et Lightower à New York) et traverse l'un de nos quatre routeurs périphériques. Nous examinons nos fournisseurs de services Internet en utilisant BGP (assez standard) afin de contrôler le flux de trafic et de fournir plusieurs voies pour que le trafic nous parvienne le plus efficacement possible. Ces routeurs ASR-1001 et ASR-1001-X sont en 2 paires, chaque service de 2 FAI en mode actif actif ont été redondants ici. Bien qu'ils soient tous sur le même réseau physique de 10 Gbit / s, le trafic externe se trouve dans des VLAN externes isolés séparés, auxquels les équilibreurs de charge sont également connectés. Après avoir traversé les routeurs, vous êtes dirigé vers un équilibreur de charge. Je suppose que cela peut être un bon moment pour mentionner que nous avons un MPLS 10Gbps entre nos 2 centres de données, mais il n'est pas directement impliqué dans le service des sites. Nous l'utilisons pour la réplication des données et la récupération rapide dans les cas où nous avons besoin d'une éclatement. Mais Nick, ce n'est pas redondant Eh bien, vous êtes techniquement correct (le meilleur type de correct), thats un seul point d'échec sur son visage. Mais attendons Nous maintenons 2 autres routages OSPF de basculement (le MPLS est 1, ce sont 2 et 3 par le coût) via nos FAI. Chacun des ensembles mentionnés précédemment se connecte à l'ensemble correspondant dans le Colorado, et ils chargent le trafic d'équilibre entre dans la situation de basculement. Nous pourrions faire les deux ensembles se relient aux deux ensembles et ont 4 chemins mais, bien, quoi que. Passons à autre chose. Load Balancers (HAProxy) Les équilibreurs de charge exécutent HAProxy 1.5.15 sur CentOS 7. notre saveur préférée de Linux. Le trafic TLS (SSL) est également terminé dans HAProxy. Eh bien, regardez bien HAProxy 1.7 bientôt pour le support HTTP2. Contrairement à tous les autres serveurs dotés d'une liaison réseau LACP double 10 Gbit / s, chaque équilibreur de charge possède 2 paires de 10 Gbit / s: l'une pour le réseau externe et l'autre pour la DMZ. Ces boîtes fonctionnent 64 Go ou plus de mémoire pour gérer plus efficacement la négociation SSL. Lorsque nous pouvons mettre en cache plusieurs sessions TLS en mémoire pour réutilisation, il y a moins de recomputer sur les connexions ultérieures au même client. Cela signifie que nous pouvons reprendre des sessions plus rapides et moins chers. Étant donné que la RAM est assez bon marché dollar-sage, c'est un choix facile. Les équilibreurs de charge eux-mêmes sont une configuration assez simple. Nous écoutons différents sites sur différentes adresses IP (principalement pour des préoccupations de certificat et de gestion DNS) et l'itinéraire vers divers backends basés principalement sur l'en-tête de l'hôte. Les seules remarques que nous faisons ici sont la limitation de débit et certaines captures d'en-tête (envoyées à partir de notre niveau Web) dans le message HAProxy syslog afin que nous puissions enregistrer des mesures de performance pour chaque requête unique. Eh bien couvrir que plus tard aussi. Web Tier (IIS 8.5, ASP. Net MVC 5.2.3 et. Net 4.6.1) Les équilibreurs de charge alimentent le trafic vers 9 serveurs que nous appelons primaire (01-09) et 2 devmeta (10-11, notre environnement intermédiaire ) Serveurs Web. Les serveurs principaux exécutent des choses comme Stack Overflow, Careers et tous les sites Stack Exchange, sauf meta. stackoverflow et meta. stackexchange. Qui s'exécutent sur les 2 derniers serveurs. La principale application QampA elle-même est multi-locataire. Cela signifie qu'une seule application répond aux demandes de tous les sites QampA. Autrement dit, nous pouvons exécuter tout le réseau QampA hors d'un seul pool d'applications sur un seul serveur. D'autres applications comme Careers, API v2, Mobile API, etc. sont distinctes. Voici ce que ressemblent les niveaux primaire et dev dans IIS: Voici ce que la répartition Stacks Overflows sur le niveau Web ressemble à Opserver (notre tableau de bord de contrôle interne): et voici ce que ressemblent ces serveurs Web d'une perspective d'utilisation: Donc surprovisionné dans les futurs postes, mais les points saillants sont: roulant construit, headroom, et redondance. Niveau de service (IIS, ASP. Net MVC 5.2.3. Net 4.6.1 et HTTP. SYS) Derrière ces serveurs Web se trouve le niveau de service très similaire. Il exécute également IIS 8.5 sur Windows 2012R2. Ce niveau exécute des services internes pour prendre en charge le niveau Web de production et les autres systèmes internes. Les deux grands joueurs ici sont Stack Server qui exécute le moteur de balise et est basé sur http. sys (pas derrière IIS) et l'API Providence (basée sur IIS). Fait amusant: je dois définir l'affinité sur chacun de ces 2 processus pour atterrir sur des sockets séparés, car Stack Server vient de lancer le rouleau de la mémoire cache L2 et L3 lors de la mise à jour des listes de questions sur un intervalle de 2 minutes. Ces boîtes de service font du travail lourd avec le moteur de balise et les API du backend où nous avons besoin de redondance, mais pas de redondance 9x. Par exemple, le chargement de tous les messages et leurs balises qui changent toutes les n minutes de la base de données (actuellement 2) n'est pas si bon marché. Nous ne voulons pas faire cette charge 9 fois sur le niveau Web 3 fois est suffisant et nous donne assez de sécurité. Nous configurons également ces boîtiers différemment sur le côté matériel pour être mieux optimisés pour les différentes caractéristiques de charge de calcul du moteur d'étiquette et les travaux d'indexation élastique (qui fonctionnent également ici). Le moteur de balisage est un sujet relativement complexe en soi et sera un post dédié. Les bases sont: lorsque vous visitez questionstaggedjava. Youre frapper le moteur de balise pour voir quelles questions correspondent. Il effectue tous nos tags en dehors de la recherche. Donc la nouvelle navigation. Etc sont tous en utilisant ce service pour les données. Cache amp PubSub (Redis) Nous utilisons Redis pour quelques choses ici et sa roche solide. En dépit de faire environ 160 milliards d'ops par mois, chaque instance est inférieure à 2 CPU. Habituellement beaucoup plus bas: Nous avons un système de cache L1L2 avec Redis. L1 est HTTP Cache sur les serveurs Web ou n'importe quelle application est en jeu. L2 retombe à Redis et récupère la valeur. Nos valeurs sont stockées dans le format Protobuf. Via protobuf-dot-net par Marc Gravell. Pour un client, utilisaient StackExchange. Redis écrit en interne et en open source. Lorsqu'un serveur Web reçoit une erreur de cache dans L1 et L2, il extrait la valeur de source (une requête de base de données, appel API, etc.) et met le résultat dans le cache local et Redis. Le serveur suivant vouloir la valeur peut manquer L1, mais trouverait la valeur dans L2Redis, en enregistrant une requête de base de données ou un appel API. Nous gérons également de nombreux sites QampA, donc chaque site a sa propre cache L1L2: par préfixe clé en L1 et par ID de base de données dans L2Redis. Eh bien aller plus loin sur ce dans un futur post. Outre les 2 principaux serveurs Redis (masterslave) qui exécutent toutes les instances du site, nous disposons également d'une instance d'apprentissage machine asservie sur 2 serveurs dédiés supplémentaires (en raison de la mémoire). Ceci est utilisé pour recommander des questions sur la page d'accueil, mieux correspondre à des emplois, etc C'est une plate-forme appelée Providence, couvert par Kevin Montrose ici. Les serveurs principaux de Redis ont 256GB de RAM (environ 90GB dans l'usage) et les serveurs de Providence ont 384GB de RAM (environ 125GB en service). Redis n'est pas seulement pour le cache, mais il a aussi un mécanisme d'abonnement de publier l'abonné où un serveur peut publier un message et tous les autres abonnés le reçoivent en incluant des clients en aval sur des esclaves de Redis. Nous utilisons ce mécanisme pour effacer les caches L1 sur les autres serveurs quand un serveur web fait un retrait pour la cohérence, mais il ya une autre grande utilisation: websockets. Websockets (NetGain) Nous utilisons les websockets pour envoyer des mises à jour en temps réel aux utilisateurs, telles que les notifications dans la barre supérieure, le nombre de votes, les nouveaux comptes de nav, les nouvelles réponses et les commentaires et quelques autres bits. Les serveurs de socket eux-mêmes utilisent des sockets bruts s'exécutant sur le niveau Web. C'est une application très fine sur notre bibliothèque open source: StackExchange. NetGain. Pendant le pic, nous avons environ 500 000 connexions websocket concurrentes ouvertes. C'est beaucoup de navigateurs. Fait amusant: certains de ces navigateurs sont ouverts depuis plus de 18 mois. N'étaient pas sûr pourquoi. Quelqu'un devrait aller vérifier si ces développeurs sont encore en vie. Heres ce que ce modèle websocket concurrents semaines ressemble à: Pourquoi websockets Theyre considérablement plus efficace que le sondage à notre échelle. Nous pouvons simplement pousser plus de données avec moins de ressources de cette façon, tout en étant plus instantanées à l'utilisateur. Ils ne sont pas sans problèmes de port thoughephemeral et l'épuisement poignée de fichier sur l'équilibreur de charge sont des questions amusantes bien couvrir plus tard. Search (Elasticsearch) Spoiler: theres pas beaucoup à obtenir excité ici. Le niveau Web effectue de jolies recherches de vanille contre Elasticsearch 1.4, en utilisant le très puissant client StackExchange. Elastic très performant. Contrairement à la plupart des choses, nous n'avons pas l'intention d'ouvrir cette source simplement parce qu'elle n'expose qu'un sous-ensemble très mince de l'API que nous utilisons. Je crois fermement que la libération de celui-ci ferait plus de mal que de bien avec la confusion des développeurs. Utilisaient l'élastique pour la recherche. Le calcul des questions connexes et des suggestions pour poser une question. Chaque cluster Elastic (il y en a un dans chaque centre de données) a 3 noeuds, et chaque site a son propre index. Carrières a quelques indices supplémentaires. Ce qui rend notre configuration peu standard dans le monde élastique: nos 3 clusters de serveurs sont un peu plus robustes que la moyenne avec tous les stockage SSD, 192 Go de RAM et le double réseau 10Gbps chacun. Les mêmes domaines d'application (ouais, ont été vissés avec. Net Core ici) dans Stack Server qui hébergent le moteur de balise indexent également continuellement des éléments dans Elasticsearch. Nous faisons quelques trucs simples ici comme ROWVERSION dans SQL Server (la source de données) par rapport à un dernier document de position dans Elastic. Puisqu'il se comporte comme une séquence, nous pouvons simplement saisir et indexer tous les éléments qui ont changé depuis le dernier passage. La raison principale était sur Elasticsearch au lieu de quelque chose comme SQL full-text search est l'évolutivité et une meilleure allocation de l'argent. SQL sont comparativement très coûteux, Elastic est bon marché et a beaucoup plus de fonctionnalités ces jours-ci. Pourquoi pas Solr. Nous voulons effectuer des recherches sur l'ensemble du réseau (de nombreux index à la fois), et ce n'était pas pris en charge au moment de la décision. La raison n'était pas sur 2.x encore est un changement majeur aux types signifie que nous devons réindexer tout à la mise à niveau. Je n'ai tout simplement pas assez de temps pour faire les changements nécessaires et plan de migration pour le moment. Bases de données (SQL Server) Utilisait SQL Server comme notre seule source de vérité. Toutes les données dans Elastic et Redis proviennent de SQL Server. Nous exécutons 2 clusters SQL Server avec les groupes de disponibilité AlwaysOn. Chacun de ces clusters a 1 maître (prenant presque toute la charge) et 1 réplique à New York. En outre, ils ont 1 réplique dans le Colorado (notre centre de données DR). Toutes les répliques sont asynchrones. Le premier cluster est un ensemble de serveurs Dell R720xd, chacun avec 384 Go de RAM, 4 To d'espace PCIe SSD et 2x 12 noyaux. Il héberge les fonctions Débordement de pile, Sites (mauvais nom, Ill expliquer plus tard), PRIZM et Mobile. Le deuxième cluster est un ensemble de serveurs Dell R730xd, chacun avec 768 Go de RAM, 6 To d'espace PCIe SSD et 2x 8 cœurs. Ce cluster fonctionne tout le reste. Cette liste comprend Carrières. Ouvrez ID. Bavarder. Notre journal d'exception. Et tous les autres sites QampA (par exemple, Super User, Server Fault, etc.). L'utilisation du processeur sur le niveau de base de données est quelque chose que nous aimons garder très bas, mais son effectivement un peu élevé en ce moment en raison de certains problèmes de plan de cache étaient adresser. À partir de maintenant, NY-SQL02 et 04 sont des maîtres, 01 et 03 sont des répliques que nous venons de redémarrer aujourd'hui au cours de certaines mises à niveau SSD. Heres ce que les 24 dernières heures ressemble à: Notre utilisation de SQL est assez simple. Simple est rapide. Bien que certaines requêtes peuvent être fou, notre interaction avec SQL lui-même est assez vanille. Nous avons un certain héritage Linq2Sql. Mais tout nouveau développement utilise Dapper. Notre Micro-ORM open source utilisant POCOs. Permettez-moi de dire ceci d'une autre façon: Stack Overflow n'a qu'une procédure stockée dans la base de données et j'ai l'intention de déplacer ce dernier vestige en code. OK permet de changer de vitesse à quelque chose qui peut plus directement vous aider. Ive mentionné quelques-uns de ces ci-dessus, mais mal fournir une liste ici de nombreuses open-source. Net bibliothèques que nous maintenons pour le monde à utiliser. Nous avons ouvert les sourced parce qu'ils n'ont pas de valeur métier, mais peuvent aider le monde des développeurs. Nous espérons que vous les trouverez utiles aujourd'hui: Dapper (.Net Core) - Micro-ORM haute performance pour ADO. Net StackExchange. Redis - Mini client Redis performant MiniProfiler - Le profileur léger fonctionne sur toutes les pages (il prend également en charge Ruby, Go, Et Node) Exceptionnel - Logger d'erreurs pour SQL, JSON, MySQL, etc. Jil - JSON (de) sérialiseur de haute performance Sigil - A. Net CIL generation helper (pour quand C n'est pas assez rapide) NetGain - serveur Websocket haute performance Opserver - Surveillance du tableau de bord en interrogeant directement la plupart des systèmes Orion, Bosun ou WMI. Bosun - Backend système de surveillance, écrit dans Go Next up est une liste détaillée du matériel actuel de ce qui fonctionne notre code. Après cela, nous allons dans la liste. Restez à l'écoute. Veuillez activer JavaScript pour afficher les commentaires proposés par Disqus. Tawani - ils ne manquent pas tous le point. Ce que vous dites doit être défini en utilisant des termes génériques. Vous ne pouvez pas aller avec un seul exemple. Sans définitions générales, si 400 est 30 est-il encore un outlier Et s'il est 14 Et 9 Où arrêtez-vous Vous avez besoin stddev39s, gammes, quartiles, pour ce faire. Ndash Daniel Daranas Feb 2 09 à 17:05 En taillant vous don39t supprimer outliers vous don39t les inclure dans le calcul. QuotRemovequot peut suggérer que les points ne sont plus dans l'ensemble de données. Et vous ne devez pas les enlever (ou les ignorer) parce qu'ils sont outliers le critère est (généralement) juste qu'ils sont dans une fraction extrême des données. Une valeur qui n'est pas incluse dans la moyenne recadrée n'est souvent que légèrement plus (ou moins) que la valeur la plus élevée (la plus basse) incluse. Ndash Nick Cox Dec 3 14 at 16:48 Je ne sais pas si elle a un nom, mais vous pourriez facilement trouver un certain nombre d'algorithmes pour rejeter les valeurs aberrantes: Trouver tous les numéros entre le 10e et le 90e percentiles (faire cela en triant puis en rejetant Le premier N10 et le dernier N10) et prendre la valeur moyenne des valeurs restantes. Trier les valeurs, rejeter les valeurs hautes et basses aussi longtemps que, ce faisant, l'écart-type moyen change plus que X. Trier les valeurs, rejeter les valeurs hautes et basses aussi longtemps que, ce faisant, les valeurs en question sont plus de K écarts-types de la signifier. La façon la plus courante d'avoir une moyenne robuste (le mot habituel signifie résistant aux mauvaises données) est d'utiliser la médiane. C'est juste la valeur moyenne dans la liste triée (de la moitié entre les valeurs du milieu deux), donc pour votre exemple, il serait 90,5 à mi-chemin entre 90 et 91. Si vous voulez obtenir vraiment dans les statistiques robustes (telles que les estimations robustes De l'écart type, etc) Je recommanderais une perte du code au groupe AGORAS, mais cela peut être trop avancé pour vos fins. Répondue Feb 13 09 at 9h22 Si tout ce que vous avez est une variable (comme vous l'indiquez), je pense que certains des répondants ci-dessus sont plus critique de votre approche. Certainement d'autres méthodes qui regardent les choses comme l'effet de levier sont plus statistiquement solide, mais cela implique que vous faites la modélisation d'une sorte. Si vous avez juste des scores par exemple sur un test ou l'âge des personnes âgées (cas plausibles de votre exemple) je pense qu'il est pratique et raisonnable de se méfier de l'outlier vous soulevez. Vous pourriez regarder la moyenne globale et la moyenne trimmed et voir combien il change, mais qui sera une fonction de votre taille d'échantillon et l'écart par rapport à la moyenne pour vos valeurs aberrantes. Avec outliers flagrants comme celui-là, vous voudriez certainement regarder dans le processus de génération de données te pour comprendre pourquoi c'est le cas. S'agit-il d'une saisie de données ou d'une erreur administrative? Si oui, et il est sans doute sans rapport avec la valeur vraie réelle (qui est non observée), il me semble parfaitement bien de couper. Si c'est une valeur réelle, autant que vous pouvez le dire, vous ne pouvez pas être en mesure de supprimer, sauf si vous êtes explicite dans votre analyse à ce sujet. J'ai répondu Dec 3 14 at 13:58 Mon manuel de statistiques se réfère à cela comme un échantillon de moyenne par opposition à une moyenne de la population. L'exemple implique qu'il y avait une restriction appliquée à l'ensemble de données complet, bien qu'aucune modification (suppression) de l'ensemble de données n'ait été effectuée. A répondu Mar 26 16 à 3:13 0. Bienvenue sur le site. 1. Quel livre Veuillez donner une référence. 2. quotSample meanquot ne se réfère généralement pas à une moyenne obtenue après retrait des outliers. Ndash Juho Kokkala Mar 26 16 à 8:06 Il peut être la médiane. Pas toujours, mais parfois. Je n'ai aucune idée de ce que l'on appelle en d'autres occasions. J'espère que cela a aidé. (Au moins un peu.)
No comments:
Post a Comment