Ab吞吐量測試,為何nginx卻不如 apache
怪我咯
怪我咯 2017-05-16 17:01:44
0
5
831

環境

系统 win7 x64 8G内存 ADM7750双核
对比 
1) Apache 2.4.9 + php5.5.12 ts vc11 
2) NGINX 1.6.2 + PHP-FPM

程式碼

<?php 
# http://localhost/hello.php
echo  "hello";
<!-- http://localhost/js.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
</body></html>

測試

./ab -c10 -n1000 http://localhost/hello.php
./ab -c10 -n1000 http://localhost/js.html

結果

            js.html                         hello.php
nginx      0.907sec 1102/sec                timeout error 
apache     0.695sec 1439/sec                0.198s 1089/sec

疑問

現在所有的都建議 nginx,可為什麼nginx的吞吐量無論是 純HTML 還是 單獨的PHP都比不過Apache
UGC 的平台 更適合於 Apache 還是 nginx?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(5)
漂亮男人

Windows 7 上IIS 與Apache 效能比較測試
IIS + php-cgi.exe(NTS) vs Apache + php5apache2_4.dll(TS)
環境(64位元Win7): IIS7+PHP5.4(NTS非執行緒安全版本) vs Apache2.4(32位元)+PHP5.4
靜態檔案效能:

ab -k -c100 -n10000 http://127.0.0.1/info.htm      # IIS RPS 1709
ab -k -c100 -n10000 http://127.0.0.1:8080/info.htm # Apache RPS 1847

結論:基於APR運行時和WinNT多執行緒的Apache在靜態資源處理方面並不比IIS差.

PHP性能:

ab -k -c100 -n10000 http://127.0.0.1/bs.php      # IIS RPS 1180
ab -k -c100 -n10000 http://127.0.0.1:8080/bs.php # Apache RPS 1071

結論:Apache使用了線程化的MPM,所以需要使用線程安全版本的PHP,而線程安全檢查有一定開銷,所以性能要比IIS+PHP-CGI低一些.

Nginx並非基於多執行緒實現高並發,而是基於epoll(Linux),kqueue(FreeBSD)事件驅動的非同步網路IO機制.Nginx在Windows上用的是最原始的select,而不是Windows的IOCP,所以Windows版Nginx僅僅定位於測試和開發.要發揮Nginx真正的性能,必須在Linux或FreeBSD上.

Apache雖然在Windows上用的也是select的系統調用,但是Apache的WINNT這個MPM是一個多線程的MPM,所以在非高並發(比如100並發)的情況下處理靜態資源甚至比IIS還有優勢.另外,Apache在Linux上的同樣存在使用epoll的MPM,比如2.4系列預設的event MPM,就是一個epoll事件驅動的架構,主進程管理多個工作進程,每個工作進程又有多個線程,使用epoll進行非同步網路IO,這是Apache面對Nginx挑戰做出的有力回應.

滿天的星座

windows 不能說明任何事。 windows 下只用做測試僅此而已。
Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation layer). Only the select() connection processing method is currently used, so high performance and scalability should not is currently used, so high performance and scalability should not be expected ue. of nginx for Windows is considered to be a beta version.
Windows 沒有epoll 和kqueue,nginx 在Windows 上用select 表現自然不佳。

仅有的幸福

樓主親自測試驗證是個好習慣,但一般都是採用Linux作為nginx的伺服器。使用window的話nginx效能可能還不及apache,應該nginx和apache在windows上都是採用同樣的運行機制select,類似排隊循環處理。
windows下nginx表現慢可能是:nginx 還需要呼叫php-cgi ,而 apache內建整合了php的sapi。

而在linux下,apache依然是select,nginx可採用epoll,那麼:
apache 依然排隊處理
nginx 的epoll機制,來一個請求,扔給php-cgi,然後接著下一個請求。當php-cgi處理完了在回傳給客戶端就行了。這樣就並行起來了。

樓主可以看看 epoll和apache區別:
假設你在大學讀書,住的宿舍樓有很多房間,你的朋友要來找你。

select版宿管大媽就會帶著你的朋友挨個房間去找,直到找到你為止。

而epoll版宿管大媽會先記下每位同學的房間號,你的朋友來時,只需告訴你的朋友你住在哪個房間即可,不用親自帶著你的朋友滿大樓找人。

如果來了10000個人,都要找自己住這棟樓的同學時,select版和epoll版宿管大媽,誰的效率更高,不言自明。

同理,在高並發伺服器中,輪詢I/O是最耗時的操作之一,select和epoll的效能誰的效能更高,同樣十分明了。

仅有的幸福

贏NG?哎

给我你的怀抱

也不貼上配置,nginx 開epool了沒?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!