嗨,我在一台 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-fcgid
和libapache2-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 搜索