转: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 进程。
没有评论:
发表评论