最近一个项目因为性能原因(原项目使用 nodejs, 单项目中同时提供 http tcp websocket 服务)需要重构, 短连接(http api) 准备用 php(开发速度快, 所以 xxx 是世界上最好的语言) 重写.
下面对 ci / lumen / hyper-api 3 个框架进行压测, 来选择这次重写需要使用的框架.
关于 压测, 参考 rango 的博客: http://rango.swoole.com/archives/254
压测结果
qps: query per second, 查看服务器性能最直观的指标
关于 qps 低: 服务器基础服务是最低配的 阿里云 ecs + docker
php\qps | ab/hello | ab/db | ab/redis |
---|---|---|---|
hyper-api | 133.29 | 25.06 | 89.13 |
ci | 115.47 | 23.66 | 45.03 |
lumen | 67.52 | 18.15 | 36.39 |
不得不说, hyper-api 的表现非常亮眼, 欢迎大家尝试
3 个测试项目的代码:
hayper-api: https://coding.net/u/daydaygo/p/hyper-api/git
压测 case
ab/hello: 3 个框架均返回 json 数据:
{"code":"0000","msg":"success"}
ab/db: 3 个框架均使用 model 并返回 10 条 users 表数据
1 牟萍 dolorem_qui@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe hLSviARL7f 2017-08-20 18:14:22 2017-08-20 18:14:222 丘智敏 vcum@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe JTg0zvrG5S 2017-08-20 18:14:22 2017-08-20 18:14:223 胥斌 in.nostrum@example.org $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe FRekYNw2NA 2017-08-20 18:14:22 2017-08-20 18:14:224 唐秀云 vnatus@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe oOxO2oRneR 2017-08-20 18:14:22 2017-08-20 18:14:225 罗海燕 tqui@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe 0FPqnEbWlt 2017-08-20 18:14:22 2017-08-20 18:14:226 卜欢 aut.labore@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe ZaqOYvfq7q 2017-08-20 18:14:22 2017-08-20 18:14:227 白欣 optio_nesciunt@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe aIU2QRm6kJ 2017-08-20 18:14:22 2017-08-20 18:14:228 甘鹰 natus07@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe azP1OW5QKW 2017-08-20 18:14:22 2017-08-20 18:14:229 欧东 excepturi.nulla@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe Yg8tJhNvDN 2017-08-20 18:14:22 2017-08-20 18:14:2210 原晨 ipsa.quis@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe Xa91IMhTfu 2017-08-20 18:14:22 2017-08-20 18:14:22
db/redis: 3 个框架均访问 redis 获取 1 条存储的 user 数据
127.0.0.1:6379> get ab-test"{\"id\":1,\"name\":\"\\u725f\\u840d\",\"email\":\"dolorem_qui@example.net\",\"password\":\"$2y$10$MLYoIDH0DHwzpnLlVkIV0u\\/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe\",\"remember_token\":\"hLSviARL7f\",\"created_at\":\"2017-08-20 18:14:22\",\"updated_at\":\"2017-08-20 18:14:22\"}"
压测数据
在压测 db 的时候, 一直报
apr_pollset_poll: The timeout specified has expired (70007)
, 所以只发起了 100 的访问
ci - ab/hello
ab -c 100 -n 10000 http://ci.daydaygo.top/ab/helloDocument Path: /ab/hello Document Length: 31 bytes Concurrency Level: 100Time taken for tests: 86.604 seconds Complete requests: 10000Failed requests: 0Total transferred: 1860000 bytes HTML transferred: 310000 bytes Requests per second: 115.47 [#/sec] (mean)Time per request: 866.044 [ms] (mean) Time per request: 8.660 [ms] (mean, across all concurrent requests) Transfer rate: 20.97 [Kbytes/sec] received
lumen ab/hello
ab -c 100 -n 10000 http://lumen.daydaygo.top/ab/helloDocument Path: /ab/hello Document Length: 31 bytes Concurrency Level: 100Time taken for tests: 148.115 seconds Complete requests: 10000Failed requests: 0Total transferred: 2120000 bytes HTML transferred: 310000 bytes Requests per second: 67.52 [#/sec] (mean)Time per request: 1481.150 [ms] (mean) Time per request: 14.811 [ms] (mean, across all concurrent requests) Transfer rate: 13.98 [Kbytes/sec] received
hyper-api ab/hello
ab -c 100 -n 10000 http://hyper.daydaygo.top/ab/helloDocument Path: /ab/hello Document Length: 31 bytes Concurrency Level: 100Time taken for tests: 75.025 seconds Complete requests: 10000Failed requests: 0Total transferred: 2520000 bytes HTML transferred: 310000 bytes Requests per second: 133.29 [#/sec] (mean)Time per request: 750.254 [ms] (mean) Time per request: 7.503 [ms] (mean, across all concurrent requests) Transfer rate: 32.80 [Kbytes/sec] received
ci ab/db
ab -c 100 -n 400 -k http://ci.daydaygo.top/ab/dbDocument Path: /ab/db Document Length: 2351 bytes Concurrency Level: 100Time taken for tests: 4.226 seconds Complete requests: 100Failed requests: 0Total transferred: 250600 bytes HTML transferred: 235100 bytes Requests per second: 23.66 [#/sec] (mean)Time per request: 4226.170 [ms] (mean) Time per request: 42.262 [ms] (mean, across all concurrent requests) Transfer rate: 57.91 [Kbytes/sec] received
lumen ab/db
ab -c 100 -n 100 -k http://lumen.daydaygo.top/ab/dbDocument Path: /ab/db Document Length: 2400 bytes Concurrency Level: 100Time taken for tests: 5.510 seconds Complete requests: 100Failed requests: 0Total transferred: 258100 bytes HTML transferred: 240000 bytes Requests per second: 18.15 [#/sec] (mean)Time per request: 5509.861 [ms] (mean) Time per request: 55.099 [ms] (mean, across all concurrent requests) Transfer rate: 45.75 [Kbytes/sec] received
hyper ab/db
ab -c 100 -n 100 -k http://hyper.daydaygo.top/ab/dbDocument Path: /ab/db Document Length: 2321 bytes Concurrency Level: 100Time taken for tests: 3.991 seconds Complete requests: 100Failed requests: 0Total transferred: 254200 bytes HTML transferred: 232100 bytes Requests per second: 25.06 [#/sec] (mean)Time per request: 3991.113 [ms] (mean) Time per request: 39.911 [ms] (mean, across all concurrent requests) Transfer rate: 62.20 [Kbytes/sec] received
ci ab/redis
ab -c 100 -n 1000 -k http://ci.daydaygo.top/ab/redisDocument Path: /ab/redis Document Length: 239 bytes Concurrency Level: 100Time taken for tests: 22.205 seconds Complete requests: 1000Failed requests: 0Keep-Alive requests: 0Total transferred: 394000 bytes HTML transferred: 239000 bytes Requests per second: 45.03 [#/sec] (mean)Time per request: 2220.522 [ms] (mean) Time per request: 22.205 [ms] (mean, across all concurrent requests) Transfer rate: 17.33 [Kbytes/sec] received
hyper ab/redis
ab -c 100 -n 1000 -k http://hyper.daydaygo.top/ab/redisDocument Path: /ab/redis Document Length: 239 bytes Concurrency Level: 100Time taken for tests: 11.220 seconds Complete requests: 1000Failed requests: 0Keep-Alive requests: 0Total transferred: 468000 bytes HTML transferred: 239000 bytes Requests per second: 89.13 [#/sec] (mean)Time per request: 1121.954 [ms] (mean) Time per request: 11.220 [ms] (mean, across all concurrent requests) Transfer rate: 40.74 [Kbytes/sec] received
lumen ab/redis
ab -c 100 -n 1000 -k http://lumen.daydaygo.top/ab/redisDocument Path: /ab/redis Document Length: 239 bytes Concurrency Level: 100Time taken for tests: 27.479 seconds Complete requests: 1000Failed requests: 0Keep-Alive requests: 0Total transferred: 420000 bytes HTML transferred: 239000 bytes Requests per second: 36.39 [#/sec] (mean)Time per request: 2747.931 [ms] (mean) Time per request: 27.479 [ms] (mean, across all concurrent requests) Transfer rate: 14.93 [Kbytes/sec] received
后记
因为 3 个框架都不算特别熟悉, 在写压测 case 时, 基本是照着文档来实现的, 所以, 尽管 还有很大的优化的空间, 但是这个时候我的选择倾向于 hyper-api.
关于性能, 也有几点认识:
性能优化是没有止境的
要多好的性能才够, 1 个亿够不够
什么时候该考虑性能, 至少要业务能有量才行
作者:daydaygo
链接:https://www.jianshu.com/p/2b549ca452cf
共同学习,写下你的评论
评论加载中...
作者其他优质文章