一个简单评估Web服务器的方案
在开发新特性或更改某些设置时,我们必须始终问自己,网站的性能是变慢了还是变快了?
虽然正确回答这个问题可能最好是咨询专家,特别是如果我们谈论的是一个在线网站。我想讨论一种简单的方法来观察当发生变化时Web服务器的性能如何。你不必太熟悉性能测试、负载等概念。用一个实际例子可能更容易理解。
今年在GSoC项目中,有一个关于SQL优化的项目,因此,对于这个例子,我们将测试一个SQL优化Pull Request如何影响Web服务器的性能:希望更快。
最重要的是要确保我们在比较“苹果与苹果”,因此需要一些环境设置,因此请在本地主机上运行此程序。我们将使用一些简单的工具,因为它们非常容易使用,并且可以在所有系统上广泛使用,而且是免费的。有很多其他更强大的工具可以用来替代,但我太懒了,不想学习其他工具。
工具
- Apache Bench (ab) 是一个用于评估HTTP的工具
- mysqlslap 是一个设计用来模拟MySQL服务器客户端负载的诊断程序
要求
- web服务器 - 我在Windows上使用xampp
- ab – Apache Benchmark
- myslslap – 测试SQL
- gnuplot - 将结果显示为图表或电子表格
准备环境
- 安装一个全新的Joomla网站,并加载大量数据,命名为nogsoc
- 或者从备份中恢复一个Joomla网站,命名为nogsoc
- 将nogsoc网站克隆到一个新网站,命名为gsoc
环境设置
Mysql
在mysql中禁用查询缓存。你可以通过设置以下命令来禁用查询缓存:
SET GLOBAL query_cache_size = 0;
Joomla设置
- 禁用Joomla缓存
- 启用调试插件
- 在gsoc网站上安装com_patchtester组件来管理Pull Request,并应用你想要测试的PR。
调试插件
启用调试插件后,你已有了当服务器请求时网站发生情况的快照。例如,查看“数据库查询”选项卡,可以看到所有已执行的查询记录,包括执行查询的时间以及其他有用信息。
开始测试
调试插件在服务器响应请求时告诉我们一些信息。现在我们想了解在同时处理多个请求时的性能。是时候运行基准测试的第一阶段了。
运行ab命令
ab -n 500 -c 100 -g out.data http://localhost/
在终端中运行此命令是在对URL进行压力测试
- 本地主机URL
- 100个并发请求(-c)
- 500次(-n)
- 保存数据用于gnuplot(-g)
对自己(localhost)运行ab命令,消除了网络问题对性能结果的影响。
分析ab结果
通过上述命令,我们让ab告诉我们:当100个并发请求到达web服务器时,它的性能如何?ab的答案是信息丰富的。ab的输出类似于以下内容:
Concurrency Level: 100 Time taken for tests: 159.182 seconds Complete requests: 500 Total transferred: 33498213 bytes HTML transferred: 33321313 bytes Requests per second: 3.14 [#/sec] (mean) Time per request: 31836.400 [ms] (mean) Time per request: 318.364 [ms] (mean, across all concurrent requests) Transfer rate: 205.51 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.3 0 51 Processing: 5476 29602 5433.1 30703 35734 Waiting: 9461 30290 3585.0 30705 35734 Total: 5476 29603 5433.1 30703 35734 Percentage of the requests served within a certain time (ms) 50% 30703 66% 31342 75% 31883 80% 32535 90% 33500 the 90% of all request was served under 33500 (ms) 95% 34065 98% 34700 99% 35253 100% 35734 (longest request)
从ab结果中考虑的最重要数据是
每秒请求数:它说明了整体性能的影响。数值越高越好。上面的是3.14(req/sec)
连接时间:我通常查看“等待”行。其中位数30705表示平均页面请求耗时(以毫秒为单位)。数值越低越好。一个指标是测试的好与不好,不受某些延迟的影响,是标准偏差列[+/- sd],考虑测试有意义时,取标准偏差较低的测试。
运行Mysqlslap
mysqlslap工具可以让我们通过一组查询在所有可用的PR中进行性能基准测试和比较MySQL性能。在Sql优化项目中,有关于哪些查询受PR影响的详细信息,因此制作两个.sql文件很简单:一个包含新查询,一个包含旧查询。要查看发生了什么,只需在终端中运行此命令两次,一次用新的,一次用旧的:
mysqlslap --concurrency=100 --iterations=10 --query=pr9.sql --create-schema=test -uroot -padmin
我们询问mysqlslap以下查询的性能
- pr9.sql查询(--query)
- 100个并发连接(--concurrency)
- 使用测试数据库(--create-schema)
- 运行此测试10次(--iteration)
分析mysqlslap结果
Benchmark Average number of seconds to run all queries: 2.538 seconds Minimum number of seconds to run all queries: 2.108 seconds Maximum number of seconds to run all queries: 3.373 seconds Number of clients running queries: 100 Average number of queries per client: 2
mysqlslap的结果非常清晰。它告诉我们,我们的查询平均运行了2,538秒。
测试类型
为了更好地理解服务器行为,对于每个基准测试工具在每个站点上运行,进行两种不同类型的测试很有用:负载测试和压力测试。
- 压力测试包括多次运行相同的基准测试工具命令
- 负载测试包括多次运行不同的基准测试工具命令(变化的是并发开关值,它增长,例如,10,20,50,100,200)
结果准确性
为了获得更准确的结果或良好的近似值,至少读取10次或更多,并使用最佳结果(标准偏差较低)。我建议使用shell脚本来自动化你的测试会话,并考虑安排它们,因为它们可能需要相当长的时间才能完成,这取决于你的开关值或你的web服务器设置。
绘制测试数据图表
很难检查一系列冷数据并理解正在发生的事情,但当你查看这个图表时,它就变得非常清楚。
这种热力图显示了随着并发请求的增长,网络服务器如何表现,数据来自ab命令(带-g选项)。下面的图比较了两组不同的查询性能,基于运行所有查询的平均秒数,显示y轴秒数(越低越好),x轴测试编号,针对mysqlslap数据:
有许多更花哨和有用的方式来展示你的数据。只需使用你喜欢的工具,如gnuplot或类似工具。当你对网络服务器的表现更有信心时,只需更改命令工具参数就可以研究不同的情况。
祝您多次测试顺利。
《Joomla社区杂志》上发布的一些文章代表了作者在特定主题上的个人观点或经验,可能与Joomla项目的官方立场不完全一致。
通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务
评论