我正在为拥有512MB内存的专用VPS托pipe一个客户端的网站。 在过去的两周内,由于0%的可用内存(或免费交换),它已经两次平仓。 该网站是相当密集的数据库,因为它运行与60多个模块的Drupal。 平均而言(根据网站所有者),每月约有6000访客(〜200 /天)。 它可能会相当迅速地增长 – 它不到一年前才推出。
所以我坐下来终于理解了Apache。 我之前已经手工configuration了httpd.conf,但没有完全理解所有的错综复杂。
我知道我应该用MaxClients来计算我的平均Apache进程大小,而这个数字不应该超出系统可用的内存。 根据Top的说法,每个进程的大小都小于7%(大概是1.4Mb,对不对?)。 512 / 1.5 = 341 …这对我来说似乎非常大。 我误解了什么? 起初,我认为我应该用百分比来计算工艺尺寸(在这种情况下,〜7)。 也许我第一次是对的?
这为其他操作系统进程提供了一点空间。
数据库(MySQL)在同一个主机上。
我的问题是双重的。 1)我正在考虑安装Varnish以减less数据库负载(几乎所有的访问者都是未经validation的),加快初始响应时间等等。对于这种less量内存的系统,我疯了吗? 我正在考虑给它256Mb,如果我这样做。 思考? 显然,事情不会长时间停留在caching中。 256/7 =〜36页。 然而,我希望这个“主要”页面能够被caching。 主页和主页背后的一些主要页面将会非常密集的数据库,我想尽可能地减less磁盘IO的数量。
2)如果我安装了Varnish,我想知道是否应该将Apache设置调整为目前的一半,因为我已经给了Varnish一半的内存。 在这个低级configuration中,Varnish和Apache之间有什么关系?
你需要一个更大的虚拟机。 你开始发布信息,告诉我们你的虚拟机现在已经两次了,因为内存耗尽和交换。 如何添加另一个从大量内存中获益的应用程序可以帮助您的情况? 它不会。
让我们分解一下你的小虚拟机和内存使用情况。
首先,你有512 MB的RAM。 取100到125 MB(20-25%),并将其完全从计算中删除。 内核需要这个RAM,支持进程,缓冲区和caching。 这给你400 MB的RAM(拆分差异)。
假设你想使用你的400 MB的一半,给MySQL 200MB。 让我说清楚,我不熟悉Drupal的要求,或者是否使用MyISAM或InnoDB。 如果你正在configurationInnoDB,你可以使用innodb_buffer_pool_sizevariables,并将其设置为200M。 但是,MySQL可以使用比查询caching(如果使用),打开的表,连接处理,线程跟踪,sorting缓冲区,连接缓冲区以及无数其他configuration选项等更多的东西。 如果你使用的是MyISAM,它会变得更加复杂,因为涉及到更多的variables, myisam_sort_buffer和myisam_sort_buffer只是其中的两个。 因此,假设InnoDB具有200M的innodb_buffer_pool_size并且查询caching被禁用,让我们假设MySQL使用216 MB的RAM。
您现在有184 MB的RAM供Apache使用。 首先,让我们花一点时间来澄清你的问题中一些令人困惑的事情。
我知道我应该用MaxClients计算我的平均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
从技术上讲 ,每个进程使用的内存是RES和SHR (共享)的差异。 这是因为SHR是其他进程共享的内存。 你可以看到我给你看的例子,平均大概是9MB,这是我独特的用例 。 这只是一台运行仙人掌的机器,几乎没有任何交通 – 如果我碰巧看到它,每天可能会有5-10次点击。 我很怀疑Drupal是否利用了这么小的内存,但是你可以很容易的知道。 它绝对使用远远超过1.4 MB。
现在,让我们假设你的httpd进程每次都会使用10MB的内存,这是非常不现实的 。 有184 MB的RAM分配给Apache,这会给你一个18的MaxClients(10 MB * 18 = 180 MB)。 远远低于341。
首先,让我们来评估你的服务器的当前状态。 假设你正确地configuration了MySQL和httpd以便在加载时不交换,你正在运行一个非常贫乏的 MySQLconfiguration和一个httpdconfiguration,如果你有超过18个并发请求,它将开始拒绝请求。 按照任何标准,这台机器都无法处理“增长非常快”的stream量。
现在你想添加第三个应用程序并为其分配256MB的RAM? 那RAM将不得不来自MySQL或Apache,也许你可以逃脱一些从操作系统本身。 无论哪种方式,你进一步嘲笑你的机器上的核心服务之一。
从技术angular度来说,您可以在同一个主机上findVarnish,Apache和MySQLconfiguration设置的最佳位置,这样就可以以合适的RAM数量以理想的效率运行,但是我很怀疑。
使用我教过的关于正确configurationMySQL和Apache的方法:正确configuration它们。 你的MaxClients应该远不到300,很可能在20以下,很可能在10以下。另外一个我没有提到的事情是,httpd进程可能有点不情愿放弃内存时,他们已经“高峰”远高于平均水平。 例如,如果一个httpd工作者为一个请求命中了20MB,那么这个工作者将无限期地继续使用20MB(afaik)直到获得。 您可以通过降低MaxRequestsPerChild设置来解决这个问题。 降低这意味着subprocess收获更频繁。 这会降低你的负载性能(分派新的进程相对昂贵),但是这将有助于保持内存使用的可pipe理性。
正确configuration你的服务器不应该交换。 如果你正确地configuration你的服务器,并且你看到负载下连接被拒绝等问题,那么我会build议你扩展虚拟机,或者考虑在单独的专用虚拟机上添加Varnish。
通过阅读文档和在线寻求帮助,您就是一个正确的开端。 如果您遇到困难或需要深入的帮助,请随时在另一个问题中提出问题,但不要忘记先查询! 很可能你可以在另一个地方find你的答案。