日期:2014-05-16  浏览次数:20608 次

freebsd里的kqueue 和linux 2.6下的epoll
1、freebsd里的kqueue和linux?2.6下的epoll
???两个东西极其相似,写好了一个之后,移到别外一个平台下,只要稍作修改就可以了,原理是一样,个人认为,从功能角度来盾kqueue比epoll灵活得多。在写kqueue的时候,内核帮你考虑好了不少东西。但是从效率来看,从我作的压力测试来看epoll比kqueue强。看看我的实验结果吧
客户端:?linux?,P3,256M?,pthread多线程程序,开1万个线程,可是实际运行结果是,在linux2.4上只能打开4000多个线程的时候就报资源不足,郁闷了好久,不知道是什么资源,最大打开文件数是够了,内存也够(通过设置16k的栈空间)。后来把客户端移到linux2.6内核下,很快开出1万个线程来了。
epoll服务器端:P3,256M,在一万个并发线程下,面不改色,有条不紊地处理着数据,并发数能达到8000个连接。
kqueue服务器端:结果比较失望,在只能一条队列的情况下,并发数只能到2000,然后在客户端的读取数据时就会出现"connect?reset?by?peer"的错误。后来改用了两条队列,一条用来接收新连接,一条用来处理原有的连接。在这种情况下,并发数也只能到3000,然后又会陆陆续续出现连接的错误。
2、关于pthread库的内容,加深了一下了解,学会了几个新的调用。
3、关于freebsd和linux上的一些系统调置方面的东西。
最大打开文件数,在linux,直接用ulimit?-a可以看到,并用ulimit进行修改,运行时有效。在freebsd下,用sysctl?-a|grep?kern.maxfilesperproc?来查询,也可能直接修改。
还有一个就是freebsd的默认最大使用内存的限制,默认情况下是512M,可以能过grep?MAXDSIZ?/usr/include?-r来查找它在头文件里面的定义。修改这个值的方法是在/boot/loader.conf加上一句kern.maxdsiz="xxxx"?,然后重启机器生效。
我觉得这几个小技巧可能会经常用到