一 029-IO复用.avi
C10k问题,涉及两段IO,网络IO和磁盘IO
内核负责处理进行切换
1. 单进程模型,阻塞
2. 多进程模型,每个线程处理一个请求
-- 进程量大,进程切换次数过多
-- 每个进程的地址空间独立,很多空间是重复的数据,所以内存使用率会低
3. 多线程模型,如果单核cpu,线程的优势发挥不出来
-- 线程依然切换,切换较之进程轻量级
-- 同一个进程的线程可以共享进程的诸多资源,比如打开的文件
-- 对内存的的需求略有下降
4. 多线程N个请求
一个线程响应多个请求(select 1024)
5. 多路IO
两段等待状态:(用户请求服务器网络的等待不算)
-- 用户进程向内核发起请求等待buffer准备好之前是一个等待状态
-- 内核接到请求后向IO设备发起请求,等待IO设备将数据读入buffer,内核处于等待状态
异步是指上面两段分开执行
对于进程而言需要等待数据输入buffer需要的时间和从Buffer复制进程需要的时间
根据等待模式的不同可以分为五种模式
(1)阻塞IO
(2)非阻塞IO
(3)IO复用(select and poll)
(4)信号驱动的IO
(5)异步IO
同步IO:请求进程阻塞,直到IO操作完成
异步IO:不导致请求进程阻塞的
一 一些概念
nginx是一个轻量级的web服务器,反向代理服务器
nginx能代理两种协议是http和mail,但是Nginx设计就是为了反向代理而产生的
一 限流
1. nginx的限流配置
(1)ngx_http_limit_req_module模块的limit_req_zone参数
该参数可以限制请求数,特别是
语法: limit_req_zone $variable zone=name:size rate=rate;
示例:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone:是限流声明.
$binary_remote_addr:它是$remote_addr的二进制格式。表示根据客户端ip来限流比如上面的限流配置限制每
个客户端ip的请求频率为一秒一次,你如果耍流氓一秒两次,就会被限流会返回一个
http503错误给你。
zone=perip:表示区域名称为perip,也有解释说表示用perip这个名称来标识这行限流配置,待会会通过perip这
个名称来引用这行限流配置(也就是说限流配置是可以定义为多个的)
10m:表示存储客户端ip的空间为10MB, 1MB大概存储1万多ip,10MB大概10多万Ip。
配合博客:http://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/
一起看。
二 nginx的常见面试题
1. nginx是如何处理http请求的
nginx使用的是IO多路复用或答反应器模式
(1)IO多路复用
IO复用模型中,进程可以让内核监控多个描述符的就绪状态,一般使用的接口函数为select或者poll,内核
通过select查询到所监控的描述符中有就绪(就绪是下图中的数据准备完成)的,则把就绪的描述符返回给调用
进程,进程再调用recvfrom实际读取数据,其内部过程大致如下图所示:
由上图可以看出,在IO复用模型中,用户进程先调用select或者poll查看是否有数据就绪,如果有数据就绪再调用
recvfrom去读取数据,系统在阶段1和阶段2都将会被阻塞,但是阻塞于不同的系统调用(阶段1阻塞于select或者
poll,阶段2阻塞于recvfrom)。
(2)反应器模式
反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序
的事件设计模式。
当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发
这些请求至相关的工作线程进行处理。简单说,就是如何处理多个客户端的并发请求的解决模式