最近想要多碰一下 RealTime 的 Web 應用研究了一些不同框架,其實看了一些各方的測試數據,各有其擁護者,我也寫了一些效能測試,當然這是不負責任的,因為我是窮人架構,只有單一 Server 在跑,比較意外的是接下來 nodeJS 的擁護者可能會很失望我的測試
我寫了一個專案叫 simple-webserver-benchmark ,目前放在 GitHub 可供下載,此專案主要是用了三種架構來寫簡單的 Web Server 效能測試,這三種架構分別是
- node.js
- php + pecl event
- vertx - javascript
- vertx - java
恩,有四種才對,因為 vertx 這個項目其實可以用多種程式語言來寫,是很棒的框架,以下是測試的數據表
測試項目 – 連線數 | nodejs | phpevent | vertx-js | vertx-java |
---|---|---|---|---|
helloworld – 10 | 12.2 | 3.3 | 4.9 | 3.4 |
helloworld – 100 | 12.7 | 3.4 | 4.9 | 3.5 |
helloworld – 1000 | 12.8 | 3.9 | 5 | 4.2 |
sendfile1 – 10 | 24.9 | 3.7 | 7.2 | 5.2 |
sendfile1 – 100 | 25.5 | 3.6 | 7.3 | 5.3 |
sendfile1 – 1000 | 25.9 | 4.1 | 7.4 | 5.3 |
sendfile2 – 10 | 25.3 | 3.8 | 7.2 | 5.4 |
sendfile2 – 100 | 25.4 | 3.6 | 7.3 | 5.4 |
sendfile2 – 1000 | 26.7 | 4.1 | 7.4 | 5.5 |
arrayjson – 10 | 16.9 | 7.5 | 13.1 | 4.2 |
arrayjson – 100 | 18.2 | 7.3 | 13.2 | 4.3 |
arrayjson – 1000 | 18.4 | 7.6 | 13.3 | 4.6 |
這個表主要是以 ab -c 10 -n 50000 http://127.0.0.1:8080/helloworld 這種方式跑出的數據,基本上就是 10,100,1000 條連線各自測試個 50000 次,表格內數字為秒數代表越小跑得越快,而各項目解釋如下
- helloworld : 只回應 Hello World !
- sendfile1 : 讀取靜態檔案不到 100bytes 然後傳出
- sendfile2 : 讀取靜態檔案大約 1Kbytes 然後傳出
- arrayjson : 在程式中跑個小迴圈產生陣列,並轉為 json 字串傳出
測試的軟硬體環境
- INTEL core2 E6750 + 8G DDR3 1333 RAM
- CentOS 6.4 64bit
- PHP 5.4.21 (REMI 包的)
- PHP pecl event 1.8.1 (REMI 包的)
- node.JS 0.10.21-1 (EPEL 包的)
- openjdk + openjdk-devel 1.7 (CentOS 原裝包)
- VertX 2.1M1 (官方的套件且已包含在 simple-webserver-benchmark 內)
總評
- nodejs 在正常環境下各項測試效能最差,而且是意外的非常的差,至於不正常的環境調校方式我不知道怎麼搞,望高人指教,呵呵,未來我不曉得 node.js 的路會變成怎樣,因為我個人感覺 javascript 的語法結構寫到很複雜的時候其實非常難以維護又如果效能持續這麼差的話,恐怕未來會有很多人慢慢移轉到其他架構
- php + event 效能在 I/O 上最好,不意外,pecl event 是 C 寫的,又把 HttpServer功能寫入,等於PHP原生支援了,但是由 arrayjson 的測試一目了然,程式語言本身的運算效率遠不如 vertx-java (JAVA Language)
- php + event 雖然效能非常好,但是跑多次後會發生 PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 72 bytes) ,研判 PHP 本身的記憶體管理有問題,似乎來不及做垃圾回收,目前應該無解,等新版看看吧,目前不建議做 production
- 我覺得整體表現最穩定效能最好的架構是以 VertX 的方式搭配 java language 來寫,除了 PHP 之外,其他架構都挺穩定的
有興趣研究的人可以點選這裡看看我寫的測試,我並沒有研究很深入,也許有很多效能可改進之處
最後一段話
Vertx 尚有 python,ruby 等語言可以寫,甚至混和各種語言來互相引用都行,這得拜 JVM 多語言特性,未來不排除 C# 或 PHP 甚麼鬼的都有人去實作,其實我覺得台灣地區沒有人推廣 vertx 挺可惜,因此我就拋磚引玉了,看有沒有人想來玩玩看
關於node.js 的測試,你是否只跑一個instance 呢。 每個node.js instance 只用一個thread, 要多開幾個instance 才可以用盡cpu 的效能,否則表現難和自動使用所有core 的vert.x 相比。
這個不負責任效能測試在我的測試環境其實已經用盡 CPU …. 所以是不負責任
很想搞一台 16 核心的來試試看啊
不過多個 Instance 應該還要另外搭派一個 WEB Server 做 Proxy 不是嗎 ?
這樣是否中間傳輸過程反而又影響了其效能 ?
試試用pm2 部署 再來測測看