V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zhoudaiyu
V2EX  ›  Linux

进程间通信用 Unix Domain Socket 比 loopback 好在哪?

  •  
  •   zhoudaiyu · 2021-03-29 21:13:34 +08:00 via iPhone · 4036 次点击
    这是一个创建于 1360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了性能?还是为了 sock 文件权限便于控制?

    20 条回复    2021-04-10 21:57:10 +08:00
    unixeno
        1
    unixeno  
       2021-03-29 21:32:42 +08:00 via Android
    性能更高,也方便权限控制
    guo4224
        2
    guo4224  
       2021-03-29 21:52:59 +08:00
    你还能跑出性能差别来?
    zhoudaiyu
        3
    zhoudaiyu  
    OP
       2021-03-29 21:54:32 +08:00 via iPhone
    @guo4224 明显我这是疑问句
    zhoudaiyu
        4
    zhoudaiyu  
    OP
       2021-03-29 21:54:49 +08:00 via iPhone
    @unixeno 性能差距真的有这么大么
    lcdtyph
        5
    lcdtyph  
       2021-03-29 21:55:06 +08:00
    内核处理 unix domain socket 的时候没有 routing netfilter 这些没用的步骤,所以会比 loopback 更快一些

    文件相比 listening socket 更方便控制权限,还能省一个端口号
    zhoudaiyu
        6
    zhoudaiyu  
    OP
       2021-03-29 21:56:04 +08:00 via iPhone
    @lcdtyph 省端口确实没想到
    lcdtyph
        7
    lcdtyph  
       2021-03-29 22:00:28 +08:00
    @lcdtyph

    不过性能差距在高负载的时候才能体现出来
    nightwitch
        8
    nightwitch  
       2021-03-29 22:03:40 +08:00
    获得一定的性能提升。
    损失了一定的跨平台性,直到 Win10 17063 版本以后才支持 AF_UNIX.

    天下没有免费的午餐。
    sherlock1122
        9
    sherlock1122  
       2021-03-29 23:46:49 +08:00 via Android   ❤️ 4
    UDS 可以传输 fd,实现内存共享。
    虚拟化中 vhost user 强依赖这个特性。
    Wincer
        11
    Wincer  
       2021-03-30 00:09:05 +08:00   ❤️ 2
    https://github.com/rigtorp/ipc-bench

    Here you have the results on a single CPU 3.3GHz Linux machine :

    TCP average latency: 6 us

    UDS average latency: 2 us

    PIPE average latency: 2 us

    TCP average throughput: 0.253702 million msg/s

    UDS average throughput: 1.733874 million msg/s

    PIPE average throughput: 1.682796 million msg/s
    ch2
        12
    ch2  
       2021-03-30 02:17:20 +08:00 via iPhone
    Loopback 可以跨操作系统,unix_domain_socket 顾名思义
    cubecube
        13
    cubecube  
       2021-03-30 09:56:56 +08:00
    @ch2 win 上也有了。。就是这么神奇。java 也支持了
    julyclyde
        14
    julyclyde  
       2021-03-30 11:39:23 +08:00
    @Wincer 奇怪,凭什么比 pipe 快??
    Wincer
        15
    Wincer  
       2021-03-30 12:20:59 +08:00   ❤️ 2
    @julyclyde 和机器或者操作系统也有关吧,我这是从 StackOverflow 上摘抄的,下面有评论也说他测试 pipe 比 uds 更好的。https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance
    qbqbqbqb
        16
    qbqbqbqb  
       2021-04-09 17:29:01 +08:00
    @julyclyde 因为 UDS 本身就是内核级 IPC 机制,完全不走 TCP/IP 协议栈,内核里缓冲区拷贝一下就完事的东西,本来就应该和 pipe 不相上下的。
    qbqbqbqb
        17
    qbqbqbqb  
       2021-04-09 17:35:15 +08:00
    loopback 接口不走网卡,但是仍要走 TCP/IP 协议栈,还是有一定性能损失的。而且 loopback 接口设计的本意是让开发者可以方便地本地测试网络应用,支持 IPC 只是副产品。UDS 就是专门做本地 IPC 的,更简单纯粹。
    qbqbqbqb
        18
    qbqbqbqb  
       2021-04-09 17:38:13 +08:00
    另外 UDS 除了 STREAM 和 DGRAM 以外,还支持 SEQPACKET, RDM 等等 TCP/IP 通常情况下不支持的 socket 类型。
    (只针对类 UNIX 系统,Windows 10 新增的 UDS 支持在这方面还是有限的)
    julyclyde
        19
    julyclyde  
       2021-04-10 11:31:58 +08:00
    @qbqbqbqb 你这不是答非所问么。我问的是为什么比 pipe 快,你回答说不相上下
    qbqbqbqb
        20
    qbqbqbqb  
       2021-04-10 21:57:10 +08:00
    @julyclyde 我是按照 11 楼的数据说的,他给出的数据 UDS 和 PIPE 之间的差距远比两者和 TCP 之间的差距小,有理由认为是误差。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 18:43 · PVG 02:43 · LAX 10:43 · JFK 13:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.