我在使用 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 个,则存在以下几种可能性:
- 您的每个请求大约需要 30 秒才能得到处理!
- 您的请求率不太稳定,并且大部分时间您什么都不做。
如果情况是 #1,我真的不知道该如何帮助——有些事情难以置信错,错得离谱,我甚至不知道该告诉你从哪里开始看。
如果是 #2,我猜你正在从服务器提供所有静态资产(图像、js、css、字体)。最好将它们放在 CDN 上,但如果你真的做不到,你可以为它们设置超长的缓存时间并重新打开 Varnish。如果你使用 Apache 进程和 PHP 以及一大堆其他东西来提供静态文件,那么你就是在浪费资源 - 用更简单的东西来做这件事!
我的问题是 CPU(所有核心)负载过高。大多数时候,负载达到 90% 到 100%!有问题的进程是 apache2。
这是一个常数吗?还是仅在您处理请求时才如此?
磁盘 I/O 看起来怎么样 ( iostat -mhx 2
)?MySQL 正在做什么 ( show processlist;
)?
您的服务器的性能远远超出了您所描述的水平。这是个好消息,因为这意味着您应该能够修复此问题。
答案2
我遇到了同样的问题。将您的网页内容下载到本地计算机,并使用更新的防病毒软件扫描内容。就我而言,罪魁祸首是特洛伊木马病毒。清除网页内容中的病毒后,我的问题就解决了。