`
javasogo
  • 浏览: 1817092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[原创]剖析nginx等单线程服务器设计原理与性能优势

阅读更多
nginx现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场,大家都知道,nginx是以单线程为基础的,那么他怎么能在并发性上取得优势的呢?会不会因为网络阻塞而导致主线程阻塞呢?下面就相关问题作一些概念性的阐述。

问题的根本在于人们对于计算机处理性能还没有足够的认识,以及普通的服务器架构简化的处理,做过大型的成熟服务器的人可能都知道,解决一个系统瓶颈比优化 1000个算法还重要,这也就是木桶效应,一个桶能盛水的多少决定于最短的那一块板,我们之所以在一般的服务器端应用软件中采用一个连接一个线程甚至阻塞 在一个线程上的做法,并不是这个方法是最优秀的,设计者没有更好的方法,而是因为这种套路是最简单的,在概念上以及操作上都比较容易让人理解,并且容错性 也强,但是对于性能要求极高的服务器比如dns或者负载均衡等等,要求处理速度极快,并且能有较高的并发性,这种简单的线程池加连接池的做法就不能解决问 题了,比如一个index页面请求,他会包含几十个附属资源文件,如果cilent网络比较慢,那么就会较长时间的阻塞这几十个连接,用户稍微一多服务器 就受不了,因为线程的开销是很大的,如果不能得到迅速释放,将会给服务器带来灾难性的后果,对于公网服务,这种之后会尤为明显,很显然,让服务器为客户端 的网速买单是愚蠢的做法。

那么既然多线程都会存在这样的问题单线程怎么会逃脱的调呢?解决问题的关键在于异步IO,windows上有IOCP(完成端口,对于一部IO包装的比较 多,内部实现时用cpu个数的线程进行事件处理,他会通知你你给定的异步读写已经完成了),linux上有epool(一个纯事件通知接口,他会通知你可 以读或者可以写了),如果将所有的请求简化为阻塞操作和非阻塞操作问题就简单了,所有需要阻塞请求的部分全部由epool触发相应事件,非阻塞(处理耗时 很短)部分用主线程一直执行,直到遇到阻塞部分就停止,交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。

这里比较容易迷惑人的地方是很多人认为函数的处理会阻塞主线程,其实还是上面说的木桶效应,他是不是那块最短的木板,这是需要由测试和经验来决定的,事实 是他的处理时间占用很短,做100万次for循环说不定比局域网经过一次网络访问的时间还要短,理解了这点就不难理解了,如果说你的服务器每秒钟能处理1 万个请求,那么在处理功能函数上(比如解析协议,操作、输出等等)顶多也就占用0.1-0.3秒,剩下的时间都是耗时在了网络阻塞上,耗时在了事件发生上 了,既然如此,把操作部分独立分出来用多线程执行又有什么意义呢?对于公网就更不用说了,网络等IO阻塞才是影响服务器的主要因素,是那块短了的板。

对于网络的IO,IOCP 、epool等事件通知机制就解决了这个问题,性能上由于是阻塞的,所以还不如直接accept等快,但是对于网络延时很严重的情况下性能反而显得更好, 因为他们可以处理大量的连接而不使性能下降很厉害,如果值直接阻塞能连接处理1000个的话,epool等就可以同时处理3-5万个,所以实际的应用价值 要大得多。

剩下的部分就是处理事件发生后的事情上面,我前面的文章已经作了说明,在此不再重复,nginx 、lighttpd等都是基于这类模型开发的,有兴趣的可以研究一下他的代码。

分享到:
评论

相关推荐

    Nginx指南 Nginx 服务器

    Nginx的原理代码分析揭示了其单线程服务器设计原理及其性能优势,包括内存管理、数据结构、源代码分析以及与Memcached等缓存系统的配合使用。 最后,Nginx应用技术指南中还包括了对常见问题的FAQ解答,如验证码问题...

    Nginx 应用技术指南

    **15.1 剖析Nginx等单线程服务器设计原理与性能优势** 深入解析Nginx的设计原理,了解其高效处理高并发连接的能力。 **15.2 Nginx等web服务器设计中关于相关注意事项与心得** 分享在设计和使用Nginx过程中的经验和...

    实战Nginx:取代Apache的高性能Web服务器 张宴.扫描版

    1. **Nginx基础**:介绍Nginx的安装、配置、启动与管理,讲解如何编写基本的配置文件,理解Nginx的工作原理,包括事件模型和多进程/线程模型。 2. **反向代理**:详述Nginx如何作为反向代理服务器工作,将客户端...

    Nginx应用技术指南

    Nginx的单线程设计、内存管理、数据结构设计等方面都是其高性能的基石。 在Nginx的日常使用中,经常会遇到各种各样的问题和挑战。通过FAQ部分的总结,用户可以快速定位并解决一些常见的问题,例如反向代理问题、...

    nginx-0.0.1源代码

    - 工作进程则负责实际的网络I/O和请求处理,它们可以通过多线程或单线程模型来实现。 5. **反向代理** - Nginx 作为反向代理服务器,可以转发用户请求到后端服务器,实现负载均衡、缓存等功能。 - 源代码中涉及...

    1.0版本的nginx源码

    2. **工作进程(Worker Processes)**:执行实际的网络IO操作,如接收客户端请求、处理响应等,通常以多线程或单线程非阻塞I/O方式运行。 3. **事件模型**:Nginx 使用多种事件模型,如epoll(Linux),kqueue...

    Nginx源代码分析与导读

    Nginx采用非阻塞、事件驱动的架构,基于单线程的IO复用模型,一个主进程配合少量的工作进程运行。这种设计使得Nginx能够高效处理大量并发连接。 **HTTP处理流程** 1. 客户端发起HTTP请求,Nginx主进程接收并分配给...

    多线程web服务器+部分实验报告

    在IT领域,多线程Web服务器是实现高性能网络服务的关键技术之一。本实验报告将深入探讨多线程在Web服务器中的应用以及相关的网络概念。首先,我们要理解什么是多线程和Web服务器。 **多线程** 是操作系统中并发执行...

    nginx 如何取代 apache 一书

    《Nginx 如何取代 Apache》这本书主要探讨的是在现代Web服务器环境中,如何利用Nginx的优势来替代传统的Apache服务器,以实现更高效、更稳定的服务。以下将详细阐述Nginx与Apache的区别,Nginx的核心特性,以及如何...

    Linux高性能服务器编程.pdf

    在书的描述中提到,本书的内容覆盖了编写高性能Linux服务器应用的各个方面,包括网络协议、服务器编程的核心要素、原理机制以及工具和框架等。由此可见,书中不仅会介绍基础知识,还会着重讲解高性能服务器编程的...

    nginx-1.0.11源码

    **Nginx 1.0.11 源码分析与详解** Nginx 是一款高性能、轻量级的 Web 服务器/反向代理服务器,以其高效的并发处理能力和低内存消耗而广受赞誉。Nginx 1.0.11 是其历史版本之一,虽然已有些许年份,但其核心设计理念...

    nginx内存池源码移植

    在软件开发过程中,高效地管理内存是至关重要的,尤其是在高并发、高性能的Web服务器如Nginx中。Nginx内存池(ngx_pool_t)是一种优化内存分配和释放的机制,它通过预先分配一大块内存,然后在需要时从中切分小块...

    毕业答辩-http服务器的实现.rar

    3. 服务器架构:HTTP服务器可以采用多种架构,如单线程、多线程、异步IO或事件驱动模型。例如,使用Python的`http.server`模块可以快速搭建一个简单的HTTP服务器,而更复杂的服务器如Nginx则采用了事件驱动的异步非...

    计算机网络高级软件编程技术第11章 Web Server程序源代码

    2. **服务器架构**:Web服务器可以采用多种架构,如单线程、多线程、异步I/O(如epoll)等。不同的架构对性能、并发处理能力有不同影响,理解这些架构的优缺点有助于优化服务器设计。 3. **Socket编程**:Web服务器...

    微博是这样炼成的-海亮终级版QQ服务器端3

    在这个项目中,我们可以深入了解到即时通讯软件背后的技术架构和实现原理,特别是针对大规模用户量的服务器设计。下面将详细探讨这个项目中的相关知识点。 1. **JAVA语言基础**:JAVA作为一种跨平台的面向对象编程...

    性能测试岗位常见面试题.docx

    - **Nginx**:高性能反向代理服务器,配置与负载均衡策略是关键。 - **Dubbo**:服务治理框架,涉及服务注册、发现和调用。 - **RabbitMQ/Kafka**:消息队列系统,了解其特性、生产者和消费者的管理。 9. **...

    零声学院 第9代 Linux CC++后台架构开发 成长体系课程 - v1.21

    **开源框架专题**讲解了TCP协议栈实现,如基于DPDK的f-stack,以及Netmap下的单线程协议栈NtyTcp。此外,还有数据库如RocksDB,以及SQLite3的C++ ORM库hiberlite。课程还涉及了国际化和全球化支持的库,如IBM ICU,...

Global site tag (gtag.js) - Google Analytics