Ich arbeite daran, Haskell zu lernen, also versuchte ich, eine gleitende Durchschnittsfunktion zu implementieren. Hier ist mein Code: wo der Benutzer ruft mAverage mit einer Länge für jeden Durchschnitt und die Liste der Werte (z. B. mAverage 4 1,2..100). Allerdings, wenn ich den Code auf den Eingang mAverage 4 1,2..100000 laufen. Ich bekomme, dass es 3,6 Sekunden dauert in ghci (mit: set s) und nutzt ein Gigabyte Speicher. Dies scheint sehr ineffizient für mich, da die entsprechende Funktion nimmt einen Bruchteil einer Sekunde in Python. Gibt es eine Möglichkeit, dass ich meinen Code effizienter machen könnte Ein Weg, um das Schiebefenster zu tun ist, in der ersten Summe als Float übergeben. In die ursprüngliche Liste übergehen (um von der aktuellen Summe subtrahiert zu werden) und die ursprüngliche Liste mit k Einträgen abgelegt (zur Verwendung zur Addition der aktuellen Summe). Dann ist die nächste Summe die Summe, die minus dem ersten Element der Subtraktionsliste plus dem ersten Element der Additionsliste übergeben wird. Ndash Chai T. Rex Dec 27 16 at 20:33 Wenn Sie etwas Neues lernen wollen, können Sie einen Blick auf diese schöne Lösung für Moving Average Problem. Es ist von einem meiner Studenten geschrieben, so dass ich nicht behaupten Autorenschaft. Ich mag es, weil seine sehr kurz. Das einzige Problem hier ist die durchschnittliche Funktion. Solche Funktionen sind dafür bekannt, schlecht zu sein. Stattdessen können Sie schöne Falten von Gabriel Gonzalez. Und ja, diese Funktion dauert O (k) Zeit (wobei k ist die Größe des Fensters) für die Berechnung der Durchschnitt des Fensters (Ich finde es besser, weil Sie Fließkomma-Fehler Gesicht, wenn Sie versuchen, nur neue Element hinzufügen Fenster und subtrahieren zuletzt) . Oh, es nutzt auch State Monade :) UPD: nach einiger Code-Überprüfung bemerkte ich, dass es nicht notwendig ist, Falten hier zu verwenden, um den Durchschnitt zu berechnen. Sie wissen, dass Länge wird immer n, so können Sie einfach die durchschnittliche Funktion, wo Klausel. Antwortete Dec 27 16 am 23:26 Heres eine Lösung für Sie. Die Idee ist, zwei Listen zu scannen, eine, wo das Mittelungsfenster beginnt, und ein anderes, wo es endet. Das Erhalten eines Endstücks einer Liste kostet so viel wie das Scannen des Teils waren Überspringen, und waren nicht alles kopieren. (Wenn die Fenstergröße gewöhnlich recht groß war, konnten wir die restlichen Daten zusammen mit dem Zählen der Summeninitialdaten in einem Durchgang berechnen.) Wir erzeugen eine Liste von Teilsummen, wie in meinem Kommentar beschrieben, dann teilen sie durch die Fensterbreite, um Durchschnittswerte zu erhalten . Während slidingAverage die Durchschnittswerte für die vorgespannte Position berechnet (Fensterbreite nach rechts), berechnet centeredSlidingAverage zentrierte Mittelwerte mit halber Fensterbreite nach links und nach rechts. Wenn ich versuche, Länge slidingAverage 10 1..1000000. Es dauert weniger als eine Sekunde auf meinem MBP. Wegen der Faulheit. CenteredSlidingAverage dauert etwa die gleiche Zeit. Antwort # 2 am: Mai 23, 2010, 07:10:25 am »Ihre Antwort 2017 Stack Exchange, IncI haben versucht, einige laufende Mittelung techs für Glättung der Änderung in ADC-Daten in AtMega48 für die Kontrolle von Leuchten (PWM) beim Drehen eines Topfes (ADC). Die Filter (Pseudocodes): Ich bemerkte, dass die Filter sehr schön sind. Aber langsam in Reaktion, die erwartet wird. Ich suche nach einem Techniken wie Exponential gleitenden Durchschnitt. Reagiert werden soll. Gibt es eine andere wie diese Wie es heißt: Wo ist zwischen 0 und 1. Wie Code und Optimierung dieser Code klug (ohne Floats) Oder Wie würde ich die Floats in entsprechende ganze Zahlen für die Herstellung von kleinen, schnellen und reaktionsschnellen Code konvertieren. Und ich hielt 1 Andere dann, dass es nicht wie erwartet funktioniert. Weil Idve alle Variablen zu Float ändern. Bitte konzentrieren Sie sich nicht auf folgende Aussage vorerst, sondern beachten Sie. Halten Floats in meinem Code-Basis ist das Ausfüllen des Programmspeichers von 45 bis 137, im Falle von Sie können mit minimalen Overhead durch Begrenzung auf binäre Brüche implementieren. Ich habe dies mit guten Ergebnissen verwendet. Nehmen Sie das bestehende Ergebnis, Shift it N Orten rechts zu teilen durch 2N Subtrahieren Sie es aus dem bestehenden Ergebnis. Neue Daten hinzufügen Das ist nicht so schnell beim Wechsel mit einer Stufenänderung der Eingangsdaten, wie Sie es wünschen, ist aber in vielen Fällen einfach zu implementieren und effektiv genug als Filter. Sie können ihre Reaktion beschleunigen, indem sie informelle Entscheidungen über sein Verhalten in Fällen, die zu unterschiedlich sind. B. eine Anzahl von sequentiellen Eingängen beibehalten, die mehr als eine Grenze sind, die sich von dem existierenden Ergebnis unterscheidet. Wenn dieser Zählwert einen Schwellenwert überschreitet, dann das N-Teilungsverhältnis um einen Faktor ändern. ZB N ist in der Regel 4- Ergebnisse werden rechts verschoben 4 mal 16 teilen. Wenn Eingang mehr als xxx weg von der Antwort ist, tun Sie nur zwei Verschiebungen nach rechts und multiplizieren Sie neue Probe durch 4, bevor Sie addieren. Antwortete Oct 4 12 um 6: 08Stack Overflow: Die Architektur - Ausgabe 2016 Um eine Vorstellung davon zu bekommen, was all diese Dinge tun, lassen Sie mich beginnen mit einem Update auf den durchschnittlichen Tag bei Stack Overflow. So können Sie zu den vorherigen Zahlen von November 2013 vergleichen heres ein Tag der Statistik von 9. Februar 2016 mit Differenzen seit 12. November 2013: 209.420.973 (61.336.090) HTTP-Anfragen an unsere Load-Balancer 66.294.789 (30.199.477) von denen waren Seite geladen 1,240,266,346,053 (406273363426) Bytes (1,24 TB) von HTTP-Datenverkehr gesendet 569.449.470.023 (282.874.825.991) Bytes (569 GB) insgesamt empfangenen 3,084,303,599,266 (1,958,311,041,954) Bytes (3,08 TB) insgesamt gesendet 504.816.843 (170.244.740) SQL-Abfragen (von HTTP-Anfragen allein) 5831683114 (5418818063) Redis trifft 17.158.874 (nicht im Jahr 2013 verfolgt) Elastic sucht 3.661.134 (57.716) Tag Engine fordert 607.073.066 (48.848.481) ms (168 Stunden) verbrachte mit SQL 10.396.073 (-88950843) ms (2,8 Stunden) abfragt verbrachte auf Redis trifft 147.018.571 (14.634.512) ms (40,8 Stunden) für Tag Engine-Anforderungen 1,609,944,301 (-1,118,232,744) ms (447 Stunden) verbrachte Verarbeitung in ASP. Net 22,71 (-5,29) ms durchschnittlich (19,12 ms in ASP. Net) für 49,180,275 Frage Seite rendert 11,80 (-53,2) Ms durchschnittlich (8,81 ms in ASP. Net) für 6,370,076 home page renders Sie wundern sich vielleicht über die drastische Verringerung der ASP. Net Verarbeitungszeit im Vergleich zu 2013 (das war 757 Stunden) trotz 61 Millionen mehr Anfragen pro Tag. Das ist sowohl auf ein Hardware-Upgrade im Frühjahr 2015 als auch eine Menge Performance-Tuning innerhalb der Anwendungen selbst zurückzuführen. Bitte nicht vergessen: Leistung ist immer noch ein Merkmal. Wenn youre neugierig über mehr Hardware-spezifische als Im ungefähr zu liefernfear nicht. Der nächste Beitrag wird ein Anhang mit detaillierten Hardware-Spezifikationen für alle Server, die die Standorte laufen (Ill Update dieser mit einem Link, wenn seine Live). Also, was ist in den letzten 2 Jahren geändert Neben dem Austausch einiger Server und Netzwerk-Ausrüstung, nicht viel. Heres eine Top-Level-Liste der Hardware, die die Standorte läuft heute (notieren, was ist seit 2013): 4 Microsoft SQL Server (neue Hardware für 2 von ihnen) 11 IIS Web-Servern (neue Hardware) 2 Redis Server (neue Hardware) 3 Tag Engine-Server (neue Hardware für 2 der 3) 3 Elasticsearch Server (gleiche) 4 HAProxy Load Balancers (2 hinzugefügt CloudFlare zu unterstützen) 2 Networks (jeweils ein Nexus 5596 Core-2232TM Fabric Extendern. zu 10Gbps aktualisiert überall) 2 Fortinet 800C Firewalls ( Cisco ASR-1001-x Router (neu) Was brauchen wir, um Stack Overflow auszuführen, das sich seit 2013 nicht mehr verändert hat, sondern aufgrund der Optimierungen Und neue Hardware, die oben erwähnt wurden, waren bis zu benötigen nur 1 Web-Server. Wir haben dies unabsichtlich getestet, erfolgreich, ein paar Mal. Um klar zu sein: Im sagen, es funktioniert. Im nicht sagen, seine eine gute Idee. Sein Spaß aber, jedes Mal. Nun, da wir einige Baseline-Zahlen für eine Idee der Skala haben, können wir sehen, wie wir diese fancy Web-Seiten machen. Da wenige Systeme in völliger Isolation existieren (und unsere keine Ausnahme bilden), machen Architekturentscheidungen oft ein weitaus weniger Sinn ohne ein größeres Bild davon, wie diese Stücke in das Ganze passen. Das ist das Ziel hier, um das große Bild zu decken. Viele nachfolgende Beiträge werden tiefe Tauchgänge in bestimmten Bereichen durchführen. Dies wird ein logistischer Überblick mit Hardware-Highlights nur der nächste Beitrag wird die Hardware-Details haben. Für diejenigen von euch hier zu sehen, wie die Hardware sieht aus wie in diesen Tagen, hier sind ein paar Bilder, die ich von Rack A nahm (es hat eine passende Schwester R) während unserer Februar 2015 Upgrade: und wenn youre in diese Art der Sache, heres Das ganze 256 Bildalbum von dieser Woche (du bist verdammt richtig, dass Zahlen absichtlich). Jetzt können wir graben in Layout. Heres einen logischen Überblick über die wichtigsten Systeme im Spiel: Bodenregeln Hier sind einige Regeln, die global gelten, so dass ich nicht haben, sie mit jedem Setup zu wiederholen: Alles ist überflüssig. Alle Server und Netzwerkgeräte haben mindestens 2x 10Gbps Konnektivität. Alle Server verfügen über 2 Stromeinspeisungen über 2 Stromversorgungen von 2 USV-Einheiten mit 2 Generatoren und 2 Stromversorgungen. Alle Server haben einen redundanten Partner zwischen Rack A und B. Alle Server und Dienste sind über ein anderes Rechenzentrum (Colorado) doppelt redundant, obwohl Im hauptsächlich über New York hier spricht. Alles ist überflüssig. Die Internets Zuerst müssen Sie usthats DNS finden. Das Finden von uns muss schnell sein, also bewirtschaften wir dieses heraus zu CloudFlare (zZ), weil sie DNS Bediener näeher an fast jeder um die Welt haben. Wir aktualisieren unsere DNS-Datensätze über eine API und sie tun das Hosting von DNS. Aber da waren Idioten mit tief verwurzelten Vertrauen Probleme, haben wir immer noch unsere eigenen DNS-Server als auch. Sollte die Apokalypse passieren (wahrscheinlich durch die GPL verursacht, Punyon oder Caching) und die Menschen wollen noch programmieren, um ihren Verstand weg von ihm, gut Flip sie auf. Nachdem Sie unser geheimes Versteck gefunden haben, kommt HTTP-Verkehr von einem unserer vier ISPs (Level 3, Zayo, Cogent und Lightower in New York) und fließt durch einen unserer vier Edge-Router. Wir peer mit unseren ISPs mit BGP (ziemlich Standard), um den Verkehrsfluss zu kontrollieren und bieten mehrere Möglichkeiten für den Verkehr, um uns am effizientesten zu erreichen. Diese ASR-1001 und ASR-1001-X Router sind in 2 Paare, jede Wartung 2 ISPs in aktive fashionso waren hier redundant. Obwohl theyre alle auf dem gleichen physischen 10Gbps Netz ist, ist externer Verkehr in den getrennten getrennten externen VLANs, die die Lastausgleicher auch angeschlossen werden. Nach dem Fließen durch die Router, du bist für einen Load-Balancer geleitet. Ich nehme an, dass dies eine gute Zeit zu erwähnen sein kann, dass wir ein 10Gbps MPLS zwischen unseren 2 Rechenzentren haben, aber es ist nicht direkt an der Bedienung der Seiten beteiligt. Wir verwenden diese für die Datenreplikation und schnelle Wiederherstellung in den Fällen, in denen wir einen Burst benötigen. Aber Nick, das ist nicht redundant Nun, du bist technisch korrekt (die beste Art von richtig), das ist ein einziger Punkt des Versagens auf seinem Gesicht. Aber warten Wir warten 2 weitere Failover OSPF-Routen (die MPLS ist 1, diese sind 2 und 3 durch Kosten) über unsere ISPs. Jeder der oben genannten Sets verbindet sich mit dem entsprechenden Set in Colorado und belastet den Lastverkehr zwischen der Failover-Situation. Wir könnten beide Sets mit beiden Sets verbinden und 4 Pfade haben, aber gut, was auch immer. Weiter. Load Balancers (HAProxy) Die Load-Balancer laufen mit HAProxy 1.5.15 auf CentOS 7. Unser bevorzugter Linux-Ansatz. TLS (SSL) wird auch in HAProxy beendet. Brunnen schauen hart an HAProxy 1.7 bald für HTTP2 Unterstützung. Im Gegensatz zu allen anderen Servern mit einer 10-Gbit / s-LACP-Netzwerkverbindung hat jeder Load Balancer 2 Paare von 10Gbps: einen für das externe Netzwerk und einen für die DMZ. Diese Boxen laufen 64 GB oder mehr Speicher, um SSL-Verhandlungen effizienter zu handhaben. Wenn wir mehr TLS-Sitzungen im Speicher für Wiederverwendung zwischenspeichern können, theres weniger, um auf nachfolgenden Verbindungen zu demselben Client neu zu berechnen. Dies bedeutet, dass wir Sitzungen schneller und billiger wieder aufnehmen können. Da RAM ist ziemlich billig Dollar-weise, seine eine einfache Wahl. Die Load-Balancer selbst sind ein ziemlich einfaches Setup. Wir hören verschiedene Standorte auf verschiedenen IPs (hauptsächlich für Zertifikatsbedenken und DNS-Management) und führen zu verschiedenen Backends, die meist auf dem Host-Header basieren. Die einzige Sache, die wir hier tun, ist die Geschwindigkeitsbegrenzung und einige Header-Captures (gesendet von unserem Web-Tier) in die HAProxy-Syslog-Nachricht, so dass wir Performance-Metriken für jede einzelne Anforderung aufzeichnen können. Nun Deckung, die später zu. Web-Tier (IIS 8.5, ASP. Net MVC 5.2.3 und. Net 4.6.1) Die Load-Balancer-Feed Traffic auf 9 Servern verweisen wir als primäre (01-09) und 2 devmeta (10-11, unsere Staging-Umgebung ) Web-Server. Die primären Server führen Dinge wie Stack Overflow, Karriere und alle Stack Exchange-Sites außer meta. stackoverflow und meta. stackexchange. Die auf den letzten 2 Servern laufen. Die primäre QampA-Anwendung selbst ist Multi-Tenant. Dies bedeutet, dass eine einzelne Anwendung die Anfragen für alle QampA-Sites erfüllt. Anders gesagt: Wir können das gesamte QampA-Netzwerk von einem einzigen Anwendungspool auf einem einzelnen Server ausführen. Andere Anwendungen wie Careers, API v2, Mobile API, etc. sind getrennt. Heres, was die primäre und dev-Ebenen aussehen wie in IIS: Heres, was Stack Overflows Verteilung über die Web-Tier sieht aus wie in Opserver (unsere interne Überwachung Dashboard): und heres, was diese Web-Server aussehen aus einer Nutzung Perspektive: Ill gehen, warum waren So überfordert in der Zukunft Beiträge, aber die Highlight-Elemente sind: Rolling Builds, Headroom und Redundanz. Service-Tier (IIS, ASP. Net MVC 5.2.3 Net 4.6.1 und HTTP. SYS) Hinter diesen Web-Servern ist die sehr ähnliche Service-Tier. Sein läuft auch IIS 8.5 auf Windows 2012R2. Diese Schicht betreibt interne Dienste, um die Produktions-Web-Schicht und andere interne Systeme zu unterstützen. Die beiden großen Spieler sind hier Stack Server, der die Tag Engine betreibt und auf http. sys (nicht hinter IIS) und der Providence API (IIS-basiert) basiert. Fun Fact: Ich muss Affinität auf jedem dieser 2 Prozesse auf Land auf separaten Steckdosen zu setzen, weil Stack Server nur Dampfloks der L2 und L3-Cache, wenn die Auffrischung Frage Listen in einem 2-Minuten-Intervall. Diese Service-Boxen schweres Heben mit dem Tag-Engine und Backend-APIs, wo wir brauchen Redundanz, aber nicht 9-fache Redundanz. Zum Beispiel, das Laden aller Beiträge und ihre Tags, die alle n Minuten von der Datenbank (derzeit 2) ändern, ist nicht so billig. Wir wollen nicht, dass Last 9 mal auf der Web-Ebene 3 mal ist genug und gibt uns genug Sicherheit. Darüber hinaus konfigurieren wir diese Boxen unterschiedlich auf der Hardwareseite, um besser auf die unterschiedlichen Rechenleistungsmerkmale der Tag-Engine und auf elastische Indizierungsaufgaben (die auch hier laufen) optimiert zu werden. Die Tag-Engine ist ein relativ kompliziertes Thema an sich und wird eine dedizierte Post sein. Die Grundlagen sind: wenn Sie askstaggedjava besuchen. Sie schlagen die Tag-Engine, um zu sehen, welche Fragen passen. Es tut alle unsere Tag passende außerhalb der Suche. So die neue Navigation. Etc. sind alle mit diesem Dienst für Daten. Cache amp PubSub (Redis) Wir verwenden Redis für ein paar Dinge hier und seine Rock-solide. Trotz der Arbeit über 160 Milliarden OPS pro Monat, ist jede Instanz unter 2 CPU. Normalerweise viel niedriger: Wir haben ein L1L2-Cache-System mit Redis. L1 ist HTTP-Cache auf den Webservern oder was auch immer Anwendung im Spiel ist. L2 fällt zurück zu Redis und holt den Wert heraus. Unsere Werte werden im Protobuf-Format gespeichert. Über protobuf-dot-net von Marc Gravell. Für einen Client, verwendet StackExchange. Redis in-house und Open-Source geschrieben. Wenn ein Webserver in beiden L1 und L2 einen Cache-Miss bekommt, holt er den Wert aus der Quelle (eine Datenbank-Abfrage, API-Aufruf usw.) und setzt das Ergebnis sowohl im lokalen Cache als auch in Redis. Der nächste Server, der den Wert verlangt, kann L1 verfehlen, aber den Wert in L2Redis finden und eine Datenbankabfrage oder einen API-Aufruf speichern. Wir führen auch viele QampA-Sites, so dass jeder Standort hat seine eigene L1L2-Caching: durch Schlüsselpräfix in L1 und durch Datenbank-ID in L2Redis. Brunnen gehen tiefer auf diesem in einem zukünftigen Pfosten. Neben den 2 wichtigsten Redis-Servern (Masterslave), die alle Site-Instanzen ausführen, haben wir auch eine Maschine Lerninstanz slaved über 2 weitere dedizierte Server (wegen Speicher). Dies wird für die Empfehlung von Fragen auf der Homepage, eine bessere Anpassung an Arbeitsplätze, etc. verwendet. Es ist eine Plattform namens Providence, die von Kevin Montrose hier. Die wichtigsten Redis-Server haben 256 GB RAM (ca. 90 GB im Einsatz) und die Providence-Server haben 384 GB RAM (ca. 125 GB im Einsatz). Redis ist nicht nur für Cache aber es hat auch einen Publish amp Abonnenten-Mechanismus, wo ein Server eine Nachricht veröffentlichen kann und alle anderen Abonnenten erhalten itincluding Downstream-Clients auf Redis-Slaves. Wir verwenden diesen Mechanismus, um L1-Caches auf anderen Servern zu löschen, wenn ein Webserver ein Entfernen für Konsistenz ausführt, aber theres ein anderer großer Gebrauch: websockets. Websockets (NetGain) Wir verwenden Webseiten, um Echtzeit-Updates für Benutzer wie Benachrichtigungen in der oberen Leiste, Stimmenzählungen, neue Nav-Zählungen, neue Antworten und Kommentare sowie einige andere Bits zu schieben. Die Socket-Server selbst verwenden rohe Sockets, die auf der Web-Ebene laufen. Es ist eine sehr dünne Anwendung auf unserer Open-Source-Bibliothek: StackExchange. NetGain. Während der Spitze haben wir etwa 500.000 gleichzeitige Webserververbindungen geöffnet. Das ist eine Menge von Browsern. Fun Tatsache: einige dieser Browser haben seit mehr als 18 Monaten geöffnet. Waren nicht sicher, warum. Jemand sollte überprüfen, ob diese Entwickler noch am Leben sind. Heres, was diese Wochen gleichzeitige Web-Muster sieht aus wie: Warum Websockets Theyre enorm effizienter als Polling auf unserer Skala. Wir können einfach mehr Daten mit weniger Ressourcen auf diese Weise, während mehr Instant für den Benutzer. Theyre nicht ohne Probleme thoughephemeral Hafen und Akte Griff Erschöpfung auf dem Lastverteiler sind Spaß Themen gut abdecken später. Suche (Elasticsearch) Spoiler: Es gibt nicht viel zu begeistern. Die Web-Tier macht hübsche Vanilla-Suchen gegen Elasticsearch 1.4, mit dem sehr schlanken Hochleistungs-StackExchange. Elastic Client. Anders als die meisten Sachen haben wir keine Pläne, Quelle dieses einfach zu öffnen, weil es nur eine sehr dünne Teilmenge der API aussetzt, die wir verwenden. Ich glaube fest daran, es würde mehr Schaden als gut mit Entwickler Verwirrung zu tun. Verwenden Sie elastische für die Suche. Berechnungen zusammenhängende Fragen und Vorschläge, wenn Sie eine Frage stellen. Jeder Elastic-Cluster (der eine in jedem Rechenzentrum) hat 3 Knoten, und jeder Standort hat seinen eigenen Index. Karriere hat ein paar zusätzliche Indizes. Was macht unser Setup ein wenig ungewöhnlich in der elastischen Welt: unsere 3 Server-Cluster sind ein bisschen satter als durchschnittlich mit allen SSD-Speicher, 192 GB RAM und Dual 10 Gbit / s-Netzwerk jeder. Die gleichen Anwendungsdomänen (yeah, wurden mit. NET Core hier geschraubt) in Stack Server, die Host-Tag-Engine auch kontinuierlich Index-Elemente in Elasticsearch. Wir tun einige einfache Tricks hier wie ROWVERSION in SQL Server (die Datenquelle) verglichen mit einem letzten Positionsdokument in Elastic. Da es sich wie eine Sequenz verhält, können wir einfach Elemente greifen und indexieren, die sich seit dem letzten Pass geändert haben. Der Hauptgrund war auf Elasticsearch anstatt so etwas wie SQL-Volltextsuche ist Skalierbarkeit und bessere Zuteilung von Geld. SQL-CPUs sind vergleichsweise sehr teuer, Elastic ist billig und hat weit mehr Features in diesen Tagen. Warum nicht Solr. Wir wollen über das gesamte Netzwerk suchen (viele Indizes auf einmal), und dies wurde nicht zur Entscheidungszeit unterstützt. Der Grund war nicht auf 2.x noch ist eine wesentliche Änderung der Typen bedeutet, dass wir alles neu zu reinifizieren müssen, um zu aktualisieren. Ich habe einfach nicht genug Zeit, um die erforderlichen Änderungen und Migrationsplan noch machen. Datenbanken (SQL Server) Verwendete SQL Server als unsere einzige Quelle der Wahrheit. Alle Daten in Elastic und Redis stammen von SQL Server. Wir führen 2 SQL Server-Cluster mit AlwaysOn-Verfügbarkeitsgruppen aus. Jeder dieser Cluster hat 1 Master (wobei fast die gesamte Ladung) und 1 Replik in New York. Darüber hinaus haben sie 1 Replikat in Colorado (unsere DR-Rechenzentrum). Alle Repliken sind asynchron. Der erste Cluster ist ein Satz von Dell R720xd-Servern mit jeweils 384 GB RAM, 4 TB PCIe SSD-Speicher und 2x 12 Cores. Es beherbergt die Stack Overflow, Sites (schlechte Name, Ill erklären später), PRIZM und Mobile-Datenbanken. Der zweite Cluster ist ein Satz von Dell R730xd-Servern mit jeweils 768 GB RAM, 6 TB PCIe SSD-Speicher und 2x 8 Cores. Dieser Cluster läuft alles andere. Diese Liste umfasst Karriere. Öffnen Sie die ID. Chatten Unser Exception-Log. Und jede andere QampA-Site (z. B. Superuser, Serverfehler usw.). CPU-Auslastung auf der Datenbank-Ebene ist etwas, was wir gerne sehr niedrig halten, aber seine eigentlich ein wenig hoch im Moment aufgrund einiger Plan-Cache-Probleme wurden Adressierung. Ab jetzt, NY-SQL02 und 04 sind Meister, 01 und 03 sind Repliken wir gerade neu gestartet heute bei einigen SSD-Upgrades. Heres, was die letzten 24 Stunden aussieht: Unsere Verwendung von SQL ist ziemlich einfach. Einfach ist schnell. Obwohl einige Abfragen verrückt sein können, ist unsere Interaktion mit SQL selbst ziemlich Vanille. Wir haben einige legacy Linq2Sql. Aber alle neuen Entwicklung ist mit Dapper. Unsere Open Source Micro-ORM mit POCOs. Lassen Sie mich dies anders: Stack Overflow hat nur 1 gespeicherte Prozedur in der Datenbank und ich beabsichtige, diese letzte Spur in Code verschieben. Okay lässt Zahnräder zu etwas, das kann mehr direkt helfen. Ive erwähnt ein paar von diesen oben, aber Ill bieten eine Liste hier von vielen Open-Source. Net-Bibliotheken wir für die Welt zu verwenden. Wir öffnen sourced sie, weil sie keinen Kerngeschäft Wert haben, aber kann der Welt der Entwickler helfen. Ich hoffe, Sie finden diese nützlichen heute: Dapper (. Net Core) - Hochleistungs-Micro-ORM für ADO. Net StackExchange. Redis - Hochleistungs-Redis-Client MiniProfiler - Leichter Profiler laufen wir auf jeder Seite (unterstützt auch Ruby, Und Node) Außergewöhnlich - Fehler-Logger für SQL, JSON, MySQL, etc. Jil - Hochleistungs-JSON (de) serializer Sigil - A. Net CIL Generierungshelfer (für C ist nicht schnell genug) NetGain - Hochleistungs-Webserver Opserver - Monitoring Dashboard Abfrage die meisten Systeme direkt und Fütterung von Orion, Bosun oder WMI auch. Bosun - Backend Monitoring System, geschrieben in Go Next up ist eine detaillierte aktuelle Hardware-Liste von dem, was unseren Code läuft. Danach gehen wir die Liste hinunter. Bleib dran. Bitte aktivieren Sie JavaScript, um die Kommentare von Disqus zu sehen.
No comments:
Post a Comment