热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swoole怎么提升服务器性能,tp5.1使用swoole做服务器简单的接口性能测试

官方测试地址:官方测试最近在看tp5.1的think-swoole支持,作为替代php-fpm的一种方案,现在简单的用swoole做为ht

官方测试地址:官方测试

最近在看tp5.1的think-swoole支持,作为替代php-fpm的一种方案,现在简单的用swoole做为http服务器和用传统的php-fpm分别测试下接口的性能。

测试机器:

mac:MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)

cpu:3.1 GHz Intel Core i5

memory: 8 GB 2133 MHz LPDDR3

数据库:mysql5.7 本地服务器

php: php7.2

默认开启了1个worker进程,经测试接口的性能根据开启worker的进程数成倍增加。

api php代码

namespace app\api\controller;

use app\common\controller\ApiBaseController;

use think\Db;

class User extends ApiBaseController{

public function __construct()

{

}

public function get_users(){

$users = Db::name('admins')->limit(50)->select();

return $this->responseJson('1','success',$users);

}

}

查询50条用户数据测试、

1.先测试传统的php-fpm,100个客户端并发1000次

$ ab -c 100 -n 1000 http://test.tp51.com/api/user/get_users

############## result

Server Software: nginx/1.13.2

Server Hostname: test.tp51.com

Server Port: 80

Document Path: /api/user/get_users

Document Length: 13002 bytes

Concurrency Level: 100

Time taken for tests: 16.389 seconds

Complete requests: 1000

Failed requests: 0

Total transferred: 13171000 bytes

HTML transferred: 13002000 bytes

Requests per second: 61.02 [#/sec] (mean)

Time per request: 1638.850 [ms] (mean)

Time per request: 16.389 [ms] (mean, across all concurrent requests)

Transfer rate: 784.84 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.7 0 4

Processing: 63 1550 282.5 1620 1744

Waiting: 63 1550 282.6 1620 1744

Total: 67 1551 281.9 1620 1744

Percentage of the requests served within a certain time (ms)

50% 1620

66% 1628

75% 1633

80% 1637

90% 1663

95% 1705

98% 1721

99% 1726

100% 1744 (longest request)

2.使用swoole做服务器

$ ab -c 100 -n 1000 http://127.0.0.1:9501/api/user/get_users

########### result

Server Software: swoole-http-server

Server Hostname: 127.0.0.1

Server Port: 9501

Document Path: /api/user/get_users

Document Length: 13015 bytes

Concurrency Level: 100

Time taken for tests: 3.910 seconds

Complete requests: 1000

Failed requests: 0

Total transferred: 13193000 bytes

HTML transferred: 13015000 bytes

Requests per second: 255.73 [#/sec] (mean)

Time per request: 391.034 [ms] (mean)

Time per request: 3.910 [ms] (mean, across all concurrent requests)

Transfer rate: 3294.80 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.9 0 5

Processing: 5 370 68.3 381 432

Waiting: 4 370 68.3 381 432

Total: 9 371 67.5 381 432

Percentage of the requests served within a certain time (ms)

50% 381

66% 387

75% 399

80% 404

90% 422

95% 429

98% 430

99% 430

100% 432 (longest request)

3.结果分析

性能大概提升了3~4倍

使用传统php-fpm

Requests per second: 61.02 [#/sec] (mean)

Time per request: 1638.850 [ms] (mean)

Time per request: 16.389 [ms] (mean, across all

concurrent requests)

使用swoole

Requests per second: 255.73 [#/sec] (mean)

Time per request: 391.034 [ms] (mean)

Time per request: 3.910 [ms] (mean, across all concurrent requests)

4. 使用redis测试

api代码

namespace app\api\controller;

use app\common\controller\ApiBaseController;

use think\Db;

use app\common\services\Predis;

class User extends ApiBaseController{

public function __construct()

{

}

public function get_users(){

$predis = new Predis();

$cache = $predis->get('users');

if (!empty($cache)){

return $this->responseJson('1','success',$cache);

}

$users = Db::name('admins')->limit(50)->select();

$predis->set('users',$users);

return $this->responseJson('1','success',$users);

}

}

5.性能测试

1.php-fpm + redis

Server Software: nginx/1.13.2

Server Hostname: test.tp51.com

Server Port: 80

Document Path: /api/user/get_users

Document Length: 13002 bytes

Concurrency Level: 100

Time taken for tests: 13.548 seconds

Complete requests: 1000

Failed requests: 0

Total transferred: 13171000 bytes

HTML transferred: 13002000 bytes

Requests per second: 73.81 [#/sec] (mean)

Time per request: 1354.764 [ms] (mean)

Time per request: 13.548 [ms] (mean, across all concurrent requests)

Transfer rate: 949.41 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.9 0 5

Processing: 42 1287 228.6 1334 1461

Waiting: 36 1287 228.7 1334 1461

Total: 42 1288 227.9 1334 1461

Percentage of the requests served within a certain time (ms)

50% 1334

66% 1352

75% 1363

80% 1378

90% 1409

95% 1426

98% 1441

99% 1449

100% 1461 (longest request)

2.使用swoole+redis

Server Software: swoole-http-server

Server Hostname: 127.0.0.1

Server Port: 9501

Document Path: /api/user/get_users

Document Length: 13015 bytes

Concurrency Level: 100

Time taken for tests: 3.189 seconds

Complete requests: 1000

Failed requests: 0

Total transferred: 13193000 bytes

HTML transferred: 13015000 bytes

Requests per second: 313.60 [#/sec] (mean)

Time per request: 318.881 [ms] (mean)

Time per request: 3.189 [ms] (mean, across all concurrent requests)

Transfer rate: 4040.31 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.9 0 5

Processing: 4 299 54.2 315 322

Waiting: 4 299 54.2 315 322

Total: 9 299 53.3 315 322

Percentage of the requests served within a certain time (ms)

50% 315

66% 316

75% 317

80% 318

90% 319

95% 320

98% 321

99% 322

100% 322 (longest request)

经测试,php-fpm+redis 性能提示不大,swoole+redis提升明显

php-fpm

swoole

mysql

RPS:61.02

RPS: 255.73

redis+mysql

RPS:73.81

RPS: 318.881



推荐阅读
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
author-avatar
我叫柒薇安2001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有