1. 程式人生 > >nginx比apache快的原因

nginx比apache快的原因

先總的說幾個概念:
1:在高併發的情況下nginx比apache快,低併發體現不明顯
2:快的原因得益於nginx的epoll模型
apache是多執行緒或者多程序,在工作的時候,當來了一個http響應,一個程序接收(listen)–>識別處理—>返回請求,在此過程中,一個程序全部處理,apche 對於套接字的I/O,讀或者寫,但是讀或者寫都是阻塞的,阻塞意味著程序就得掛起進入sleep狀態,那麼一旦連線數很多,Apache必然要生成更多的程序來響應請求,一旦程序多了,CPU對於程序的切換就頻繁了,很耗資源和時間,所以就導致apache效能下降了,說白了就是處理不過來這麼多程序了。

Nginx採用epoll模型,非同步非阻塞。對於Nginx來說,把一個完整的連線請求處理都劃分成了事件,一個一個的事件。比如accept(), receive(),磁碟I/O,send()等,每部分都有相應的模組去處理,一個完整的請求可能是由幾百個模組去處理。真正核心的就是事件收集和分發模組,這就是管理所有模組的核心。只有核心模組的排程才能讓對應的模組佔用CPU資源,從而處理請求。拿一個HTTP請求來說,首先在事件收集分發模組註冊感興趣的監聽事件,註冊好之後不阻塞直接返回,接下來就不需要再管了,等待有連線來了核心會通知你(epoll的輪詢會告訴程序),cpu就可以處理其他事情去了。一旦有請求來,那麼對整個請求分配相應的上下文(其實已經預先分配好),這時候再註冊新的感興趣的事件(read函式),同樣客戶端資料來了核心會自動通知程序可以去讀資料了,讀了資料之後就是解析,解析完後去磁碟找資源(I/O),一旦I/O完成會通知程序,程序開始給客戶端發回資料send(),這時候也不是阻塞的,呼叫後就等核心發回通知傳送的結果就行。整個下來把一個請求分成了很多個階段,每個階段都到很多模組去註冊,然後處理,都是非同步非阻塞。非同步這裡指的就是做一個事情,不需要等返回結果,做好了會自動通知你。

在網上找到了一個例子:
可以舉一個簡單的例子來說明Apache的工作流程,我們平時去餐廳吃飯。餐廳的工作模式是一個服務員全程服務客戶,流程是這樣,服務員在門口等候客人(listen),客人到了就接待安排的餐桌上(accept),等著客戶點菜(request uri),去廚房叫師傅下單做菜(磁碟I/O),等待廚房做好(read),然後給客人上菜(send),整個下來服務員(程序)很多地方是阻塞的。這樣客人一多(HTTP請求一多),餐廳只能通過叫更多的服務員來服務(fork程序),但是由於餐廳資源是有限的(CPU),一旦服務員太多管理成本很高(CPU上下文切換),這樣就進入一個瓶頸。
再來看看Nginx得怎麼處理?餐廳門口掛個門鈴(註冊epoll模型的listen),一旦有客人(HTTP請求)到達,派一個服務員去接待(accept),之後服務員就去忙其他事情了(比如再去接待客人),等這位客人點好餐就叫服務員(資料到了read()),服務員過來拿走選單到廚房(磁碟I/O),服務員又做其他事情去了,等廚房做好了菜也喊服務員(磁碟I/O結束),服務員再給客人上菜(send()),廚房做好一個菜就給客人上一個,中間服務員可以去幹其他事情。整個過程被切分成很多個階段,每個階段都有相應的服務模組。我們想想,這樣一旦客人多了,餐廳也能招待更多的人。

相關推薦

nginxapache原因

先總的說幾個概念: 1:在高併發的情況下nginx比apache快,低併發體現不明顯 2:快的原因得益於nginx的epoll模型 apache是多執行緒或者多程序,在工作的時候,當來了一個http響應,一個程序接收(listen)–>識別處理—&g

nginxapache處理靜態檔案速度,但是nginx處理大量併發的php請求時,容易出現502錯誤,頻率大概是多少

首先要明確一點的是502是怎麼出現的,為什麼會出現502呢?一般而言,出現502的錯誤是因為php-cgi連線數不夠導致的。舉個例子:php-cgi開10個程序,前端發20個請求,每個請求的指令碼都sleep100s,那麼必然有至多10個請求會出現502錯誤。因此,出現502是因為php程序不夠用了,和ngi

BufferedInputStream InputStream原因(java)

InputStream:每次從硬碟讀入一個字到中轉站, 再寫入目的檔案(硬碟) BufferStream:一次讀入n個位元組到輸入換成區,接著經中轉站一個個寫入到輸出緩衝區,輸入緩衝區為空時再次從硬碟讀入批量資料,同理輸出緩衝區滿了以後再批量寫入到目的檔案(硬碟)。 如此

curl的速度為什麼file_get_contents以及具體原因

一、背景       大家做專案的時候,不免會看到前輩的程式碼。博主最近看到前輩有的時候請求外部介面用的是file_get_contents,有的用的是curl。稍微瞭解這兩部分的同學都知道,curl在效能上和速度上是優於f

百度面試總結:sparkMapReduce原因是什麼?(比較完整)

1、spark是基於記憶體進行資料處理的,MapReduce是基於磁碟進行資料處理的 MapReduce的設設計:中間結果儲存在檔案中,提高了可靠性,減少了記憶體佔用。但是犧牲了效能。 Spark的設計:資料在記憶體中進行交換,要快一些,但是記憶體這個東西,可靠性不如磁碟。所以效能方面比MapR

sparkMapReduce原因是什麼?(比較完整)

1、spark是基於記憶體進行資料處理的,MapReduce是基於磁碟進行資料處理的 MapReduce的設設計:中間結果儲存在檔案中,提高了可靠性,減少了記憶體佔用。但是犧牲了效能。 Spark的設計:資料在記憶體中進行交換,要快一些,但是記憶體這個東西,可靠性不如磁碟。所以效能方面比Ma

總結SparkHadoop原因

1. 消除了冗餘的HDFS讀寫 Hadoop的每次shuffle都必須寫到磁碟中,而Spark的shuffle不一定寫到磁碟中,而是可以快取到記憶體中,以便後續的其他迭代操作時直接使用。這樣一來,如果任務複雜,需要很多次的shuffle才能完成,那麼Hadoo

nginx為什麼Apache支援高併發???

        最開始接觸程式設計時,使用的是Apache伺服器,後來隨著網站使用者訪問量的增加,考慮高併發是必不可少的環節,越來越多的公司使用nginx伺服器。我們公司最近也打算更換nginx伺服器。那麼nginx和Apache有哪些異同點呢,nginx為什麼比Apach

sparkmapreduce的一個原因

接觸spark時間不長,但是有些概念還是沒有太校準,於是回顧了一下spark的文件。讀到shuffle操作那塊發現spark的shuffle操作後的reduce也是儲存到檔案然後從檔案中讀取。以前一直以為spark快是因為這部分操作是在記憶體中執行,也就是red

sparkhadoop原因

(1)spark大量使用記憶體 (2)核心資料結構:RDD(彈性分散式資料集),在此基礎上提供了許多計算函式, (3)在原先hadoop下一個map或reduce實現的功能,在spark下可以拆分成多個job.如果把hadoop看做罐子裡的大石頭,那麼spark的jo

網絡服務的兩種處理模型 Nginx為什麽Apache

刷新 坐標系 數據結構 table 單打獨鬥 tro https 數學期望 簡單的 任何一個任務都可以分解為三個要素,即“誰”,“什麽時間”,”幹什麽“。如果我們把這三個要素畫在一個笛卡爾坐標系中,就顯得很有意思了: 我以單CPU多任務操作系統為例,來看一個簡單的We

spark部分:spark的四種執行模式,Spark MapReduce 原因,spark執行程式流程,spark運算元種類,spark持久化運算元,cache 和 persist,調節引數的方式

Spark 有 4 中執行模式: 1. local 模式,適用於測試 2. standalone,並非是單節點,而是使用 spark 自帶的資源排程框架 3. yarn,最流行的方式,使用 yarn 叢集排程資源 4. mesos,國外使用的多 Spark 比 M

【 js 基礎 】為什麽 call apply

如果 分享 叠代 [1] get blank 3.4 -a case 這是一個非常有意思的問題。 在看源碼的過程中,總會遇到這樣的寫法: 1 var triggerEvents = function(events, args) { 2 var ev, i

NginxApache比較

一個 性能 影響 lec rewrite 定性 poll 超過 內存 Nginx特點:高性能epoll 異步非阻塞多個連接(萬級別)可以對應一個進程 支持反向代理支持7層負載均衡靜態文件、反向代理、前端緩存等處理方便支持高並發連接,每秒最多的並發連接請求理論可以達到 500

荷蘭研究人員提突破性想法:用紅外線傳輸網絡_WiFi100倍

速度 光纖 不同 顯示 cli 很快 紅外 十倍 網絡 原文地址 這年頭咱們去餐館吃飯、商場購物,最喜歡的就是蹭個免費Wi-Fi,省流量不說,速度也是杠杠的沒得噴(當然也有因同時連接人數過多速度卡成狗的,但和免費相比這些都可以忍受了吧)。 在光纖入戶,獨享10M、20M、3

Nginxapache服務器中php運行方式

環境 路徑 port 信息 一行 ring ftw dir document PHP5的CGI方式的一大優勢是內置了FastCGI的支持,只需指明綁定的地址和端口參數便可以以FastCGI的方式運行,如下: php-cgi -b 127.0.0.1:9000 配置Nginx

nginxApache、Lighttpd啟用HSTS

sch 存在 tar 頭部 nal 自己 輸入 -a rtu http://www.ttlsa.com/web/hsts-for-nginx-apache-lighttpd/ 302跳轉通常情況下,我們將用戶的 HTTP 請求 302 跳轉到 HTTPS,這會存在兩個問

tomcat 與 nginxapache的區別是什麽?

訪問服務器 代理 edit 資源分離 訪問 nor pac img 衍生 == tomcat 與 nginx,apache的區別是什麽? - 知乎https://www.zhihu.com/question/32212996 Apache HTTP Server

使用Apache的ab工具對比NginxApache靜態頁面處理能力

tt使用Apache的ab工具對比Nginx與Apache靜態頁面處理能力前言:為什麽要進行壓力測試 在運維工作中,壓力測試是一項非常重要的工作。比如在一個網站上線之前,能承受多大訪問量、在大訪問量情況下性能怎樣,這些數據指標好壞將會直接影響用戶體驗。但是,在壓力測試中存在一個共性,那就是壓力測

阿裏雲服務器ECS Linux系統分析nginxapache當天訪問最多的IP

nginx日誌Linux 系統查詢 nginx 或 apache 當天訪問最多的 IP 方法,以一鍵安裝包為例可以執行如下命令:cat /alidata/log/nginx/access/testweb.log |grep `date "+%d/%b"`|awk '{print $