一 029-IO複用.avinginx
C10k問題,涉及兩段IO,網絡IO和磁盤IOweb
內核負責處理進行切換面試
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)是一種爲處理併發服務請求,並將請求提交到一個或者多個服務處理程序
的事件設計模式。
當客戶端請求抵達後,服務處理程序使用多路分配策略,由一個非阻塞的線程來接收全部的請求,而後派發
這些請求至相關的工做線程進行處理。簡單說,就是如何處理多個客戶端的併發請求的解決模式