计算和改进我的网络服务器可以处理的请求/并发用户数?

时间:2014-05-28 12:10:34

标签: webserver scalability load-testing

我正在使用HTML / Javascript / PHP / mysql构建动态网站和应用程序。我有 完成了网站,我现在的主要重点是确保它在推出时是 没有被我希望收到的交通所取消。 (我预计在发布日会有大约5000-7000次独立访问)。

该网站目前正在播放,您可以在此处查看:http://www.nightmapper.com/

我的托管是由bhost提供的,我在那里有银色的VPS包:

1024MB保证内存, 1536MB Burst Memory, 4个虚拟核心, 40GB磁盘空间, 750GB数据传输, 1个IPv4地址

我自己管理服务器,但我对它很新。

无论如何,计算成本最高的页面就是索引/主页 页面我有10个mySql查询,这些查询(大部分)用于获取本周的会场 列表。列表结果每个都显示缩略图图像。

首次访问的主页大小是:2.7mb,我已经完成了 我能想到的一切,以尽量减少这一点,包括生成缩略图 减少图像大小并利用浏览器缓存。

我尝试了几种方法对网站进行压力测试,包括负载影响:http://imgur.com/4UCGobf

终端中的

和ab测试。我很担心结果(主要是 结果是每秒5.26个请求,这看起来相当低:

ab -n 100 -c 10 http://www.nightmapper.com/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.nightmapper.com (be patient).....done

Server Software:        Apache/2.2.22
Server Hostname:        www.nightmapper.com
Server Port:            80
Document Path:          /
Document Length:        44808 bytes
Concurrency Level:      10
Time taken for tests:  19.012 seconds
Complete requests:      100
Failed requests:        0
Write errors:          0
Total transferred:      4519300 bytes
HTML transferred:      4480800 bytes
Requests per second:    5.26 [#/sec] (mean)
Time per request:      1901.199 [ms] (mean)
Time per request:      190.120 [ms] (mean, across all concurrent requests)
Transfer rate:          232.14 [Kbytes/sec] received


Connection Times (ms)
              min  mean[+/-sd] median  max
Connect:      26  38  17.9    32    107
Processing:  933 1828 510.2  1782    3495
Waiting:      22  116 303.4    28    1601
Total:        967 1867 518.8  1813    3591


Percentage of the requests served within a certain time (ms)
  50%  1813
  66%  1983
  75%  2032
  80%  2184
  90%  2412
  95%  3124
  98%  3568
  99%  3591
 100%  3591 (longest request)

使用这些结果,我如何计算每天唯一访问者的数量以及我可以处理的并发用户数,以及我可以使用哪些方法来识别问题并改进这些结果?

我应该借此机会要求任何好的资源; 在哪里我可以了解更多有关此类优化,负载测试和可伸缩性的信息?

1 个答案:

答案 0 :(得分:1)

这是一个复杂的问题,因为涉及很多因素。以下是我要调查的一些事情:

  • 您所说的主页非常大,这将是一个问题。您可以查看图像的缓存服务,这可能有很大帮助(类似于Amazon Cloudfront:https://aws.amazon.com/cloudfront/)。这种类型的内容传送服务将您的图像复制到&#34; edge&#34;位置,并减轻Web服务器的负担,以便下载它们。它可能会产生很大的不同。我猜这是你内容的最大部分,所以从你的Web服务器上删除它会使事情变得更快。
  • 你提到的下一件事是你在主页加载上执行10个MySQL查询,这是很多单独的查询。如果您可以重构数据模型或查询以将其降低到1或2个查询,则可能会更快。
  • 您可以尝试的另一个选项是网页上的某种分页方案,当用户向下滚动时,您可以在每个部分变为可见时对其执行单独的MySQL查询。
  • 现在看来你在一台服务器上运行,一件容易的事就是在至少2台服务器上运行(1台用于Web服务器,1台用于MySQL)。 MySQL在忙碌时会占用大量内存和CPU,因此建议隔离它。
  • 为了简化您的应用服务器扩展,您可以使用负载均衡器并拥有许多应用服务器实例。
  • 扩展数据库层更具挑战性,有几种方法可以做到这一点,包括读取平衡(使用MySQL复制到只读从属)。在简单的读取平衡后,它会进入分片,但我怀疑你是否会需要它,因为它似乎没有你有大量的数据库写入或非常大的数据集。如果你确实遇到了高写入量和非常大的数据(50GB - 1TB)的情况,那么分片是值得研究的。

估计您可以处理的用户数量应该很容易理解。我写了一本名为Software Pipelines的书,讨论了这样做的方法(http://www.amazon.com/Software-Pipelines-SOA-Multi-Core-Processing/dp/0137137974)。基本思路是确定处理过程中每个步骤的持续时间,并根据您预期的峰值流量进行计算。即使你当前的实施,你现在还有粗略的数据。例如,如果您可以执行5次主页/秒的加载,并且您希望每天有7000个用户,那么只需计算峰值流量。平均每天7000个用户(每个主页加载1个)仅约5页请求/分钟。因此,即使您的峰值负载是该数字的10倍,您也应该能够处理负载。

关键是要了解并分析您的应用程序以查看花费的时间,然后应用上述一种或多种方法。

祝你的网站好运!