2010年3月12日星期五

TCP_DEFER_ACCEPT for Linux vs accept filter for FreeBSD (转)

转:http://blog.kangkang.org/index.php/archives/20


Linux 提供的一个特殊 setsockopt , 在 accept 的 socket 上面,只有当实际收到了数据,才唤醒正在 accept 的进程,可以减少一些无聊的上下文切换。代码如下

val = 5;
setsockopt(srv_socket->fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) ;

里面 val 的单位是秒,

注意如果打开这个功能,kernel 在 val 秒之内还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。

FreeBSD 有一个accept filter 的机制,不过看起来更牛一点, 可以注册自己的 handler 来处理连接。系统还提供了默认的 http filter, 接到完整的 http 请求了,再唤醒 accept 进程。

没有评论: