运行的 httpd 进程过多,导致 CentOS 服务器冻结

运行的 httpd 进程过多,导致 CentOS 服务器冻结

我在 Media Temple 托管的专用虚拟 16GB RAM CentOS 服务器上运行一个高流量网站。
服务器经常因为 CPU 使用率过高而死机(%1500)
当我使用“top”命令检查正在运行的进程时,我发现有太多 httpd 进程正在运行,我认为这是导致 CPU 使用率过高的原因。
我尝试过调整 mysql、调整 apache、my.cnf、httpd.cnf,删除了我不使用的 Apache 模块,但这并不能解决问题。
请告诉我您需要知道我的服务器配置中的哪些值,以帮助我诊断问题。
提前致谢。

答案1

tail -f /var/log/messages当您遇到高系统负载时会说什么?

您的进程是否非常耗费 I/O 或 CPU?

一个观察:

看起来您有 18G 物理内存,但交换空间为零......,例如您的top命令显示“Swap:0k total”...这意味着您没有配置任何交换空间。

一般来说,UNIX 系统上应该总是有足够的交换空间!交换大小 = 1...2 倍 RAM 大小是个好主意。使用快速分区是个好主意。如果你的 UNIX 系统内存不足,并且没有 Swap,那么就会发生非常糟糕的事情.. 进程莫名其妙地死掉了.. 这真是太糟糕了!尤其是在生产中。磁盘很便宜!添加一个大容量的交换分区!:-) 或者最坏的情况是,您也可以稍后创建交换文件。

在任何 UNIX 系统上,您都需要交换空间 —— 因为当进程未被安排在某个 CPU 上时,交换空间就是进程的驻留空间。如果您没有交换空间,那么就会发生非常糟糕的事情,因为您的系统将用尽空间(RAM)来创建新进程 —— 它无法将它们放在交换空间中,因为没有交换空间,因此您将看到极高的负载、系统冻结以及进程莫名其妙地死亡。

要检查正在使用的内存和交换空间,您可以运行free -k。 您还可以通过运行 . 来检查交换配置swapon -s。如果没有配置交换,这将不会显示任何输出。

根据经验,配置交换空间大约为物理内存大小的 1..2 倍。 我想说如果你有 18G RAM,配置~20..30G 交换空间——不要吝啬交换空间,因为“磁盘非常便宜”!

免责声明:有一些例外情况,您可以不使用交换,但另一方面,配置并且不需要它也不会有什么坏处!:)

创建交换空间的两种选择:

  • 创建一个交换分区,最好是在最快的磁盘分区上(最佳选择;或者在物理服务器上添加一个闪存驱动器)

  • 或者创建一个交换文件(如果您没有剩余的磁盘空间进行分区;如果您后来发现您需要比预期更多的交换,这也是一个不错的选择)

...然后格式化该交换分区或交换文件以使其可用于使用该mkswap命令进行交换。

一旦您使用 启用交换空间sudo swapon -a,您就会看到它在top和 中列出swapon -s,并且您的系统应该运行得更加良好。

有关交换空间的文章:

https://www.linux.com/news/software/applications/8208-all-about-linux-swap-space

https://www.linux.com/learn/tutorials/442430-increase-your-available-swap-space-with-a-swap-file

http://www.cyberciti.biz/faq/linux-add-a-swap-file-howto/

http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/

http://lissot.net/partition/partition-08.html

http://tldp.org/LDP/sag/html/swap-space.html

一些指示:

man -k swap

man mkswap

man fstabvim /etc/fstab


编辑

因为这个问题被迁移到了 ServerFault... 我会在这里添加一条评论,因为人们抱怨我引用了旧规则:“ 1..2 倍 RAM 大小 == 交换大小 ”

如今,2TB SATA 硬盘的价格约为 70 美元,这意味着 20GB 的价格约为 70 美分——非常便宜!我知道 20GB 听起来很多,但可以将其视为非常便宜的“最坏情况保险”!

有人说:“如果你的系统已经占满了 18GB,并且要交换到 20GB,那么你的问题就更大了”

当然是真的,但如果出现意外情况,拥有充足的交换空间将使您的服务器及其上的进程免于完全崩溃!您仍然可以登录、在系统仍在运行时检查系统(速度很慢)并修复问题(尽管速度很慢),而不必重新启动。在生产服务器上,没有理由不使用充足的交换空间。

如果我有一台具有 18GB RAM 的服务器,并且它正在运行 MongoDB(这非常占用 RAM).. 我肯定会配置非常宽敞的交换空间,甚至可能是 40..60GB ... 以防出现意外问题..

答案2

20GB - 30GB 的交换空间非常高。如果您在 Linux 中交换 20GB,则问题会更大。

答案3

几乎可以肯定的是,您的机器内存不足,因为有太多“肥胖”的 Apache 进程执行很少或根本不执行任何工作。

Apache 通常使用“prefork”模型。PHP 通常在进程内运行。这可能会带来问题,因为:

  • PHP 导致 apache 子进程各自使用大量内存。
  • 通过慢速连接提供静态文件,无缘无故地让子进程长时间处于使用状态
  • 如果打开,HTTP keepalives 也会保持子进程处于使用状态。

一个“糟糕”的解决方案是关闭 keepalive(或者减少 keepalive 时间)。请注意,keepalive 对性能非常有利,尤其是在 HTTPS 上。

一个“更好”的解决方案是切换到更好的架构。更好的架构是不会浪费“胖”进程无所事事的架构。更好的架构的典型实现是 Nginx + PHP/FastCGI。

我不一定提倡使用 Nginx - 如果您运行不同的 MPM(多处理模块,例如 worker、event,而不是 prefork)并使用 FastCGI 将 PHP 移出进程,那么您也可以使用 Apache 来做到这一点。

答案4

就你的情况而言,你不需要交换。如果你愿意,你可以创建 1-2GB 的交换分区或文件,以便为文件系统缓存提供更多的物理内存。

我不明白为什么缓存内存和缓冲区内存为 0。你能粘贴输出吗cat /proc/meminfo

您的 I/O 负载非常高。这可能是磁盘或网络负载。尝试降低负载。对于磁盘,请使用noatime. Try to find out which process is most I/O intensive. Useiotop anddstat` 挂载数据分区。

尝试升级磁盘控制器和网卡的固件和驱动程序(内核模块)。如果您正在运行虚拟机,请确保安装半虚拟化驱动程序(例如 VMware Tools)。如果您正在运行带有 PAE 的 32 位内核,请尝试切换到 64 位发行版(这将减少内核时间)。

相关内容