我在使用 Apache Web 服务器时遇到了一些 CPU 和内存使用问题。
我们在虚拟机上运行Ubuntu Server 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
):
- 核心模块(静态)
- log_config_module(静态)
- logio_module(静态)
- mpm_prefork_module(静态)
- http_module(静态)
- so_module(静态)
- 动作模块(共享)
- 别名模块(共享)
- authz_host_module(共享)
- deflate_module(共享)
- dir_module(共享)
- env_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 缓存 7.x-1.0-beta4
- 提升 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
- 元标记快速 7.x-2.7
- 时事通讯 7.x-1.0-beta9
- 选项元素 7.x-1.9
- 页面样式 7.x-1.0
- 面板 7.x-3.3
- Pathauto 7.x-1.2
- 病理 7.x-2.11
- profile2 7.x-1.3+0-dev (2013-mai-24)
- 选择或其他 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
- 网络表格 7.x-3.19
- 网络表单验证 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 扩展。请告诉我。
那是真实内存还是虚拟内存?老实说,这不是很多。更重要的是,您应该专注于解决导致问题的事情,而不仅仅是您“认为”应该有所不同的事情。
如果您希望 Apache 进程占用更少的内存,您应该禁用模块(因为每个模块都是需要在内存中的更多代码)。但是,如果您需要已启用的所有模块,那么,就是这样。
我在管理内存受限的机器时使用的一种方法是将某些任务移出 Apache 并移到其他服务器中,这样我就可以单独调整它们。
但更简单的方法是改变
对您的工作量更合理的东西:
我稍后再谈,但如果你只处理 33 个并发请求,你就不需要 120 个工人!
您可能应该分别调低到 5
MinSpareServers
和MaxSpareServer
10 之类的值。没有必要让 30 名工人无所事事。现在,回到
如果您有 33 个并发请求,但您每分钟只执行 70 个,则有两种可能性:
如果 #1 是这种情况,我真的不知道如何提供帮助 -出乎意料的错误,所以我什至不知道从哪里开始告诉你从哪里开始寻找。
如果它是#2,我猜你正在从你的服务器提供你所有的静态资产(图像、js、css、字体)。最好将它们放在 CDN 上,但如果你真的做不到,你可以在它们上设置超长的缓存时间并重新打开 Varnish。如果您将 Apache 进程与 PHP 和一大堆其他东西一起使用只是为了提供静态文件,那么您就是在浪费资源 - 使用更简单的方法来做到这一点!
这是一个常数,还是仅在您为请求提供服务时?
磁盘 I/O 看起来如何 (
iostat -mhx 2
)?MySQL 在做什么(show processlist;
)?对于您所描述的内容,您的服务器功能非常强大。这是个好消息,因为这意味着您应该能够解决此问题。
我遇到了同样的问题。将您的 Web 内容下载到本地计算机并使用更新的防病毒软件扫描内容。就我而言,罪魁祸首是木马病毒。在清除我的网页内容中的病毒后,我的问题得到了解决。