Prefork技巧

October 20, 2013

去年10月读了一下c10k的代码,写了点笔记,今天又看了一遍。

c10k是个用Haskell写的网络服务器函数库,如名字所说,可以处理10000并发连接。GHC 6.X还在用select(),所以c10k用prefork来应付select()只能处理1024个文件描述符的局限,后来GHC 7.X换到了epoll(),c10k说prefork可以来让请求在多核上分配更均衡。不过根据Warp的说法,GHC 7.8之后prefork已经没必要了。

Prefork的实现:

  1. 父进程完成socket()、bind()、listen()
  2. 父进程fork几个子进程
  3. 子进程在共享的socket上accpet()

新的连接到达时,系统会把请求分配给一个子进程,那个子进程的accept()会返回。实际分配依赖于操作系统,所以c10k还限制了每个子进程最大并发连接数,达到上限之后就不再accept(),把机会留其它没到上限的子进程。

c10k只做了连接的处理,然后就把Socket交给应用现应用逻辑。