SHM vs TCP auf lokalem Rechner



  • Guten Tag die Herren,

    ich bin auf eine Frage gestoßen die ich mir gerade nicht aus dem Stehgreif beantworten kann. Beziehungsweise google auch nicht wirklich zufriedenstellende Ergebnisse liefert :p

    Ist Shared Memory viel schneller als ein TCP socket das auf Localhost läuft?
    Es handelt sich bei meinen konkreten Problem um eine reine Windows frage, ist aber auch interessant für nen Linux system zu wissen.

    Wäre super wenn einer von euch vllt Benchmarks dazu hat...

    Also es gibt auf dem lokalen Rechner zwei Applikationen.
    Diese kommunizieren über Shared Memory miteinander.
    Ist es performancetechnisch sehr viel schlechter wenn man den beiden ein tcp socket für die kommunikation bereit stellt?

    Eine der beiden Applikationen hat eh schon eine Socketschnittstelle..

    Hoffe das meine Frage verständlich ist 🙂

    mfg Ich



  • Soweit ich informiert bin sind Systeme schlau genug, zu merken, wenn du auf localhost verbindest und nutzen dann auch Shared Memory anstatt über das Netzwerk zu gehen, daher würde es mich nicht wundern, wenn beides etwa gleich schnell ist.



  • Hast du dafür irgendwelche Quellen für mich?

    Danke schonmal !



  • Der Unterschied ist, dass das Socket die Daten mindestens einmal unnötig von einem Prozess in den anderen kopieren muss. Ansonsten sollte es keinen Unterschied geben.



  • Das musst du vermutlich selbst Benchmarken wenn du mehr als Vermutungen, evtl. sogar harte Zahlen haben willst.

    Grundsätzlich sind lokale Sockets-Verbindungen schon sehr schnell.

    Shared-Memory ist aber einfach *instant*.
    Bei wenigen grossen Blöcken wird also vermutlich Shared-Memory gewinnen - zumindest wenn man es richtig macht. Weil 1x memcpy einfach schneller ist als 2x memcpy (bzw. 0x memcpy schneller ist als 1x memcpy).

    Und bei vielen kleinen Blöcken ist die Frage womit man das Aufwecken eines wartenden Threads effizienter hinbekommt. Und da würde es mich einfach sehr wundern wenn man nicht auch das effizienter über Shared-Memory hinbekommen würde. IIRC kann man mit Shared-Memory auch ohne Probleme Atomic-Instructions verwenden, d.h. wenn sinnvoll kann man auch Spin-Locks oder für ganz mutige auch Lock-free Datenstrukturen nutzen.

    SQL-Server bietet vermutlich auch nicht umsonst Shared-Memory als eine Connection-Art an.



  • The SIO_LOOPBACK_FAST_PATH control code configures a TCP socket for lower latency and faster operations on the loopback interface.



  • Interessant!
    Damit kann man sicher nochmal 'was rausholen.

    Allerdings glaube ich nach wie vor dass man Shared-Memory nicht wird schlagen können. Ein zusätzlicher "Layer of Indirection" kostet immer, vor allem wenn er sich im Kernelmode befindet, das "nutzende" Programm aber im Usermode läuft.


Log in to reply