无法维持 1GB RAM Centos 服务器的运行

无法维持 1GB RAM Centos 服务器的运行

这是我第一次配置 VPS 服务器,遇到了一些问题。我们在一台按照互联网配置的 1GB Centos 服务器上运行 Wordpress(在线研究)。没有自定义查询或任何疯狂的操作,但帖子数量接近 8K。在任意时间间隔,服务器就会宕机。从客户端来看,它只是显示“正在加载...”,然后或多或少会无限期地旋转。在服务器端,shell 将完全锁定。我们必须从控制面板进行硬重启,然后一切都会好起来。

通过观察“top”,我发现内存使用率一般徘徊在 35% - 55% 之间,偶尔会飙升至 80% 左右。当我看到它下降时,大约有 30 - 40 个 Apache 进程显示内存超出了极限。“error_log”告诉我每次重启实例之前都会达到 maxclients。我试过修改它,但无济于事。

我认为我们可能需要将服务器提升到下一个 RAM 级别,但由于每月的页面浏览量约为 120K,这似乎有点过度,因为它之前在共享服务器上运行得相当好。

有什么想法吗?要添加 httpd.conf 和 my.cnf 值吗?如果有帮助的话,我会用当前的值更新它。

提前致谢!这是一次有趣且重要的学习经历,但总体而言,相当令人沮丧!

编辑:快速顶部快照:

top - 15:18:15 up 2 days, 13:04,  1 user,  load average: 0.56, 0.44, 0.38
Tasks:  85 total,   2 running,  83 sleeping,   0 stopped,   0 zombie
Cpu(s):  6.7%us,  3.5%sy,  0.0%ni, 89.6%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   2051088k total,   736708k used,  1314380k free,   199576k buffers
Swap:  4194300k total,        0k used,  4194300k free,   287688k cached

答案1

如果你的服务器无法处理 30-40 个 httpd 进程(它不能),那么就不要让它运行。我在我对这个问题的回答。我给出的示例适用于 512 MiB VPS,因此不要只是盲目地“按照互联网”复制配置。:)

简短版本:缩减 httpdMaxClientsServerLimit变量以防止 30 多个 httpd 进程启动。我会从 10 或 15 开始,具体取决于进程的平均大小以及您为 MySQL 提供了多少空间。请注意,当所有客户端进程都很忙时,httpd 的行为将是拒绝请求。

答案2

检查发生锁定时是否正在使用任何交换内存(free 和 vmstat)。如果将 MaxClients 设置得太高,则在流量高峰期间会发生内存使用量和服务器负载缓慢增加,直到 RAM 用完并开始使用交换。这会导致 Apache 客户端开始加载到交换内存/从交换内存加载,这只会降低性能,服务器负载猛增,服务器“锁定”。

理想情况下,您希望设置 MaxClients 以便您永远不会开始使用交换内存。确切的数量取决于您的 Apache 设置和您正在提供的内容。由于您在流量高峰期间看到 30-40 个进程,所以我会从 30 左右开始,看看这是否能阻止交换使用(假设这是问题的根源)。

答案3

看起来你的系统鞭笞

为了调试它,我首先要禁用交换。这样,您将遇到内存不足错误,而不是由于不断换入和换出内存页面而导致的锁定。然后,您将更容易看到导致您出现问题的原因。

我还会:

  • 限制可用的 PHP 内存 — php.ini 中的 memory_limit 选项为 64MB
  • 将 MaxClients 限制为 10 左右;

这将强制您的 Apache 使用不超过 700MB 的内存(10*64+httpd 内存)。如果脚本需要更多内存,它只会失败,而不会导致服务器瘫痪。

当你发现问题所在时,你可以启用交换。但不要超过 RAM 的 1/4。这样,未使用的内存就可以被交换出去,但不足以导致系统抖动。

相关内容