選手介紹: javascript
node.js,服務端javascript語言,以出色的事件驅動和I/O異步廣受關注,它更像一輛性能出色的Mitsubishi Evlution X;php
php,耳熟能詳的服務端語言,在互聯網領域中市場佔有率至關高,它更像一輛性能出色,品牌知名度高的BMW 330i。java
駕駛員以及測試員介紹: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做爲一種新型的服務器語言從被承認,到普遍用於生產環境要走的路還很長。
有圖有真像:
這個是在3000併發連發30秒測試的,若是1000併發連發30秒能夠到8000+。
見下圖: