今天agentzh在微博上公布了一些OpenResty 與 php-fpm、Nodejs操作MySQL的性能評測數據。
agentzh:我剛才在對比測試大結果集查詢時,發現NodeJS在使用 node-mysql庫訪問MySQL時,上下文切換次數居高不下,都快趕上 php-fpm + php-mysql了。但Node只起了一個進程,而且 strace 確認了確實是非阻塞的(不像 node-mysql-libmysqlclient 和 node-db-mysql 那樣濫用 OS 線程池玩阻塞通信),很是奇怪
貌似 node-mysql 的作者真不在乎性能?對於 100KB 的大結果集查詢,並且命中 MySQL 查詢緩存時,node-mysql + node-generic-pool 的性能是最差的,甚至不如 php-fpm + php-mysql. 我的 nodejs 腳本在這裡:http://t.cn/zO9bEgl 哪位 NodeJS 專家幫我把把脈?使用的各組件都是當前的最新版本。
agentzh:對於單行的小結果集查詢,node-mysql + node-generic-pool 相比 php-fpm + php-mysql 還是有性能優勢的,rps 高了一倍的樣子,絕對值也有差不多 1000 rps,但和 ngx_openresty 的組件相比,貌似還有些差距 下圖中的測試數據仍然來自 Amazon EC2 Small 實例組成的測試集群。
agentzh:ngx_srcache + ngx_memc 這種緩存的效率看來還確實不錯,比如 100KB mysql 大結果集查詢在緩存命中時的情況添加進了下面這張圖中(黃色曲線)。圖中列出的其他所有東西,比如 lua, php, nodejs 都可以很方便地享受到 ngx_srcache 的緩存服務
agentzh:既然剛才給出了 100KB 大結果集的結果,那麼不妨再 show 一下 ngx_srcache + ngx_memc 對於單行小結果集 mysql 查詢在 4 臺 memcached 節點組成的分布式緩存命中時的 rps 隨並發度的變化。我們看到,只比 ngx_drizzle 略有提升,確實已經快到天花板了。
agentzh:測試代碼都公開了:https://github.com/agentzh/mysql-driver-benchmark 測試數據使用的是 MySQL 官方提供的 World 樣例資料庫,同時測試環境是 Amazon EC2 Small 實例(1 臺 web 機,4 臺 mysql 機,1 臺運行 weighttp 測試工具)。歡迎指出任何不公平的地方 :)