Apache 消耗过多 CPU 和内存

Apache 消耗过多 CPU 和内存

我在使用 Apache Web 服务器时遇到了一些 CPU 和内存使用问题。

我们正在举办Ubuntu 服务器 12.04 LTS在虚拟机上。我们的服务器具有以下规格:

  • 8GB 内存;
  • 4 个 vCPU(12GHz(英文):

我们将服务器配置为运行基于 Drupal (7.23) 的网站。所以我们安装了Apache,PHP,MySQL...版本如下:

  • 阿帕奇 2.2.22;
  • PHP 5.3.10(PHP 作为 Apache 模块运行。(英文):
  • APC 3.1.7;
  • MySQL 5.5.31(所有 innodb 表);

我正在运行一些Apache 模块也。看一下 ( apachectl -M) :

  • core_module (静态)
  • log_config_module (静态)
  • logio_module (静态)
  • mpm_prefork_module (静态)
  • http_module (静态)
  • so_module (静态)
  • action_module (共享)
  • alias_module(共享)
  • authz_host_module(共享)
  • deflate_module(共享)
  • dir_module(共享)
  • env_module(共享)
  • include_module(共享)
  • mime_module(共享)
  • php5_module(共享)
  • proxy_module(共享)
  • proxy_http_module(共享)
  • reqtimeout_module(共享)
  • rewrite_module(共享)
  • setenvif_module(共享)
  • ssl_module(共享)
  • status_module(共享)

apache2.conf,我们有这个配置:

    Timeout 90
    KeepAlive On
    MaxKeepAliveRequests 80
    KeepAliveTimeout 5
    HostnameLookups Off
    LogLevel warn

    <IfModule mpm_prefork_module>
        StartServers          10
        MinSpareServers       10
        MaxSpareServers       30
        MaxClients           120
        MaxRequestsPerChild 1000
    </IfModule>

虚拟主机我的网站:

    <VirtualHost *:80>
        ServerName blabla.bla.bla
        ServerAdmin [email protected]
        DocumentRoot /l/disk0/site/public_html

        <Directory />
            AllowOverride None
        </Directory>

        <Directory /l/disk0/site/public_html>
            Options MultiViews Indexes Includes FollowSymLinks ExecCGI
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

        LogLevel warn
        ErrorLog "/l/disk0/site/logs/apache/site/error.log"
        CustomLog "/l/disk0/site/logs/apache/sit/access.log" combined
        SSLProxyEngine on
        RewriteEngine   on
        RewriteLog     logs/rewrite_www_log
        RewriteLogLevel        0

        Include rewrites-www.conf
</VirtualHost>

Drupal 模块:

  • ACL 7.x-1.0
  • APC - 替代 PHP Cache 7.x-1.0-beta4
  • Boost 7.x-1.0-beta2
  • 缓存过期 7.x-2.0-beta2
  • 验证码 7.x-1.0
  • 混沌工具套件(ctools)7.x-1.3
  • 日期 7.x-2.6
  • 域访问 7.x-3.10
  • 域名阻止 7.x-2.0
  • 域 CTools 7.x-1.3
  • 域区域设置 7.x-1.0-beta3
  • 域名分类 7.x-3.x-dev (2012-abr-29)
  • 域视图 7.x-1.5
  • 嵌入视图显示 7.x-1.2
  • 实体 API 7.x-1.2
  • 实体引用 7.x-1.0
  • IMCE 7.x-1.7
  • IMCE Mkdir 7.x-1.0
  • 国际化 7.x-1.10
  • 链接 7.x-1.1
  • 本地化更新 7.x-1.0-beta3
  • 媒体 7.x-1.3
  • 元标签 quick 7.x-2.7
  • 新闻通讯 7.x-1.0-beta9
  • 选项元素 7.x-1.9
  • 页面样式 7.x-1.0
  • 面板 7.x-3.3
  • 路径自动 7.x-1.2
  • 病理 7.x-2.11
  • profile2 7.x-1.3+0-dev (2013-mai-24)
  • select_or_other 7.x-2.19
  • sheetnode 7.x-1.0-beta4+3-dev (2013-mai-25)
  • SMTP 身份验证支持 7.x-1.0
  • 令牌 7.x-1.5
  • 音译 7.x-3.1
  • 变量 7.x-2.3
  • 视图 7.x-3.7
  • 每个角色的词汇权限 7.x-1.0
  • Web 表单 7.x-3.19
  • Web 表单验证 7.x-1.2
  • 工作台 7.x-1.2
  • 工作台访问 7.x-1.2
  • 工作台媒体 7.x-1.1
  • 工作台配置文件 7.x-1.1
  • xmlsitemap 7.x-2.0-rc2

我的网站很简单,访客不多。我指的是每天大概 500 名访客。Drupal 会占用这么多 CPU 吗?或者它是一个模块?

另一个问题是内存使用情况。当创建一个进程时,会为 apache2 分配 80M。我认为太多了。

我的问题是 CPU(所有核心)利用率很高。大多数时候,使用率达到 90% 到 100%!有问题的进程是 apache2内存也被毫不留情地消耗。总共 8GB 内存,消耗的内存约为6.5GB 至 7.5GB。我不知道我的 apache 配置是否错误,或者我是否真的需要更多硬件(我想不是)。Drupal 会导致高 CPU 负载?

当 CPU 使用率达到 100% 时,网站就会瘫痪,我们必须重新启动 Apache。我使用 APC 和安装 Boost 对 Drupal 进行了解决方案。有一定的效果,但 CPU 利用率仍然很高。非常高。

如果您需要更多信息,例如 Drupal 模块和 PHP 扩展。请告诉我。

答案1

另一个问题是内存使用情况。当创建一个进程时,会为 apache2 分配 80M。我认为太多了。

那是真实内存还是虚拟内存?老实说,不是很多;更重要的是,您应该集中精力修复导致问题的东西,而不仅仅是您“认为”应该不同的东西。

如果您希望 Apache 进程占用更少的内存,则应禁用模块(因为每个模块都需要占用更多内存代码)。但如果您需要启用的所有模块,那么,好吧,就这样了。

在管理内存受限的机器时,我使用的一种方法是将某些任务从 Apache 移出并移到其他服务器,这样我就可以分别调整它们。

但一个更简单的方法是改变

MaxClients           120

对于你的工作量来说更合理的事情:

如果考虑重写访问和主站点流量,我们每分钟大约有 70 个请求。目前,我们有 33 个传入连接。

我稍后会回到这个问题,但如果您只处理 33 个并发请求,那么您不需要 120 名工作人员!

MaxClients           40

MinSpareServers您可能应该将和分别调低MaxSpareServer到 5 和 10 左右。没有必要让 30 名工人无所事事。

现在,回到

如果考虑重写访问和主站点流量,我们每分钟大约有 70 个请求。目前,我们有 33 个传入连接。

如果有 33 个并发请求,但每分钟仅执行 70 个,则存在以下几种可能性:

  1. 您的每个请求大约需要 30 秒才能得到处理!
  2. 您的请求率不太稳定,并且大部分时间您什么都不做。

如果情况是 #1,我真的不知道该如何帮助——有些事情难以置信错,错得离谱,我甚至不知道该告诉你从哪里开始看。

如果是 #2,我猜你正在从服务器提供所有静态资产(图像、js、css、字体)。最好将它们放在 CDN 上,但如果你真的做不到,你可以为它们设置超长的缓存时间并重新打开 Varnish。如果你使用 Apache 进程和 PHP 以及一大堆其他东西来提供静态文件,那么你就是在浪费资源 - 用更简单的东西来做这件事!

我的问题是 CPU(所有核心)负载过高。大多数时候,负载达到 90% 到 100%!有问题的进程是 apache2。

这是一个常数吗?还是仅在您处理请求时才如此?

磁盘 I/O 看起来怎么样 ( iostat -mhx 2)?MySQL 正在做什么 ( show processlist;)?


您的服务器的性能远远超出了您所描述的水平。这是个好消息,因为这意味着您应该能够修复此问题。

答案2

我遇到了同样的问题。将您的网页内容下载到本地计算机,并使用更新的防病毒软件扫描内容。就我而言,罪魁祸首是特洛伊木马病毒。清除网页内容中的病毒后,我的问题就解决了。

相关内容