Posté par benoar .
En réponse au message Socket.
Évalué à 2.
il n’y a pas de chemin privilégié qui autoriserait à « court-circuiter » la pile réseau.
Ça dépend ce que tu appelles « court-circuiter » : tout ce qui est à destination d'une adresse bindée localement passe par l'interface loopback (pas seuleument 127/8 et ::1). Les perfs ne sont pas si mauvaises :
dd if=/dev/urandom bs=4k count=50k | time socat stdin unix-listen:@foo
socat unix-connect:@foo stdio > /dev/null résultat :
51200+0 enregistrements lus
51200+0 enregistrements écrits
209715200 octets (210 MB, 200 MiB) copiés, 5,37172 s, 39,0 MB/s
socat stdin unix-listen:foo 0,14s user 0,71s system 14% cpu 5,874 total versus :
dd if=/dev/urandom bs=4k count=50k | time socat stdin tcp-listen:4242
socat tcp-connect:localhost:4242 stdio > /dev/null résultat :
51200+0 enregistrements lus
51200+0 enregistrements écrits
209715200 octets (210 MB, 200 MiB) copiés, 12,1192 s, 17,3 MB/s
socat stdin tcp-listen:4242 0,09s user 0,66s system 5% cpu 12,622 total J'ai certes une vitesse divisée par deux dans le cas TCP, mais avec une utilisation CPU instantanée moindre, et au final un temps user+system similaire pour les deux cas.
À noter que l'API, en dehors de la création de socket et du bind/connect, est strictement identique : il y a juste un changement de famille et de nom à effectuer. Et l'avantage d'utiliser AF_INET(6), c'est que le nom peut aussi bien être local (avec l'optimisation que j'évoque) ou bien distant, sans rien changer au code, juste au nom auquel se connecter, ou sur lequel se binder.
[^] # Re: Sockets UNIX?
Posté par benoar . En réponse au message Socket. Évalué à 2.
Ça dépend ce que tu appelles « court-circuiter » : tout ce qui est à destination d'une adresse bindée localement passe par l'interface loopback (pas seuleument 127/8 et ::1). Les perfs ne sont pas si mauvaises :
résultat :dd if=/dev/urandom bs=4k count=50k | time socat stdin unix-listen:@foo
socat unix-connect:@foo stdio > /dev/null
versus :51200+0 enregistrements lus
51200+0 enregistrements écrits
209715200 octets (210 MB, 200 MiB) copiés, 5,37172 s, 39,0 MB/s
socat stdin unix-listen:foo 0,14s user 0,71s system 14% cpu 5,874 total
résultat :dd if=/dev/urandom bs=4k count=50k | time socat stdin tcp-listen:4242
socat tcp-connect:localhost:4242 stdio > /dev/null
J'ai certes une vitesse divisée par deux dans le cas TCP, mais avec une utilisation CPU instantanée moindre, et au final un temps user+system similaire pour les deux cas.51200+0 enregistrements lus
51200+0 enregistrements écrits
209715200 octets (210 MB, 200 MiB) copiés, 12,1192 s, 17,3 MB/s
socat stdin tcp-listen:4242 0,09s user 0,66s system 5% cpu 12,622 total
À noter que l'API, en dehors de la création de socket et du bind/connect, est strictement identique : il y a juste un changement de famille et de nom à effectuer. Et l'avantage d'utiliser AF_INET(6), c'est que le nom peut aussi bien être local (avec l'optimisation que j'évoque) ou bien distant, sans rien changer au code, juste au nom auquel se connecter, ou sur lequel se binder.