摘抄一些关于网络开发的帖子
摘抄一些关于网络开发的帖子
------------------温少
回顾一下Unix的5种I/O模型
1、阻塞I/O
2、非阻塞I/O
3、I/O复用(select、poll、linux 2.6种改进的epoll)
4、信号驱动IO(SIGIO)
5、异步I/O(POSIX的aio_系列函数)
同步I/O和异步IO
POSIX把这两个术语定义如下:
同步I/O操作导致请求进程阻塞,直至操作完成
异步I/O操作不导致请求阻塞。
根据上述定义,前四种I/O模型都是同步I/O,第5种才是异步I/O。
select不允许多于一个的线程在同一个描述符集上等待。这使得反应式模型不适用于高性能应用,因为它没有有效地利用硬件的并行性。
异步I/O通常能够提高更好的性能,windows的iocp通过内核线程调度,也能提供很好的并发性能,但不是真正的异步。
Java nio和多路复用
java 1.4 nio提供的select,这是一种多路复用I/O(multiplexed non-blocking I/O)模型,底层是使用select或者poll。I/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并发idle connection的性能(http://blogs.sun.com/alanb/entry/epoll)。
以前看到有人猜测Windows下nio使用了IOCP,那应该是错的,毕竟IOCP不是多路复用I/O模型。从JavaOne 2006的幻灯片来看,aio才会使用IOCP来实现的。
Java aio和JSR 203
2003年,就有了JSR 203(http://jcp.org/en/jsr/detail?id=203),但是一直没有实现。
终于,JSR 203的spec lead说,将会在Java SE 7.0中完成JSR 203,Java SE 6.0已经是RC,很快正式版就会发布,然后就是Java SE 7.0,估计我们不需要等太久了。
http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr
asynchronous I/O对于Java的影响,将不会低于当年JDK 1.4 nio引入multiplexed non-blocking I/O的影响,很多的Java应用都会重写。如同Linux 2.6支持AIO,DB2、Oracle数据库都会发布新版本,说支持使用AIO,性能提高多少多少云云(主要是AIO的文件操作部分)。
对asynchronous I/O的支持,Java程序就能够支撑大并发网络应用了,在IO模型方面,对于C/C++等语言不再存在“C/C++能做,但是Java不能做的事情”。
这个是Java One 2006上的幻灯片。
http://blogs.sun.com/roller/resources/alanb/bof0895.pdf
提到了:
需要新的channel types支持异步I/O模型
使用Native机制,例如Windows IO Completion ports。
----------------bigpanda
去年做过一段时间Streaming Server,钻研过一段时间这些东东,并发效率最高的,还是微软的IoCompletionPorts,好牛啊,可惜后来项目取消了,没有做下去。
http://www.microsoft.com/technet/sysinternals/information/IoCompletionPorts.mspx
--------------simohayha
并发效率的话可以看看这个
http://shootout.alioth.debian.org/gp4/benchmark.php?test=message〈=all
http://shootout.alioth.debian.org/debian/benchmark.php?test=message〈=all
------------------Arath
在Windows下只有Completion Port可以满足大量连接的需求,其实原理很简单,就是减少了线程,从而大量减少了系统开销.
对Unix/Linux开发不了解,不知道Unix/Linux下类似的方法是什么?
-----------------simohayha
Linux下是epoll.
-----------------iunknown
在 unix/linux 下和 Windows Completion Port 最类似的应该是 aio ,epoll 是 select/poll 的加强版。
------------------SteveGY
aio, Solaris的还是比较强的,Linux的实现不怎么样
-----------------fredzhang
aio在linux下的实现采用NPTL应当跟windows的iocp差不多了,都是用用户线程池来模拟的。linux下比较高效的并发模式还是采用 epoll,aio只是个posix标准,在linux下没有真正实现。不过即便如此,epoll的并发能力比windows的iocp也要高。
---------------iunknown
有了 epoll 和 iocp 之后,要做到高并发已经有了很好的基础了。但是真正要做好一个高并发的服务器却不是一件容易的事。
因为 epoll 和 iocp 只是提供了一个高效的事件通知机制,对于实现者来说,就是可以同时处理很多的句柄(比如 Socket,File等)而不用担心操作系统在事件通知上的消耗。
但同时我们可以看到,直接使用 epoll 或者 iocp ,要求是要直接使用底层的句柄,对于一些已经封装过的 api (比如 mysql client api),是没有办法使用 epoll 或者 iocp 来处理的。如果在高并发服务器中,用到了这些 api 的话,那么就需要做一些特殊的处理,否则就会由于这些 api 会阻塞,造成整个服务器阻塞。
fredzhang 写道
不过即便如此,epoll的并发能力比windows的iocp也要高。
在没有任何背景的情况下,这样说有点不合适。如果说服务器是一个什么都不做的,或者只是做一个简单的 echo server 的话,那么 epoll 可能比 iocp 的并发高。但是这样的比较没什么意义。
如果这个服务器要做一些很具体的业务处理,那么高并发的的瓶颈往往已经不在 epoll 或者 iocp 上,而是在怎么处理具体的业务上。包括怎样集成那些会造成 block 的 api ,怎么使用更好的算法,等等。
即使以 memcached 为例,估计用 epoll 或者 iocp 都能支持到同样的并发度。因为在并发数不断升高的时候, memcached 的瓶颈并不在 epoll 或者 iocp 的调度上,而是在于网络的传输速度和 hash table 的查找。即在达到能够区分出 epoll 和 iocp 谁的并发度更高的时刻之前,memcached 就已经因为其他的瓶颈而无法再支持更高的并发。
---------------qiezi
SCTP好像是从linux-kernel-2.6.11才开始加入,具体也不是很清楚,在ubuntu里面安装libsctp就可以了。
IBM developerWorks上面有些介绍:
http://www-128.ibm.com/developerworks/cn/linux/l-sctp/index.html
这个协议提出是满早的,实现出来还是有点晚,目前windows上好像只有商业实现,vista上就不知道有没有,这里有一些实现方面的信息:
http://www.sctp.org/implementations.html
相对于TCP它的好处还是比较多的:
1、多流。TCP是单流的,掉包会阻塞整个流。SCTP是多流的,掉包只阻塞一个流。
2、数据报模式。有点像是UDP,但SCTP是可靠连接,它提供的数据报模式很适合做网络游戏数据包,结合多流,真是个不错的选择。
3、心跳探测。目前长连接网络应用程序都会自己发心跳包探测连接情况,SCTP在协议上实现了。
4、多宿(host)。一个连接可以在多条线路上进行,比如某个服务器有2块网卡,分别连接内网、外网,另一服务器也有这样2个网卡,可以在一个连接上绑定多个IP,它会在其中一条路径失效时,选择另一条路径。
5、防止DDOS攻击。
6、最后一个小的好处。没有TIME_WAIT,对于大量频繁的短连接还是非常有用的。
参考链接:
SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
使用 SCTP 优化网络
http://www.ibm.com/developerworks/cn/linux/l-sctp/
Java aio和JSR 203
http://www.blogjava.net/jobs/archive/2006/11/21/82409.html
其它链接
网络性能探讨
http://www.javaeye.com/topic/80046?page=2
介绍一个基于NIO的异步框架Cindy
http://www.javaeye.com/topic/11185
一个关于Tomcat使用APR的问题
http://www.javaeye.com/topic/19890
一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
Java aio和JSR 203
http://www.blogjava.net/jobs/archive/2006/11/21/82409.html
JAVA并发编程实践
http://www.china-pub.com/computers/common/info.asp?id=34825
尽少使用人肉搜索机
http://www.cnblogs.com/jobs/archive/2007/04/28/730545.html
不要奢望.NET能够跨平台
http://www.cnblogs.com/jobs/archive/2007/04/24/724586.html
SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
使用 SCTP 优化网络
http://www.ibm.com/developerworks/cn/linux/l-sctp/
JAVA中的线程池
http://www.javaeye.com/blog/75395
使用Java NIO编写高性能的服务器
http://www.javaeye.com/topic/40489
质疑 apache和yaws的性能比较(必看)
http://www.javaeye.com/topic/107476?page=1
JAVA基础:如何创建Java中的线程池
http://java.ccidnet.com/art/3539/20060828/881889_1.html
TCP通讯,这种情况怎么使用线程池?
http://topic.csdn.net/t/20030508/12/1754978.html
异步IO、APC、IO完成端口、线程池与高性能服务器
http://blog.csdn.net/lao_mage/archive/2006/10/11/1330422.aspx
使用epoll进行高性能网络编程
http://www.linuxpk.com/721.html
linux2.6+jdk6.0+EPOLL+(Netty2/QuickServer/Cindy/Mina/ACE) vs windows2003+iocp+c#2.0+remoting+threadpool
------------------温少
回顾一下Unix的5种I/O模型
1、阻塞I/O
2、非阻塞I/O
3、I/O复用(select、poll、linux 2.6种改进的epoll)
4、信号驱动IO(SIGIO)
5、异步I/O(POSIX的aio_系列函数)
同步I/O和异步IO
POSIX把这两个术语定义如下:
同步I/O操作导致请求进程阻塞,直至操作完成
异步I/O操作不导致请求阻塞。
根据上述定义,前四种I/O模型都是同步I/O,第5种才是异步I/O。
select不允许多于一个的线程在同一个描述符集上等待。这使得反应式模型不适用于高性能应用,因为它没有有效地利用硬件的并行性。
异步I/O通常能够提高更好的性能,windows的iocp通过内核线程调度,也能提供很好的并发性能,但不是真正的异步。
Java nio和多路复用
java 1.4 nio提供的select,这是一种多路复用I/O(multiplexed non-blocking I/O)模型,底层是使用select或者poll。I/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并发idle connection的性能(http://blogs.sun.com/alanb/entry/epoll)。
以前看到有人猜测Windows下nio使用了IOCP,那应该是错的,毕竟IOCP不是多路复用I/O模型。从JavaOne 2006的幻灯片来看,aio才会使用IOCP来实现的。
Java aio和JSR 203
2003年,就有了JSR 203(http://jcp.org/en/jsr/detail?id=203),但是一直没有实现。
终于,JSR 203的spec lead说,将会在Java SE 7.0中完成JSR 203,Java SE 6.0已经是RC,很快正式版就会发布,然后就是Java SE 7.0,估计我们不需要等太久了。
http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr
asynchronous I/O对于Java的影响,将不会低于当年JDK 1.4 nio引入multiplexed non-blocking I/O的影响,很多的Java应用都会重写。如同Linux 2.6支持AIO,DB2、Oracle数据库都会发布新版本,说支持使用AIO,性能提高多少多少云云(主要是AIO的文件操作部分)。
对asynchronous I/O的支持,Java程序就能够支撑大并发网络应用了,在IO模型方面,对于C/C++等语言不再存在“C/C++能做,但是Java不能做的事情”。
这个是Java One 2006上的幻灯片。
http://blogs.sun.com/roller/resources/alanb/bof0895.pdf
提到了:
需要新的channel types支持异步I/O模型
使用Native机制,例如Windows IO Completion ports。
----------------bigpanda
去年做过一段时间Streaming Server,钻研过一段时间这些东东,并发效率最高的,还是微软的IoCompletionPorts,好牛啊,可惜后来项目取消了,没有做下去。
http://www.microsoft.com/technet/sysinternals/information/IoCompletionPorts.mspx
--------------simohayha
并发效率的话可以看看这个
http://shootout.alioth.debian.org/gp4/benchmark.php?test=message〈=all
http://shootout.alioth.debian.org/debian/benchmark.php?test=message〈=all
------------------Arath
在Windows下只有Completion Port可以满足大量连接的需求,其实原理很简单,就是减少了线程,从而大量减少了系统开销.
对Unix/Linux开发不了解,不知道Unix/Linux下类似的方法是什么?
-----------------simohayha
Linux下是epoll.
-----------------iunknown
在 unix/linux 下和 Windows Completion Port 最类似的应该是 aio ,epoll 是 select/poll 的加强版。
------------------SteveGY
aio, Solaris的还是比较强的,Linux的实现不怎么样
-----------------fredzhang
aio在linux下的实现采用NPTL应当跟windows的iocp差不多了,都是用用户线程池来模拟的。linux下比较高效的并发模式还是采用 epoll,aio只是个posix标准,在linux下没有真正实现。不过即便如此,epoll的并发能力比windows的iocp也要高。
---------------iunknown
有了 epoll 和 iocp 之后,要做到高并发已经有了很好的基础了。但是真正要做好一个高并发的服务器却不是一件容易的事。
因为 epoll 和 iocp 只是提供了一个高效的事件通知机制,对于实现者来说,就是可以同时处理很多的句柄(比如 Socket,File等)而不用担心操作系统在事件通知上的消耗。
但同时我们可以看到,直接使用 epoll 或者 iocp ,要求是要直接使用底层的句柄,对于一些已经封装过的 api (比如 mysql client api),是没有办法使用 epoll 或者 iocp 来处理的。如果在高并发服务器中,用到了这些 api 的话,那么就需要做一些特殊的处理,否则就会由于这些 api 会阻塞,造成整个服务器阻塞。
fredzhang 写道
不过即便如此,epoll的并发能力比windows的iocp也要高。
在没有任何背景的情况下,这样说有点不合适。如果说服务器是一个什么都不做的,或者只是做一个简单的 echo server 的话,那么 epoll 可能比 iocp 的并发高。但是这样的比较没什么意义。
如果这个服务器要做一些很具体的业务处理,那么高并发的的瓶颈往往已经不在 epoll 或者 iocp 上,而是在怎么处理具体的业务上。包括怎样集成那些会造成 block 的 api ,怎么使用更好的算法,等等。
即使以 memcached 为例,估计用 epoll 或者 iocp 都能支持到同样的并发度。因为在并发数不断升高的时候, memcached 的瓶颈并不在 epoll 或者 iocp 的调度上,而是在于网络的传输速度和 hash table 的查找。即在达到能够区分出 epoll 和 iocp 谁的并发度更高的时刻之前,memcached 就已经因为其他的瓶颈而无法再支持更高的并发。
---------------qiezi
SCTP好像是从linux-kernel-2.6.11才开始加入,具体也不是很清楚,在ubuntu里面安装libsctp就可以了。
IBM developerWorks上面有些介绍:
http://www-128.ibm.com/developerworks/cn/linux/l-sctp/index.html
这个协议提出是满早的,实现出来还是有点晚,目前windows上好像只有商业实现,vista上就不知道有没有,这里有一些实现方面的信息:
http://www.sctp.org/implementations.html
相对于TCP它的好处还是比较多的:
1、多流。TCP是单流的,掉包会阻塞整个流。SCTP是多流的,掉包只阻塞一个流。
2、数据报模式。有点像是UDP,但SCTP是可靠连接,它提供的数据报模式很适合做网络游戏数据包,结合多流,真是个不错的选择。
3、心跳探测。目前长连接网络应用程序都会自己发心跳包探测连接情况,SCTP在协议上实现了。
4、多宿(host)。一个连接可以在多条线路上进行,比如某个服务器有2块网卡,分别连接内网、外网,另一服务器也有这样2个网卡,可以在一个连接上绑定多个IP,它会在其中一条路径失效时,选择另一条路径。
5、防止DDOS攻击。
6、最后一个小的好处。没有TIME_WAIT,对于大量频繁的短连接还是非常有用的。
参考链接:
SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
使用 SCTP 优化网络
http://www.ibm.com/developerworks/cn/linux/l-sctp/
Java aio和JSR 203
http://www.blogjava.net/jobs/archive/2006/11/21/82409.html
其它链接
网络性能探讨
http://www.javaeye.com/topic/80046?page=2
介绍一个基于NIO的异步框架Cindy
http://www.javaeye.com/topic/11185
一个关于Tomcat使用APR的问题
http://www.javaeye.com/topic/19890
一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
Java aio和JSR 203
http://www.blogjava.net/jobs/archive/2006/11/21/82409.html
JAVA并发编程实践
http://www.china-pub.com/computers/common/info.asp?id=34825
尽少使用人肉搜索机
http://www.cnblogs.com/jobs/archive/2007/04/28/730545.html
不要奢望.NET能够跨平台
http://www.cnblogs.com/jobs/archive/2007/04/24/724586.html
SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
http://www.javaeye.com/topic/59804
使用 SCTP 优化网络
http://www.ibm.com/developerworks/cn/linux/l-sctp/
JAVA中的线程池
http://www.javaeye.com/blog/75395
使用Java NIO编写高性能的服务器
http://www.javaeye.com/topic/40489
质疑 apache和yaws的性能比较(必看)
http://www.javaeye.com/topic/107476?page=1
JAVA基础:如何创建Java中的线程池
http://java.ccidnet.com/art/3539/20060828/881889_1.html
TCP通讯,这种情况怎么使用线程池?
http://topic.csdn.net/t/20030508/12/1754978.html
异步IO、APC、IO完成端口、线程池与高性能服务器
http://blog.csdn.net/lao_mage/archive/2006/10/11/1330422.aspx
使用epoll进行高性能网络编程
http://www.linuxpk.com/721.html
linux2.6+jdk6.0+EPOLL+(Netty2/QuickServer/Cindy/Mina/ACE) vs windows2003+iocp+c#2.0+remoting+threadpool