我的 512MB Debian Rackspace VPS 的内存使用情况

我的 512MB Debian Rackspace VPS 的内存使用情况

嗨,我在一台 512MB Debian VPS 上运行 Apache2/PHP5/MYSQL 来为 Wordpress 网站提供服务。该网站非常繁忙,每天可能有超过 1000 次访问。该博客是一个新闻博客,提供图片、文本并允许评论。自从 2 天前转移到 VPS 以来,该网站因内存问题已停机两次。我运行了 Top 并得到以下结果:

Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.3%us,  0.1%sy,  0.0%ni, 97.2%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    517980k total,   458876k used,    59104k free,    12900k buffers
Swap:  1044216k total,     9060k used,  1035156k free,    87592k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
14087 www-data  20   0  302m  42m 3880 S   11  8.3   0:03.67 apache2
14086 www-data  20   0  299m  38m 3896 S    5  7.7   0:03.56 apache2
13779 mysql     20   0 68240  11m 6572 S    1  2.3   0:03.93 mysqld
14455 john      20   0 19072 1316 1000 R    0  0.3   0:00.13 top
    1 root      20   0  8356  604  572 S    0  0.1   0:00.42 init

我曾尝试优化 Mysql 和 Apache,但 Apache 似乎仍然占用了大量的内存 - 302M 虚拟内存和每个进程 42M 内存。

  • 这是正常的吗?
  • 我能做些什么来减轻 Apache 的负载?
  • 转向 worker-mpm 会带来很大的不同吗?

谢谢

更新

迁移到 worker mpm 后,我发现当服务器基本空闲时,内存使用量会增加。但这是我在网站上发布故事时 Top 的读数 -

Tasks: 237 total,   2 running, 230 sleeping,   0 stopped,   5 zombie
Cpu(s):  3.0%us,  1.1%sy,  0.0%ni, 29.8%id, 66.0%wa,  0.0%hi,  0.0%si,  0.1%st
Mem:   1042268k total,   764492k used,   277776k free,     6304k buffers
Swap:  2096472k total,  1275928k used,   820544k free,    49472k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13520 www-data  20   0  265m  50m 4852 R   10  5.0   0:00.60 php-fcgi-wrappe
13282 www-data  20   0  246m  28m 2576 D    5  2.8   0:00.96 php-fcgi-wrappe
13081 www-data  20   0  247m  29m 2620 D    4  2.9   0:00.45 php-fcgi-wrappe
  953 mysql     20   0  198m  17m 2832 S    3  1.8   4:34.19 mysqld
13517 www-data  20   0  254m  40m 4620 S    3  4.0   0:00.46 php-fcgi-wrappe
13560 www-data  20   0  250m  36m 3380 S    1  3.6   0:00.32 php-fcgi-wrappe
13290 www-data  20   0  253m  35m 3712 D    1  3.5   0:01.08 php-fcgi-wrappe
13557 www-data  20   0  249m  36m 3300 S    1  3.5   0:00.32 php-fcgi-wrappe
13221 www-data  20   0  250m 9932 2008 D    1  1.0   0:00.68 php-fcgi-wrappe
13594 john      20   0 19208 1468 1000 R    1  0.1   0:00.05 top
  655 root      20   0  9140  996  876 S    0  0.1   0:01.39 xe-daemon
13232 www-data  20   0  197m 2876 1008 D    0  0.3   0:00.59 php-fcgi-wrappe
13281 www-data  20   0  134m 1772  516 D    0  0.2   0:00.03 php-fcgi-wrappe
13294 www-data  20   0  196m 2748  924 D    0  0.3   0:00.44 php-fcgi-wrappe
13296 www-data  20   0  212m 2412  892 D    0  0.2   0:00.57 php-fcgi-wrappe
15262 www-data  20   0  482m 6128 1288 S    0  0.6   0:15.39 apache2
    1 root      20   0  8356  600  572 S    0  0.1   0:01.02 init

如您所见,有很多进程正在运行,Apache 只有 6MB,PHP-FCGI-Wrapper 相当大,而且有很多进程。但有趣的是,我的整体可用内存比系统运行很少或什么都不做时要多。这是为什么?我还能做其他事情来减少使用的内存量吗?我读到 Nginx 是另一个选择,但我已经运行了 W3 Total Cache 插件、PHP APC、Mysql 查询缓存和 Cloudflare。Nginx 会帮助完成此设置吗?

谢谢

答案1

是的,这是正常的。我假设你正在运行 prefork mpm (mpm_prefork_module),在这种情况下,每个 Apache 进程都会加载所有库和模块。您的第一步应该是将它们减少到绝对最小值。然后,您需要计算出您可以承受的加载 Apache 进程数,并适当地设置 mpm 限制。

您可能需要考虑使用 worker mpm (mpm_worker_module) 假设您还没有这样做,但这需要额外的工作,因为 PHP 不是线程安全的。这通常意味着您需要最终将 PHP 作为 CGI 运行(使用类似 FastCGI 的东西)。

我看到你正在使用 Debian。Debian 附带两个 FastCGI 模块,即libapache2-mod-fcgidlibapache2-mod-fastcgi。我相信它们是二进制兼容的,但fcgid较新,与 配合使用效果更好suexec。因此,libapache2-mod-fcgid除非你知道出于某些特定原因需要libapache2-mod-fastcgi,否则你应该使用 。如果你读过关于的例子,libapache2-mod-fastcgi你可能只需使用 即可libapache2-mod-fcgid

不要同时安装它们——你可以这样做,但这样做毫无意义,而且只会造成混乱。你只需要一个。

基本上,Apache + PHP + wordpress 占用大量内存,您需要主动实施低内存设置,才能使其在 512MB 上可靠地运行。如果您还没有这样做,您还应该尽可能降低 mysql 的内存占用。

答案2

Linux 通常缓存数据的方式与 Windows 大不相同,它会抓住一切机会将内存用于缓存,因此从您的 top info 显示的内容来看,似乎第一次粘贴时使用了 87 mb 作为缓存,第二次粘贴时使用了 49 mb,这完全正常,当程序需要更多内存时,linux 会简单地从缓存中删除一些数据并将可用内存提供给程序,由于缓冲区的存在,这一过程可以顺利进行,因此,除非缓存不断减少到非常小的量,否则我不会对此过于紧张,但是从这些 cgi 进程来看,您可能需要稍微调整一下 php 安装,尽管这是特定于版本的,因此您最好使用 Google 搜索

相关内容