传统的阻塞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与非阻塞IO详解 #### 一、引言 在计算机科学领域,特别是网络编程中,I/O(输入/输出)模型是处理客户端与服务器间通信的关键技术之一。根据I/O模型的不同,可以将它们分为两大类:阻塞I/O和非阻塞I/O。...
这里我们将深入探讨同步IO、异步IO、阻塞IO和非阻塞IO的概念,理解它们的工作原理以及在实际应用中的差异。 1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序...
在这个名为"非阻塞IO完成版.rar"的压缩包中,我们似乎有一个项目,它实现了“剪刀石头布”游戏的功能,使用了非阻塞I/O技术,并且开发环境是NetBeans IDE。NetBeans是一款流行的开源集成开发环境,支持多种编程语言...
在IT领域,网络编程是不可或缺的一部分,特别是在服务器端开发中...在实际应用中,开发者还需要根据具体业务需求和系统资源,权衡选择合适的IO模型,例如,也可以考虑使用异步I/O或者Reactor模式来实现更高效的服务器。
同步异步阻塞非阻塞 IO 模型 在 Linux 环境下的网络 IO 中,有五种基本的 IO 模型:阻塞 IO、非阻塞 IO、IO 多路...阻塞 IO 适用于简单的服务器模型,而非阻塞 IO、IO 多路复用和异步 IO 适用于高性能的服务器模型。
当调用一个非阻塞IO函数时,无论操作是否成功完成,函数都会立即返回,通常会返回一个特定值来表示操作正在进行中。这种方式使得程序能够更加灵活地处理IO操作,提高了系统资源的利用率。 在非阻塞模型中,可以使用...
综上所述,"非阻塞IO+Proactor+日志系统 自定义协议服务器"项目涉及的关键技术点包括: 1. 非阻塞I/O:提高并发处理能力,减少线程间的上下文切换。 2. Proactor模式:通过事件驱动的异步I/O,简化多并发情况下的...
### 阻塞与非阻塞IO详解 #### 一、阻塞型I/O **1.1 阻塞I/O的概念和意义** 在计算机操作系统中,I/O(输入/输出)操作是非常常见的任务之一。阻塞I/O是其中一种重要的模型。当一个进程试图执行I/O操作而资源(如...
同时,NIO包还提供了多种IO处理机制,例如阻塞式IO、非阻塞式IO等,满足不同的应用需求。 九、Mina2.0框架 Mina2.0是一个基于NIO包的网络应用框架,提供了高效的IO处理机制,满足了大量的网络应用需求。Mina2.0...
ReactPHP的核心特性就是它的事件驱动和非阻塞I/O模型,这使得它在处理大量并发连接时表现出色。 事件驱动编程是一种编程范式,它基于观察和响应事件或信号来控制程序的执行流程。在ReactPHP中,程序会等待特定的...
在非阻塞IO模型中,进程发起read操作后,不会等待数据的到达,而是马上返回结果。如果没有数据到达,系统调用将返回error。进程可以再次发送read操作,一旦内核中的数据准备好了,并且又再次收到了用户进程的系统...
### IO服务器模型介绍 在构建网络应用程序特别是服务器端应用时,选择合适的I/O模型对于确保应用的性能和可扩展性至关重要。本篇文章将详细介绍几种主要的异步服务器模型及其应用场景,帮助开发者根据自身项目的...
非阻塞I/O在处理大量并发连接时非常有用,如网络服务器和高并发应用。然而,由于轮询机制,它可能会导致CPU资源的浪费,因为即使没有事件发生,应用程序也会持续检查。因此,在选择合适的I/O模型时,需要权衡系统...
在"linux下非阻塞IO程序源码.zip"这个压缩包中,我们可以找到相关的源代码示例,以帮助理解非阻塞I/O的实现。 非阻塞I/O在Linux中的实现主要通过以下方式: 1. **fcntl()** 函数:可以将文件描述符设置为非阻塞...
在Linux操作系统中,有五种主要的IO模型,分别是阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO。这些模型决定了应用程序如何与硬件进行交互,以获取和处理输入/输出数据。以下是对这五种模型的详细解释: 1. ...
描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...
在这个“基于Java非阻塞IO技术实现石头剪刀布游戏设计”的项目中,开发者利用了Java NIO(New IO)库来创建一个高效、低延迟的网络通信环境,用于玩家之间的游戏交互。以下将详细介绍Java非阻塞I/O以及如何将其应用...
在服务器端,我们通常会使用非阻塞I/O模式,避免在等待数据时被阻塞。结合Epoll的边缘触发(EPOLLET)或水平触发(EPOLLONESHOT)模式,可以进一步优化性能。边缘触发意味着只有在事件发生后且未被处理时才会再次...
在讨论Node.js技术时,非阻塞IO和事件循环是两个核心概念,它们是Node.js能够高效处理大量并发请求的关键所在。Node.js使用事件驱动、非阻塞IO模型,使得它在运行时既轻量又高效。接下来,我们将深入探讨这两个概念...