Ich implementiere benutzerdefinierten Server, der eine sehr große Anzahl (100K oder mehr) langlebiger Verbindungen verwalten muss. Der Server übergibt einfach Nachrichten zwischen Sockets und führt keine ernsthafte Datenverarbeitung durch. Nachrichten sind klein, aber viele von ihnen werden jede Sekunde empfangen/gesendet. Reduzierung der Latenz ist eines der Ziele. Ich weiß, dass die Verwendung mehrerer Kerne die Leistung nicht verbessern wird und daher entschied ich mich, den Server in einem einzigen Thread auszuführen, indem ich run_one
oder poll
Methoden von io_service
Objekt aufrufen. Anyway Multi-Thread-Server wäre viel schwieriger zu implementieren.Boost Asio single-threaded Leistung
Was sind die möglichen Engpässe? Syscalls, Bandbreite, Completion Queue/Event Demultiplexing? Ich vermute, dass Dispatching-Handler möglicherweise sperren müssen (das wird intern von Asio-Bibliothek getan). Ist es möglich, auch die Sperrung der Warteschlange (oder eine andere Sperrung) in boost.asio zu deaktivieren?
EDIT: bezogene Frage. Verbessert sich die syscall-Leistung mit mehreren Threads? Mein Gefühl ist, dass, weil syscalls vom Kernel atomisch/synchronisiert sind, das Hinzufügen von mehr Threads die Geschwindigkeit nicht verbessern wird.
Wenn Sie alles in einem Thread ausführen, benötigen Sie keine (handgeschriebenen) Sperren. –
Die Verwendung mehrerer Kerne wird wahrscheinlich die Leistung verbessern - siehe http://cmeerw.org/blog/748.html#748 und http://cmeerw.org/blog/746.html#746 für einige Benchmarks, die ich letztes Jahr gemacht habe. – cmeerw