Nginx 学习笔记(六)引入线程池 性能提升9倍

简介: 原文地址:https://www.cnblogs.com/shitoufengkuang/p/4910333.html一、前言1、Nignx版本:1.7.11 以上2、NGINX采用了异步、事件驱动的方法来处理连接。

原文地址:https://www.cnblogs.com/shitoufengkuang/p/4910333.html

一、前言

1、Nignx版本:1.7.11 以上

2、NGINX采用了异步、事件驱动的方法来处理连接。这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求。

3、NGINX工作在非阻塞的socket模式下,并使用了epoll 和 kqueue这样有效的方法。

4、NGINX可以非常好地处理百万级规模的并发请求。

5、阻塞操作可以毁掉NGINX的性能,我们必须不惜一切代价避免使用阻塞。

6、即使在当前官方的NGINX代码中,依然无法在全部场景中避免使用阻塞,NGINX1.7.11中实现的线程池机制解决了这个问题

二、问题

1、通常情况下,NGINX是一个事件处理器,即一个接收来自内核的所有连接事件的信息,然后向操作系统发出做什么指令的控制器。

2、所谓“阻塞操作”是指任何导致事件处理循环显著停止一段时间的操作

3、操作可以由于各种原因成为阻塞操作

三、线程池

1、对NGINX而言,线程池执行的就是配货服务的功能。它由一个任务队列和一组处理这个队列的线程组成。

2、当工作进程需要执行一个潜在的长操作时,工作进程不再自己执行这个操作,而是将任务放到线程池队列中,任何空闲的线程都可以从队列中获取并执行这个任务。

3、磁盘的读取速度不能比磁盘产生数据的速度快。

4、“从磁盘读取”这个操作通常是阻塞操作最常见的示例,但是实际上,NGINX中实现的线程池可用于处理任何不适合在主循环中执行的任务。

5、线程池中执行的两个基本操作是大多数操作系统中的read()系统调用Linux中的sendfile()

 

目录
相关文章
|
13天前
|
缓存 负载均衡 安全
在Python中,如何使用多线程或多进程来提高程序的性能?
【2月更文挑战第17天】【2月更文挑战第50篇】在Python中,如何使用多线程或多进程来提高程序的性能?
|
13天前
|
NoSQL 数据处理 调度
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
297 0
|
3天前
|
安全 Java 开发者
Java多线程编程:提升性能的艺术
Java多线程编程:提升性能的艺术
11 2
|
4天前
|
安全 Java 编译器
多线程 (下) - 学习笔记2
多线程 (下) - 学习笔记
12 1
|
4天前
|
存储 算法 Java
多线程 (下) - 学习笔记1
多线程 (下) - 学习笔记
14 1
|
4天前
|
设计模式 安全 NoSQL
多线程 (上) - 学习笔记2
多线程 (上) - 学习笔记
12 1
|
4天前
|
Java API 调度
多线程 (上) - 学习笔记1
多线程 (上) - 学习笔记
13 0
|
4天前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
14 3
|
13天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
27 4
|
13天前
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。