【问题标题】:Apache to slow to responde, but CPU and memory not max outApache 响应缓慢,但 CPU 和内存未达到最大值
【发布时间】:2012-11-19 00:03:57
【问题描述】:

问题

2 apache 服务器的响应时间很长,但我没有看到 CPU 或内存已满。

详情

我有 2 个apache 服务器为客户端提供静态内容。

  • 这个网站有很多流量。
  • 在高流量时,我每秒有大约 10 个请求(html、css、js、图像)。
  • 每个 HTML 向服务器发出 30 个其他请求以加载 js、css 和图像。
  • Safari 开发者工具显示,每次我点击一个 html 页面时,其中的 2MB 正在传输
  • 这两台服务器运行在Amazon Web Service
  • 两个实例都是 m1.large(2 CPUS,7.5 RAM)
  • 我在同一台服务器上提供图片
  • 服务器在美国,但大量流量来自欧洲

我试过了

  • 从 prefork 更改为 worker
  • 增加进程
  • 增加线程数
  • 增加超时

我正在使用 ab (apachebench) 运行基准测试,但没有看到任何改进。

我的问题是:

  • 提供图像和大型资源(如 js (400k))是否可能会降低服务器速度?
  • 是否有可能每台服务器每秒 5 个请求只是流量太大而我无法进行调整,所以唯一的解决方案是添加更多服务器?
  • amazon web services 带宽有问题吗?

新信息

正在从 GlusterFS 上的挂载目录读取我的文件

使用 ab(apache bench)收集的指标在同一网络上的 EC2 实例上运行

Connections: 500
Concurrency: 200

Server with files on mounted directory (files on glusterfs)
    Request per second: 25.26
    Time per request: 38.954
    Transfer rate: 546.02

Server without files on mounted directory (files on local storage)
    Request per second: 1282.62
    Time per request: 0.780
    Transfer rate: 27104.40

新问题

从挂载目录(NFS 或 GlusterFS)读取资源(htmls、js、css、图像)是否可能会显着降低 Apache 的性能?强>

谢谢

【问题讨论】:

  • 提供实际的基准可能会有所帮助...:P
  • 可能有助于在此处链接您的网站,因为在网站性能优化方面经验丰富的人可能会在查看您的来源后立即提出任何建议。
  • 如何对两台服务器之间的工作进行负载均衡?您在使用弹性负载均衡器吗?您是否将两台服务器都托管在同一区域?您是否尝试在欧洲地区设置其中之一?
  • 我们在美国地区都有弹性负载均衡器

标签: amazon-web-services apache


【解决方案1】:

提供大量静态资源绝对有可能(并且确实很可能)会降低您的服务器速度。在下载这些内容中的每一个的整个过程中,您都必须打开 Apache 工作线程。文件越大,下载的时间越长,您需要保持线程打开的时间就越长。在达到为 Apache 设置的任何类型的内存限制之前,您可能已经达到最大线程限制。

首先,我建议您将所有静态内容从您的服务器上移到 Cloudfront 或类似的 CDN 中。这将使您的 Web 服务器只需要担心主要的 Web 请求。这可能会使每秒请求数(以及相关的打开 Apache 线程数)从 10 个请求/秒降低到 0.3 个请求/秒(基于您的主要请求与次要内容请求的 30:1 比率)。

将您正在服务的请求数量减少一个数量级以上肯定会提高服务器性能,并且可能允许您减少到单个服务器(或者如果您仍然需要多个服务器 - 这是一个好主意)可能会减少服务器的大小。

您会发现,基本上所有大容量网站都有一个共同点,那就是它们将提供静态内容的业务留给了 CDN。一旦你达到了成为一个大容量站点的地步,你必须绝对考虑这一点(或者至少使用 Nginx、Lighty 或其他一些比 Apache 更适合提供静态内容的 Web 服务器从不同的服务器提供静态内容)。

卸载静态流量后,您就可以真正开始考虑调整 Web 服务器以处理主要请求了。当你达到这一点时,你需要知道一些事情:

  • 单个请求线程的平均内存使用率
  • 您分配给 Apache 的内存量(如果这是专用的 Apache 服务器,可能是整个实例内存的 70-80%)
  • 您的应用程序响应请求所花费的平均时间

基于此,这是一个非常简单的公式,可以作为调整最大线程设置的良好起点。

假设您有以下情况:

Apache memory: 4000KB
Avg. thread memory: 20KB
Avg. time per request: 0.5 s

这意味着您的配置可以按如下方式处理请求吞吐量:

100 requests/second = 4000kb / (20kb * 0.5 seconds/request )

由于每个请求的平均时间为 0.5 秒,因此您可以假设需要 50 个线程来处理此吞吐量。

显然,您可能希望将最大线程数设置为高于 50 以解决请求峰值等问题,但至少这为您提供了一个很好的起点。

【讨论】:

  • CloudFront 应该可以解决您的大部分问题。
【解决方案2】:
  1. 尝试启动/停止实例。这会将您转移到其他主机。如果您的实例所在的主机有任何问题,这将缓解问题。
  2. 除了检查系统负载数之外,还要查看内存使用情况、IO 和 CPU 使用情况。
  3. 查看您的系统日志,看看是否有任何产生的错误可以解释当前情况。

结帐 Eric J. 在此线程中回答 Amazon EC2 Bitnami Wordpress Extremely Slow

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2015-04-03
    • 2020-06-22
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多