在 512mb VPS 上在 Varnish 后面配置 HTTPD

Dav*_*d W 3 httpd varnish

我在具有 512mb RAM 的专用 VPS 上为客户托管一个网站。在过去的 2 周内,由于 0% 的空闲内存(或空闲交换),它已经两次停机。该站点非常依赖数据库,因为它运行具有 60 多个模块的 Drupal。平均而言(根据网站所有者的说法),每月大约有 6,000 名访问者(约 200 人/天)。不过,它可能会增长得相当快——它刚刚推出不到一年。

所以我坐下来终于掌握了对 Apache 的理解。我以前手动配置过 httpd.conf,但还没有完全理解所有的复杂性。

我了解到我应该通过 MaxClients 以 Mb 为单位计算我的平均 Apache 进程大小,并且这个数字不应该超过系统可用的内存。根据 Top 的说法,每个进程大小都略低于 7%(这大约是 1.4Mb,对吧?)。512/1.5 = 341...这对我来说似乎非常大。我误解了什么吗?起初,我认为我应该按百分比(在本例中为~7)来计算进程大小。也许我第一次是对的?

这为其他操作系统进程提供了一点空间。

数据库 (MySQL) 在同一台主机上。

我的问题是双重的。1) 我正在考虑安装 Varnish 以帮助减少数据库负载(几乎所有访问者都未经身份验证),加快初始响应时间等......对于一个只有这么少内存的系统,我疯了吗?如果我这样做,我正在考虑给它 256Mb。想法?显然,事情不会在缓存中停留很长时间。256/7 = ~36 页。然而,我希望“主要”页面将被缓存。主页和主页后面的一些主要页面将占用大量数据库,我想尽可能减少磁盘 IO 量。

2) 如果我确实安装了 Varnish,我想知道是否应该将 Apache 设置调整为当前设置的一半,因为我已经给了 Varnish 一半的内存。在这种低级配置中,Varnish 和 Apache 之间是什么关系?

hob*_*ave 14

您需要获得更大的 VM。您开始发帖告诉我们,由于内存耗尽和交换,您的虚拟机现在已经“托管”了两次。添加另一个受益于大量内存的应用程序对您的情况有何帮助?不会。

让我们分解您的小虚拟机及其内存使用情况。

首先,您有 512 MB 的 RAM。取其中的 100 到 125 MB(20-25%)并将其从您的计算中完全删除。您的内核需要此 RAM,支持进程、缓冲区和缓存。这为您留下了 400 MB 的 RAM(拆分差异)。

MySQL

假设您想使用 400 MB 的一半,给 MySQL 200MB。让我说清楚,我不熟悉 Drupal 的要求,也不熟悉它是否使用 MyISAM 或 InnoDB。如果您正在配置 InnoDB,您将使用该innodb_buffer_pool_size变量并将其设置为 200M。您可以期望 MySQL 使用更多的东西,例如查询缓存(如果使用)、打开表、连接处理、线程跟踪、排序缓冲区、连接缓冲区和无数其他配置选项。如果您使用的是 MyISAM,则情况会更加复杂,因为涉及的变量要多得多,key_buffer而且myisam_sort_buffer只是其中的两个。因此,假设 InnoDB 有 200Minnodb_buffer_pool_size并且查询缓存被禁用,假设MySQL 消耗 216 MB 的 RAM。

阿帕奇

您现在有 184 MB 的 RAM 可供 Apache 使用。首先,让我们花点时间澄清一下您问题中的一些真正令人困惑的事情。

我了解到我应该通过 MaxClients 以 Mb 为单位计算我的平均 Apache 进程大小,并且这个数字不应该超过系统可用的内存。

没有。当您的站点正在使用时,您会观察到您的平均 httpd 进程大小。使用每个 httpd 进程的平均大小(假设 prefork MPM,默认值),您可以计算出多少,MaxClients这样您就不会超过分配给 httpd 或机器的内存,从而导致它交换。

根据 Top 的说法,每个进程大小都略低于 7%(这大约是 1.4Mb,对吧?)。512/1.5 = 341...这对我来说似乎非常大。我误解了什么吗?

是的,你是。首先,停止使用百分比来“计算”httpd 进程的大小。


编辑

等待!什么?512 的 7% 是 35.84。我不确定你从哪里得到 1.4 Mb。我的答案仍然成立,我不会调整我的答案来补偿您的 35M httpd 进程。

结束编辑


httpd 进程的大小清楚地RES列在顶部的列下方。例如:

top - 21:48:44 up 168 days,  4:46,  1 user,  load average: 0.02, 0.09, 0.08
Tasks:  66 total,   2 running,  64 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2072832k total,  1994784k used,    78048k free,   407976k buffers
Swap:   787176k total,      300k used,   786876k free,  1321988k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       
 8725 mysql     20   0  729m  69m 3396 S  0.0  3.4  53:45.84 mysqld                                                                                                         
22217 apache    20   0  161m  17m 7960 S  0.0  0.9   0:08.42 apache2                                                                                                        
26193 apache    20   0  161m  16m 6944 S  0.0  0.8   0:00.26 apache2                                                                                                        
 4470 apache    20   0  161m  16m 6948 S  0.0  0.8   0:01.52 apache2                                                                                                        
 6193 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.35 apache2                                                                                                        
 4014 apache    20   0  161m  15m 6616 S  0.0  0.8   0:01.48 apache2                                                                                                        
 6939 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.48 apache2                                                                                                        
 6685 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.32 apache2                                                                                                        
26146 apache    20   0  161m  15m 6604 S  0.0  0.8   0:00.38 apache2                                                                                                        
 6443 apache    20   0  161m  14m 5712 S  0.0  0.7   0:01.38 apache2                                                                                                        
26450 apache    20   0  161m  14m 5704 S  0.0  0.7   0:00.19 apache2                                                                                                        
 2524 root      20   0  159m  13m 5524 S  0.0  0.6   0:03.34 apache2   
Run Code Online (Sandbox Code Playgroud)

从技术上讲,每个进程使用的内存是RESSHR(共享)的区别。这是因为SHR其他进程共享内存。您可以在我向您展示的示例中看到,对于我的独特用例,平均大约 9 MB 。这只是一台运行 Cacti 的机器,几乎没有流量——如果我碰巧看到它,每天可能有 5-10 次点击。我怀疑 Drupal 使用的内存如此之少,但您可以轻松辨别。它肯定使用了超过 1.4 MB 的空间。

现在,让我们假设您的 httpd 进程每次将使用甚至 10 MB 的 RAM,这是一个非常不切实际的假设。为 Apache“分配”了 184 MB 的 RAM,这使您的 MaxClients 为 18(10 MB * 18 = 180 MB)。低于341。

首先,让我们评估服务器的当前状态。假设您正确配置了 MySQL 和 httpd 以使其不会在负载下交换,那么您正在运行一个非常贫乏的MySQL 配置和一个 httpd 配置,如果您收到超过 18 个并发请求,它将开始拒绝请求。按照任何标准,这台机器都无法处理“增长非常快”的流量。

现在您想添加第三个应用程序并为其分配 256MB 的 RAM?!该 RAM 必须来自 MySQL 或 Apache,也许您可​​以从操作系统本身窃取一些。无论哪种方式,您都将进一步在您的机器上添加一项核心服务。

这在技术上是可能的,你可以找到的清漆,Apache和MySQL的配置设置在同一主机上的甜蜜点,允许所有以理想的效率运作只是RAM的适量,但我怀疑。

解决方案

使用我教过的有关正确配置 MySQL 和 Apache 的知识来做到这一点:正确配置它们。您MaxClients应该离 300 不远,很可能不到 20,很可能不到 10。我没有提到的另一件事是,当 httpd 进程“达到峰值”远高于平均值时,它们可能有点不愿意放弃 RAM。例如,如果一个 httpd 工作器为单个请求达到 20MB,该工作器将无限期地继续使用 20MB(afaik),直到它被收割。您可以通过降低MaxRequestsPerChild设置来解决此问题。降低这意味着更频繁地获得子进程。这会降低负载下的性能(分叉新进程相对昂贵),但它有助于保持内存使用可管理。

正确配置您的服务器不应该交换。如果您正确配置了您的服务器并且您看到诸如负载下的连接被拒绝等问题,那么我建议您要么扩展您的 VM,要么考虑在单独的专用 VM 上添加 Varnish 。

通过阅读文档和在线寻求帮助,您的开端是正确的。如果您遇到困难或需要深入帮助,请随时在另一个问题中提问,但不要忘记先搜索!你很有可能在另一个中找到你的答案。