在 APC+PHP 中,多少 RAM 才算太多?将 apc.shm_size 设置为几 GB 可以吗?

在 APC+PHP 中,多少 RAM 才算太多?将 apc.shm_size 设置为几 GB 可以吗?

在我们的服务器上,我们拥有大量 RAM,足以满足我们的流量水平(16GB)。HTTP 进程经常会耗尽所有 CPU,甚至在接近使用交换内存之前就需要重新启动,因此我正在寻找使用 RAM 来减轻 Apache 负载的方法(和/或帮助可能破坏 Apache 的单独 MySQL 服务器)。

我在 HTTPD 实例上安装了许多 WordPress,因此 APC 有时会使用多达 900MB 的 RAM(根据 apc.php 图表)。以防万一,我将其设置apc.shm_size为 1600MB,这超出了它的需求,但不超过我可以腾出的容量。这意味着 APC 通常有很多额外的 RAM 可用,但周转率也非常低,碎片化率永远不会超过 1%。

这危险吗?我是否应该仅从原则上将 APC 精简到 1GB 以下?我是否应该期望 APC 内部出现一些人员流动,以降低其总体占用空间?

如此多的内存用于 APC 意味着在 top/htop 中,每个 httpd 进程在 VIRT 内存列中显示约 1.9GB。显然这是共享内存,不是每个进程使用的,但它会损害我们的服务器吗?

注意:服务器的问题尚不清楚,但影响是每天大约 60 次,所有 8 个 CPU 都占满 100%,一切都停止工作,直到 Monit 发现 Apache 已损坏并重新启动它(Monin 还保存了 MySQL 服务器)。我不确定 APC 是否是问题的一部分,但我正在尝试优化一切以防万一。

答案1

分配这么多空间通常都是多余的。在这种情况下,您可能会觉得有必要这样做,因为有各种不同的文件。更有用的方法是通过合并 Wordpress 安装来减少需要缓存的文件数量。无论如何,如果 APC 从未达到 1,000 MB 的使用量,那么分配超过这个数量就是多余的。

设置多少个 MaxClients 取决于服务器的繁忙程度,特别是 Apache 和其他程序的常驻部分的大小。使用 16GB 内存,即使其中一半分配给 Mysql(InnoDB 缓冲池 - InnoDB 比 MyIsam 更好地控制成员,即使要多一些内存),几百个 Apache 进程通常就足够了(我每天为每台服务器提供 1000 万次 PHP 点击,平均每次使用约 40 个进程)。

让 NginX 提供静态图像、css、JS 等,放置在 Apache 服务器前面(或在单独的 URL 上),也能减少更重的 PHP 服务器所需的工作 - 通常非常显著。 http://blogs.law.harvard.edu/djcp/2010/01/nginx-as-a-front-end-proxy-cache-for-wordpress/对此有一些想法,并且还有其他博客等将指导您在 Apache 之前安装 Nginx,无论是否涉及 Wordpress。

最后,KeepAlives 主要只会关闭繁忙的站点。现在建议关闭它们,以避免您经常看到的那种资源匮乏。例如,如果您设置了 100 个 MaxClients 和 30 秒的 KeepAlive,那么 30 秒内只有 100 个访问者会占用所有 Apache 插槽,您无法提供任何其他服务。 KeepAlive Off.

答案2

我认为,如果内存可用且其他地方不需要,分配那么多内存不是问题。你可以做的一件事是更好地利用 APC,即使用 WordPress 对象缓存,例如W3 总缓存或 Mark Jaquith 的APC 对象缓存插件

对于您的 CPU 问题,我会查看您的 MaxClients 和 MaxRequestsPerChild。它们可能设置得太高。另外,请查看您的 KeepAliveTimeout 设置,确保它不太高。

答案3

我认为您可以为 APC 分配任意多的内存。APC 用于缓存操作码的内存不会被文件系统用于缓存读取的文件。

为了减少 CPU 负载,您可以在资源(css、js、图像)上配置过期时间。在 apache 上安装 mod_expire 并使用 .htaccess 根据需要定义过期标头。如果不这样做,浏览器会检查文件是否已更改,即使它们已在缓存中。这会产生大量点击并消耗 CPU 周期。

使用 wordpress 的 les 实例也很好。

但最好的改进是检查 wordpress 站点的编码方式。插件需要大量资源。有时用户会为了某些愚蠢的事情而安装它们,例如将 Google Analytics 代码包含在页脚中,而这些代码可以嵌入在 footer.php 模板文件中。

相关内容