epoll

Nginx原理

橙三吉。 提交于 2020-03-02 12:07:03
1. nginx基本介绍   1、nginx高并发原理( 多进程+epoll实现高并发 )       1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。       2. 每个子进程只有一个线程,采用的 IO多路复用模型epoll,实现高并发。   2、epoll能实现高并发原理       1. epoll() 中内核则维护一个链表,epoll_wait 方法可以获取到链表长度,不为0就知道文件描述符准备好了。       2. 在内核实现中 epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。       3. 某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,来把这个 sockfd 加入链表,其他处于“空闲的”状态的则不会。       4. epoll上面链表中获取文件描述,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销        内存映射(mmap) :内存映射文件,是由一个文件到一块内存的映射,将不必再对文件执行I/O操作   3、nginx和apache比较     1)nginx相对于apache的优点         1. 轻量级,同样起web 服务,比apache 占用更少的内存及资源         2. 抗并发,nginx

Python协程的引入与原理分析

故事扮演 提交于 2020-03-02 03:52:40
相关概念 并发: 指一个时间段内,有几个程序在同一个 cpu 上运行,但是任意时刻只有一个程序在cpu上运行。比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100。 并行: 值任意时刻点上,有多个程序同时运行在cpu上,可以理解为多个cpu,每个cpu独立运行自己程序,互不干扰。并行数量和cpu数量是一致的。 我们平时常说的高并发而不是高并行,是因为cpu的数量是有限的,不可以增加。 形象的理解:cpu对应一个人,程序对应喝茶,人要喝茶需要四个步骤(可以对应程序需要开启四个线程):1烧水,2备茶叶,3洗茶杯,4泡茶。 并发方式:烧水的同时做好2备茶叶,3洗茶杯,等水烧好之后执行4泡茶。这样比顺序执行1234要省时间。 并行方式:叫来四个人(开启四个进程),分别执行任务1234,整个程序执行时间取决于耗时最多的步骤。 同步 ( 注意同步和异步只是针对于I/O操作来讲的 )值调用IO操作时,必须等待IO操作完成后才开始新的的调用方式。 异步  指调用IO操作时,不必等待IO操作完成就开始新的的调用方式。 阻塞 指调用 函数 的时候,当前线程被挂起。 非阻塞 指调用 函数 的时候,当前线程不会被挂起,而是立即返回。 IO多路复用   sllect, poll, epoll都是IO多路复用的机制。IO多路复用就是通过这样一种机制:一个进程可以监听多个描述符

Nginx知识汇总(一)

╄→尐↘猪︶ㄣ 提交于 2020-02-29 12:31:53
一、选择Nginx作为中间件的原因: 1、IO多路复用epoll 多个文件描述符的I/O操作都能在一个线程内并发交替地顺序完成,这里的复用,指的是复用同一个线程。 仍然还是一个线程来处理多个IO流请求,但与单线程的方式不同,其由IO流来主动上报,上报了,那么这个线程就去处理,其他线程等待 I/O多路复用就通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 同步IO和异步IO select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 epoll实现 ①epoll采用事件驱动模型,每当FD就绪,采用系统的回调函数将fd放入就绪的列表,这样就知道队列中的哪个线程完成了,效率更高(不需要再进行轮询了) ②最大连接无限制 2、轻量级(功能模块少,代码模块化) 3、CPU亲和(affinity) cpu亲和是一种把cpu核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cahce miss(cpu高速缓存),获得更好的性能 4.nginx的sendfile 请求一个文件要经过操作系统的内核空间-

浅谈Nginx服务器的内部核心架构设计!

这一生的挚爱 提交于 2020-02-28 22:26:06
一、前言 Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以其高性能、稳定性、丰富的功能、简单的配置和低资源消耗而闻名。 也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行Http服务处理,也可以作为反向代理服务器 、负载均衡器和HTTP缓存。 Nginx 解决了服务器的C10K(就是在一秒之内连接客户端的数目为10k即1万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制,是一种异步事件驱动结构。 二、Nginx的特点 跨平台:可以在大多数Unix like 系统编译运行。而且也有Windows的移植版本。 配置异常简单:非常的简单,易上手。 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。 Nginx代理和后端Web服务器间无需长连接; Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。 发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。 网络依赖性低

Nginx专题(一)-----简介

大兔子大兔子 提交于 2020-02-28 19:49:35
Nginx简介 Apache Apache仍然是时长占用量最高的web服务器,据最新数据统计,市场占有率目前是50%左右。主要优势在于一个是比较早出现的一个Http静态资源服务器,同时又是开源的。所以在技术上的支持以及市面上的各种解决方案都比较成熟。Apache支持的模块非常丰富。 Nginx Nginx是俄罗斯人编写的一款高性能的HTTP和反向代理服务器,在高连接并发的情况下,它能够支持高达50000个并发连接数的响应,但是内存、CPU等系统资源消耗却很低,运行很稳定。目前Nginx在国内很多大型企业都有应用,据最新统计,Nginx的市场占有率已经到33%左右了。而Apache的市场占有率虽然仍然是最高的,但是是呈下降趋势。而Nginx的势头很明显。选择Nginx的理由也很简单:第一,它可以支持5W高并发连接;第二,内存消耗少;第三,成本低,如果采用F5、NetScaler等硬件负载均衡设备的话,需要大几十万。而Nginx是开源的,可以免费使用并且能用于商业用途 常用Web服务器介绍 apache、Nginx、tomcat、weblogic、iis、jboss、websphere、 jetty、netty、lighttpd、glassfish 1、Chrome得到html字符串 2、html文本在服务端,通过网络传给chrome 3、服务端,自己临时生成html字符串返回 4

基于Lua和C实现的HTTP服务器

断了今生、忘了曾经 提交于 2020-02-28 16:52:19
前言 首先需要说明的是做这个小项目纯粹出于学习目的,目前还没有多大的实用价值。只是觉得使用Lua和C结合来实现一个HTTP服务器的这种架构非常简洁和易用,值得专门造一个轮子来深入了解和学习这种用法,顺便也实际动手体验一下实现一个HTTP服务器的感觉,当然里面还有很多不完整或者说没有考虑周全的地方:比如接收HTTP请求的时候默认了HTTP请求头的所有数据都在一个数据包中一次性读取完成,这在生产环境中肯定不行(这个问题留着以后解决吧)。 首先介绍一下这个HTTP服务器实现的功能: 可以在Lua脚本中注册URL,浏览器访问这个URL时可以调用执行Lua中注册的钩子函数,实现HTTP服务器的业务逻辑使用Lua脚本语言来处理。 使用epoll系统调用,实现数据的接收和发送都是单进程异步的方式。 Log日志系统,提供一个分级的日志接口,实现将所有日志都存储在一个日志文件中。 实现这么一个HTTP服务器可以学习到的东西: Lua和C两种语言之间的交互过程,以及如何使用C来编写Lua的函数库。 epoll系统调用实现数据的异步接收和发送 Log日志的集中处理 一个HTTP服务器的完整处理流程:接受到请求、解析请求、请求处理、构造请求回复头、发送请求文件给浏览器。 Lua注册钩子函数的实现 在 lua/task_test.lua 文件中给出了Lua中注册钩子函数的示例程序,首先要加载 libtask

从操作系统层面理解Linux下的网络IO模型

偶尔善良 提交于 2020-02-28 06:08:17
I/O( INPUT OUTPUT),包括文件I/O、网络I/O。 计算机世界里的速度鄙视: 内存读数据:纳秒级别。 千兆网卡读数据:微妙级别。1微秒=1000纳秒,网卡比内存慢了千倍。 磁盘读数据:毫秒级别。1毫秒=10万纳秒 ,硬盘比内存慢了10万倍。 CPU一个时钟周期1纳秒上下,内存算是比较接近CPU的,其他都等不起。 CPU 处理数据的速度远大于I/O准备数据的速度 。 任何编程语言都会遇到这种CPU处理速度和I/O速度不匹配的问题! 在网络编程中如何进行网络I/O优化:怎么高效地利用CPU进行网络数据处理??? 一、相关概念 从操作系统层面怎么理解网络I/O呢?计算机的世界有一套自己定义的概念。如果不明白这些概念,就无法真正明白技术的设计思路和本质。所以在我看来,这些概念是了解技术和计算机世界的基础。 1.1 同步与异步,阻塞与非阻塞 理解网络I/O避不开的话题:同步与异步,阻塞与非阻塞。 拿山治烧水举例来说,(山治的行为好比用户程序,烧水好比内核提供的系统调用),这两组概念翻译成大白话可以这么理解。 同步/异步关注的是水烧开之后需不需要我来处理。 阻塞/非阻塞关注的是在水烧开的这段时间是不是干了其他事。 1.1.1 同步阻塞 点火后,傻等,不等到水开坚决不干任何事(阻塞),水开了关火(同步)。 1.1.2 同步非阻塞 点火后,去看电视(非阻塞),时不时看水开了没有

nginx原理及常用配置

与世无争的帅哥 提交于 2020-02-28 04:46:18
一. nginx基本介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。 Nginx历史和特性: Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。   其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。   Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 1、nginx高并发原理( 多进程+epoll实现高并发 ) Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。 每个子进程只有一个线程,采用的 IO多路复用模型epoll,实现高并发。 2、epoll能实现高并发原理 epoll() 中内核则维护一个链表,epoll_wait 方法可以获取到链表长度,不为0就知道文件描述符准备好了。 在内核实现中 epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。 某个

Nginx如此之快

旧巷老猫 提交于 2020-02-28 03:03:35
nignx的并发连接数,一般优化后,峰值能保持在 1~3w 左右。 Nginx 的进程模型 Nginx 服务器,正常运行过程中 1.多进程:一个 Master 进程、多个 Worker 进程 2.Master 进程:管理 Worker 进程 3.对外接口:接收外部的操作(信号) 4.对内转发:根据外部的操作的不同,通过信号管理 Worker 5.监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 6.Worker 进程:所有 Worker 进程都是平等的 7.实际处理:网络请求,由 Worker 进程处理; 8.Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。 思考: 1.请求是连接到 Nginx,Master 进程负责处理和转发? 2.如何选定哪个 Worker 进程处理请求?请求的处理结果,是否还要经过 Master 进程? HTTP 连接建立和请求处理过程 1.Nginx 启动时,Master 进程,加载配置文件 2.Master 进程,初始化监听的 socket 3.Master 进程,fork 出多个 Worker 进程 4.Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket

nginx基于epoll模型事件驱动流程详解

那年仲夏 提交于 2020-02-28 00:57:48
epoll是一种基于事件驱动的模型,其是nginx能够高效处理客户端请求的重要原因之一。从流程上来讲,epoll模型的使用主要分为三步:epoll句柄的创建,监听文件描述符的添加和等待事件的触发,本文将介绍nginx是如何基于这三个步骤实现客户端请求的高效处理的。 1. epoll模型介绍 在介绍nginx的实现原理之前,我们首先需要介绍一下epoll模型的基本使用方式。epoll在使用的时候主要有三个方法: // 创建epoll句柄 int epoll_create(int size); // 往epoll句柄中添加需要进行监听的文件描述符 int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event); // 等待需要监听的文件描述符上对应的事件的发生 int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout); 首先,我们会调用 epoll_create() 方法创建一个epoll实例的句柄,可以将这里的句柄理解为一个eventpoll结构体实例,而这个结构体中有一个红黑树和一个队列,红黑树中主要存储需要监听的文件描述符,而队列则是在所监听的文件描述符中有指定的事件发生时就会将这些事件添加到队列中