巔峯對決:node.js和php性能測試

選手介紹:  javascript

node.js,服務端javascript語言,以出色的事件驅動和I/O異步廣受關注,它更像一輛性能出色的Mitsubishi Evlution Xphp

php,耳熟能詳的服務端語言,在互聯網領域中市場佔有率至關高,它更像一輛性能出色,品牌知名度高的BMW 330ijava


駕駛員以及測試員介紹:node

 

網絡環境:內網mysql

駕駛員(壓力測試服務器): nginx

服務器系統:Linux 2.6.18 web

服務器配置:Intel(R) Xeon(TM) CPU 3.40GHz 4 CPUS redis

內存:6GB sql


測試員(發包服務器): apache

發包工具:apache 2.2.19自帶的ab測試工具 

服務器系統:Linux 2.6.18 

服務器配置:Pentium(R) Dual-Core CPU E5800 @ 3.20GHz 2CPUS 

內存:1GB 


車輛介紹:

Mitsubishi Evlution X(node.js):如下簡稱EVO(node)

版本:V0.4.9;

官方提供性能:6985req/sec(http請求);

改裝狀況:

一、渦輪增壓套件:multi-node(在多核服務器上多開node進程提升性能);

二、運動避震和地盤套件:generic-pool(連接池,用以提升對mysql、redis等i/o操做的性能);


BMW 330i(php):如下簡稱330(php)

版本:5.2.17;

官方提供性能:8220 req/sec(http請求);

改裝狀況:

寶馬御用改裝ACSCHNITZER提供:Nginx+FastCgi;


注意:可能我php配置不是最優化,應該還能夠再快一些,下面的一些測試配置都是根據網上的文章進行配置的,若是大師級高手來配的話,估計PHP性能還能提高50%左右,因此這個測試數據僅供參考。

配置是根據張宴的博客再根據實際狀況修改來的,原文地址:http://blog.s135.com/nginx_php_v6/


序:

對於原廠EVO(node)和通過改裝的EVO(node)之間到底性能會差多少?咱們讓他們在場地上小試一下身手。

測試內容:

分別對redis的一個key值進行get操做,並返回這個值。壓力分別在3000、5000、7000,壓測30秒。


com 3000/30  3000/30  3000/30 5000/30 5000/30   5000/30 7000/30   7000/30 7000/30 
type  node0  node1 node2   node0  node1 node2  node0  node1  node2 
rps  4025  5479  5262  3913  5283  5353  3823  5258  5269
 tpq  0.24  0.18  0.19  0.26  0.19  0.18  0.26  0.21  0.19
 80%req  63  131  671  448  417  1210  1961  856  1650
 fail  0  0  0  0  0  0  227  0  0

   

說明:(下同)

node0表示原裝,node1表示只進行了multi-node改裝,node2表示進行了multi-node和generic-pool改裝。

 

3000/30:表明命令./ab -c 3000 -t 30 http://10.1.10.150:8888/ 

rps:表明每秒處理請求數,併發的主要指標 

tpq:每一個請求處理的時間,單位毫秒。 

fail:表明平均處理失敗請求個數 

80%req:表明80%的請求在多少毫秒內返回。 


接下來咱們看下對mysql的操做,3者的區別,對mysql的testtable進行select * 操做,testtable有2個字段,1條數據。返回name值爲test。


com 3000/30  3000/30  3000/30 5000/30 5000/30   5000/30 7000/30   7000/30 7000/30 
type  node0  node1 node2   node0  node1 node2  node0  node1  node2 
rps 1247  2465  2999  1211  2451  3013 1243 2440  3054
 tpq  0.82  0.40  0.33  0.82  0.41  0.33  0.80  0.42  0.33
 80%req 2424  2080  627  4329  3103  1365  5433  3610  3188
 fail  0  0  0  0  0  0 0  0  0


multi-node的應用顯然大大提高了node的性能,鏈接池只有在特定的狀況下才能更好的做用。

若是鏈接時間越長,操做DB越複雜,例如對redis操做多個key或是排序等,鏈接池的性能就更能體現出來了。


具體如何對EVO(node)進行改裝,詳見個人博客:http://snoopyxdy.blog.163.com/blog/static/601174402011841174351/


chapter1:男人之間的戰鬥,0-400M直線加速

0-400米直線競速賽又稱爲「直線加速度賽」,是專爲賽車性能而生的比試,沒有辦法逃避,只能一往無前。

在空曠的飛機場,EVO(node)330(php)正準備着一場赤手空拳的較量。

測試內容:

對「hello world」 web服務器進行測試,空框架,無任何業務負載。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node php  node  php   node php 
 rps  7677  3624  7232  3760  6743  3731
 tpq  0.13  0.39  0.14  0.41  0.15  0.42
 80%req  138  843  477  1343  898  2445
 fail  0  0  0  0  0  0

   

EVO(node)在multi-node的4渦輪增壓下(4CPU),一路領先,直到終點,不過在測試中4個CPU一直出於飽和狀態,若是有8個核,估計能更快。

而php因爲我菜鳥級的配置改裝,沒法徹底發揮他的性能,網上有TX將php裸奔到5000+rps的,你們能夠去參考一下。



chapter2:都市街跑,考量你的駕駛技術

跑在都市的路上,常常會看見有兩部車子前後從你身邊呼嘯而過,伴隨着引擎轟鳴聲的遠去,你能感覺到速度的激情。猶如咱們常常穿梭在繁華的都市內,因此先將生產中最經常使用到的mysql進行對比測試。

測試內容:

對數據表test進行select * 操做,test數據表內只有一條數據,2個字段,而後返回name,值爲test。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node  php   node   php   node  php 
 rps  2999  1293  3013  1349  3054  1301
 tpq  0.33  0.82  0.33  0.80  0.33  0.80
 80%req  627  1369  1365  1979  3188  3903
 fail  0  0  0  111  0  573


mysql是創建和釋放鏈接都比較長的,因此node和php性能相比裸奔都大幅降低。

因爲php每次請求都須要創建釋放鏈接,因此耗時更長。

EVO(node)在這時的優點就發揮出來了,multi-node和generic-pool兩大利器無縫合做,在街頭巷尾遠遠的甩開了330(php)

仍是那句老話,可能php改裝的不到位,各位作個參考把。


chapter3:城市高架,隧道口,匝道上都是咱們展示速度的舞臺

高架的誕生是爲緩和日益阻塞的城市交通,高架上不只是豪車的天下,更是性能車的舞臺,讓咱們去體驗砸道秒殺一切的快感吧。

memcache是做爲緩解mysql瓶頸的最佳工具,php+memcache+mysql一直是很經典的組合,普遍用於各大互聯網站點內。

測試內容:

對memcache的「test」key取值,而後返回這個值「test」。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node  php   node   php   node  php 
 rps  5102  1957  4995  1841  4976  1872
 rpt  0.2  0.64  0.2  0.74  0.19  0.70
 80%req  672  1713  1033  2150  1494  3551
 fail  0  7  0  79  0  335


和mysql對比,memcache創建和釋放鏈接時間要更短,並且直接操做內存,因此二者的測試結果都有很多的上升。

這裏php仍是受限於他創建和釋放鏈接的損耗,成績不理想。


chapter4:決戰紐博格林

真正的賽車都必須去征服賽道之王——德國紐博格林北環賽道,這條被譽爲綠色地獄的20.6km賽道是讓賽車在原始的山林之間高速穿梭,賽道隨着山勢而起伏,宛若雲霄飛車。evo在這條賽道的最佳成績是7分32秒52,而 AC-Schnitzer改裝的BMW M3,最佳成績是7分36秒。

在高速信息化的時代,咱們對速度的渴望愈加的強烈,Redis做爲高速nosql內存db,以其出色的性能被大衆承認,如今愈來愈多的互聯網站點加入到了nosql行列。

測試內容:

對Redis的「test」key取值,而後返回這個值「test」。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node php  node  php   node php 
 rps  5262  2015  5353  1949  5269  1901
 tpq  0.19  0.61  0.18  0.61  0.19  0.61
 80%req  671  1805  1210  2356  1650  3816
 fail  0  0  0  105  0  607


這個測試結果和memcache相差不大,由於redis和memcache相比他的優點再也不key-value上,而是hash和sort,還有pub/sub等,因此在純粹的key-value上,此次測試二者性能不相伯仲。

最終在紐博格林北環賽道,EVO(node)率先衝過了終點,成爲本次對比的贏家。


尾聲:

我想此次測試的結果應該早已經在各位的預料之中了,事件驅動對於內存消耗更少,非阻塞和鏈接池的加入讓node對I/O操做更上一層樓。

雖然php在各方面都落於下風,可是並不表明php就不如node,php有他更適合的應用場景和普遍的開源框架以及技術支持。

node做爲一種新型的服務器語言從被承認,到普遍用於生產環境要走的路還很長。


有圖有真像:

巔峯對決:node.js和php性能測試 - snoopyxdy - snoopyxdy的博客


這個是在3000併發連發30秒測試的,若是1000併發連發30秒能夠到8000+。

見下圖:


巔峯對決:node.js和php性能測試 - snoopyxdy - snoopyxdy的博客

相關文章
相關標籤/搜索