传统的阻塞I/O为每个请求分配一个工作线程,这个工作线程负责请求的整个过程的处理,包括从网络读取请求数据、解析参数、计算或调用其他的业务逻辑、编码结果并将其返回给请求者,然后这个线程将返回到线程池中供其他线程复用。Tomcat 5采用的这种方式在应对完美的网络环境、简单的逻辑以及小量的并发用户时是非常高效的。
但如果请求包括了复杂的逻辑、或需要和外部的系统(例如文件系统、数据库或消息服务器)进行交互时,工作线程在其处理的大部分时间都会处于等待同步的调用或网络传输返回的状态中,这个阻塞的线程会被请求持有直到请求处理完毕,但操作系统需要暂停线程来保证CPU能够处理其他的请求,如果客户端和服务器端的网络状况不太好的话,网络的延时会导致线程被阻塞更长时间,在更糟的状况下,当需要keep-alive的话,当前的工作线程会在请求处理完毕后阻塞很长一段时间,在这样的情况下,为了更好的使用CPU,就必须增加更多的工作线程了。
Tomcat采用了一个线程池,每个请求都会被线程池中一个空闲的线程进行处理。"maxThreads"表示Tomcat 能创建的处理请求的最大线程数。如果我们把"maxThreads"设置的太小的话,就不能充分的使用CPU了,更为重要的是,随着并发用户的增长,会有很多请求被服务器抛弃和拒绝。在此次测试中,我们将"maxThreads"设置为了1000(这对于Tomcat来说有些太大了),在这样的设置下,当并发用户增长到较高数量时,Tomcat会创建很多的线程。大量的Java线程会导致JVM和OS忙于执行和维护这些线程,而不是执行业务逻辑处理,同时,太多的线程也会消耗更多的JVM heap内存(每个线程堆栈需要占用一些内存),并且会导致更为频繁的gc。
Glassfish不需要这么多的线程,在非阻塞IO中,一个工作线程并不会绑定到一个特定的请求上,如果请求被某些原因所阻塞,那么这个线程将被其他的请求复用。在这样的方式下,Glassfish可以用几十个工作线程来处理几千的并发用户。通过限制线程资源,非阻塞IO拥有了更好的可扩展性,这也是Tomcat 6采用非阻塞IO的原因了。
这个是我在blogjava上看到的一篇文章的一部分,解答了我以前的一个疑惑,转过来以备回查。
原帖地址:
http://www.blogjava.net/BlueDavy/archive/2008/07/07/213179.html
分享到:
相关推荐
非阻塞IO+Proactor+日志系统 自定义协议服务器.zip
TCP服务器IO模型之非阻塞轮询,使用内核链表,单进程实现
(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):即经典的Reactor...
luaw, 事件驱动,非阻塞应用服务器用于 Lua Luaw - Lua满足 ... 它也是空中交通控制器命令的缩写,与使用事件循环处理多个请求的方式类似:Luaw是一个基于 node.js的事件驱动的非阻塞IO应用服务器。 它使用优秀的nod
像libevent, libev, and libuv , libhv提供具有非阻塞IO和计时器的事件循环,但具有更简单的api和更丰富的协议。 产品特点 跨平台(Linux,Windows,Mac,Solaris) 事件循环(IO,计时器,空闲) ENABLE_IPV6 ...
使用事件驱动的非阻塞I / O。 ReactPHP是用于PHP中的事件驱动编程的低级库。 事件循环的核心是事件循环,它在其之上提供了低级实用程序,例如:流抽象,异步DNS解析器,网络客户端/服务器,HTTP客户端/服务器以及与...
简介像libevent,libev和libuv一样,libhv提供具有非阻塞IO和计时器的事件循环,但具有更简单的api和更丰富的协议。 跨平台(Linux,Windows,Mac,Solaris)事件循环(IO,tim简介)与libevent,libev和libuv一样,...
IO模型决定了数据的传输方式,Java...AIO则是异步非阻塞模型,它由操作系统完成后回调通知服务端程序启动线程去处理,适用于连接较多且连接时间较长的应用。这三种模式各有优劣,应根据实际情况和需求选择合适的模型。
学习和使用Node.js已经有两个月,使用express结合...非阻塞的IO模型 首先,IO操作无疑是耗时的,当服务器端接收到大量请求时,为每一个请求创建进程或线程的同时,也增加了额外的内存开销,也可能浪费更多的时
Undertow是一个基于非阻塞IO的Java Web服务器。它由几个不同的部分组成:
用java写的项目,项目可以直接运行,请放心下载使用。
阻塞IO(blocking IO)和非阻塞IO(non-blocking IO)对比 Java NIO的问题和在Netty中的解决方案 Netty是基于Java NIO的网络应用框架,如果你是Java网络方面的新手,那么本章将是你学习Java网络应用的开始;对于有 经验...
nio-http 用于 Java 7+ 的混合非阻塞/线程 HTTP 服务器库。 HTTP/1.1 服务器将处理数以万计的连接使用自定义响应处理程序轻松部署在项目中集成文件系统服务器(可用作传统 Web 服务器) 流响应的自动分块传输编码...
就是非阻塞IO 采用多路分发方式 举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式...
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回...
#toyHTTPd 一个玩具CGI服务器,只是为了好玩! #Benchmark ab -n 1000000 -c1000 虚拟机中超过24000 RPS #要求仅Linux(epoll) g ++或clang支持C ++ 11 cmake> 2.8 #许可证麻省理工学院
异步服务器 使用非阻塞 I/O 和自制线程池实现的异步服务器,能够使用有限的线程集处理数百个并发网络连接。
它的事件驱动架构使其非常适合处理成百上千个并发连接、长时间运行的应用程序和许多其他形式的具有非阻塞 I/O 操作的协作多任务处理的高效网络服务器和客户端。 ReactPHP 的特别之处在于其生动的生态系统,其中包含...
带有客户端队列的并行Apache Kafka客户端包装程序,具有密钥并发和可扩展的非阻塞IO处理的更简单的使用者/生产者API。 :warning: 这不是Confluent支持的产品。 这是一个实验性的Alpha阶段加速器。 有关更多信息,...