Ich habe einen Mini-HTTP-Server in C++ mit boost :: asio entwickelt, und jetzt lade ich ihn mit mehreren Clients, und ich konnte die Sättigung nicht annähernd erreichen die CPU. Ich teste gerade auf einer Amazon EC2-Instanz und bekomme ungefähr 50% einer CPU, 20% einer anderen, und die restlichen zwei sind im Leerlauf (laut htop).C++ Socket Server - CPU kann nicht gesättigt werden
Details:
- Der Server Brände ein Thread pro Kern
- Anforderungen empfangen werden, analysiert, verarbeitet und Antworten
- die Anfragen schrieben werden, sind für die Daten, die aus dem gelesen wird, Speicher (schreibgeschützt für diesen Test)
- Ich 'lade' den Server mit zwei Maschinen, die jeweils eine Java-Anwendung ausführen, 25 Threads laufen lassen, Anfragen senden
- Ich sehe etwa 230 Anfragen/Sek thro ughput (dies ist Anwendung Anfragen, die aus vielen HTTP-Anfragen bestehen)
Also, was soll ich betrachte dieses Ergebnis zu verbessern? Da die CPU größtenteils leer ist, möchte ich diese zusätzliche Kapazität nutzen, um einen höheren Durchsatz zu erzielen, sagen wir 800 Anfragen pro Sekunde oder was auch immer.
Ideen die ich je hatte:
- Die Anforderungen sind sehr klein und oft in wenigen ms erfüllt, konnte ich den Client ändern/compose größere Anforderungen zu senden (vielleicht mit batching)
- I könnte den HTTP-Server modifizieren, um das Select-Designmuster zu verwenden, ist das hier angebracht?
- Ich konnte einige Profilierung tun, um zu versuchen, zu verstehen, was der Engpass ist/sind
Angenommen, Sie haben einen 1Gbps-Port auf dem Server? Was sind Ihre Anfrage- und Antwortgrößen (auf dem Draht)? – nik
Wie hoch ist die Bandbreitennutzung am Server-Netzwerkanschluss (der von mir angenommene Wert 1Gbit/s)? – nik
Der Test läuft auf EC2, was meiner Meinung nach Gigabit verwendet. Bmon berichtet über 3MiB (Megabits, glaube ich) TX-Rate und 2,5Mib RX-Rate. Viele Anfrage/Antwort-Größen sind klein (so wenig wie 100 Bytes), aber einige Antworten sind bis 1mb, Anfragen wahrscheinlich bis zu .25mb –