阅读时间6分钟 (1192字)

一个简单评估Web服务器的方案

An Easy Way to Benchmark a Webserver

在开发新特性或更改某些设置时,我们必须始终问自己,网站的性能是变慢了还是变快了?

虽然正确回答这个问题可能最好是咨询专家,特别是如果我们谈论的是一个在线网站。我想讨论一种简单的方法来观察当发生变化时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。

调试插件

启用调试插件后,你已有了当服务器请求时网站发生情况的快照。例如,查看“数据库查询”选项卡,可以看到所有已执行的查询记录,包括执行查询的时间以及其他有用信息。

debug plugin

开始测试

调试插件在服务器响应请求时告诉我们一些信息。现在我们想了解在同时处理多个请求时的性能。是时候运行基准测试的第一阶段了。

运行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服务器设置。

绘制测试数据图表

很难检查一系列冷数据并理解正在发生的事情,但当你查看这个图表时,它就变得非常清楚。

testGsocLoad

这种热力图显示了随着并发请求的增长,网络服务器如何表现,数据来自ab命令(带-g选项)。下面的图比较了两组不同的查询性能,基于运行所有查询的平均秒数,显示y轴秒数(越低越好),x轴测试编号,针对mysqlslap数据:

stresssql

有许多更花哨和有用的方式来展示你的数据。只需使用你喜欢的工具,如gnuplot或类似工具。当你对网络服务器的表现更有信心时,只需更改命令工具参数就可以研究不同的情况。

祝您多次测试顺利。

 

 

 

 

《Joomla社区杂志》上发布的一些文章代表了作者在特定主题上的个人观点或经验,可能与Joomla项目的官方立场不完全一致。

0
 

评论

已经注册? 这里登录
尚无评论。成为第一个发表评论的人

通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务