thomaswang
V2EX  ›  问与答

高并发服务端,如何高效的接受请求,然后响应结果

  •  
  •   thomaswang · Feb 1, 2018 · 2973 views
  •   The specified image does not exist
    This topic created in 3131 days ago, the information mentioned may be changed or developed.

    在处理大并发的请求是,用 epoll 管理多个 socket,一次循环中返回 10 个可读的 socket,每一个都得 read,然后处理数据,然后 send,这样 10 个串行执行下来,黄花菜都凉了,这一块怎么优化呢,有种说法: 把这 10 个可读的套接字扔到一个 io 线程里面读取,计算线程处理逻辑,然后注册的 epoll,关注可写事件,这样返给用户。有没有正规的做法,有没有相关的权威的文档

    11 replies    2018-02-04 14:51:17 +08:00
    sen506
        1
    sen506  
       Feb 1, 2018 via iPhone   ❤️ 1
    你这是错觉,非阻塞 socket 性能是很不错的,并不是你说的那样 10 个 read/write 就不行了。。
    thomaswang
        2
    thomaswang  
    OP
       Feb 1, 2018
    @sen506 首先是 read(有可能一次 read 不能读完客户端发的请求,需要多次), read 完了,知道用户要读 index.html 文件,要处理数据(比如压缩一下), 然后把压缩的 send 给客户端,这样 1 个处理完了,然后同样的情况处理 2, 然后是 3, .... 然后是 10,好 都处理完了,再去用 epoll 里面拿活跃的请求,这样不慢 ? 还是我理解的有问题
    thomaswang
        3
    thomaswang  
    OP
       Feb 1, 2018
    @thomaswang 补充一下,send 的时候,可能阻塞住,内核发送缓存区可能是满的,客户端内核接受缓存区可能一直是满的,这要要阻塞...
    sen506
        4
    sen506  
       Feb 1, 2018 via iPhone   ❤️ 1
    压缩这个会耗 cpu,其他的,读还有写,还真的不慢的,读的话你需要实现一个断包的函数,每次数据 ready 了,用你的断包函数 check 下,ok 了,就做业务处理,否则就继续挂 epoll 上,写也是一样的,系统缓冲区空闲了就写,否则挂着。。。可以参考下 reator 模式。。
    byaiu
        5
    byaiu  
       Feb 1, 2018 via Android   ❤️ 1
    muduo 那本书里记得有探讨这个问题
    thomaswang
        6
    thomaswang  
    OP
       Feb 1, 2018
    @sen506 明白你的意思了,多谢
    thomaswang
        7
    thomaswang  
    OP
       Feb 1, 2018
    @byaiu 多谢,我下单了
    htfy96
        8
    htfy96  
       Feb 2, 2018
    楼主可以看看 proactor/reactor 模式 + 最近的一些基于协程的网络库是怎么搞的
    ghonfir
        9
    ghonfir  
       Feb 2, 2018
    lz 可以参考下 libevent 的处理方式
    所有的 socket 设为 nonblock 的,假设满了,直接返回,等待下次可写继续写。
    单线程+epoll 性能是不错的,假设需要高并发,可以通过一个线程 accept,然后把 fd 扔到多个工作线程中,每个工作线程一个 epoll 来处理 accept 线程丢过来的 fd,这样就可以多个线程分担多个 socket 了。这个也是 memcache 使用 libevent 的方式。
    thomaswang
        10
    thomaswang  
    OP
       Feb 4, 2018
    @htfy96 多谢
    thomaswang
        11
    thomaswang  
    OP
       Feb 4, 2018
    @sryanyuan 多谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2768 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:58 · PVG 09:58 · LAX 18:58 · JFK 21:58
    ♥ Do have faith in what you're doing.