我正在Media Temple主办的一个专用虚拟16GB RAM CentOS服务器上运行一个高stream量的网站。
很多时候,服务器因CPU使用率过高而死亡(%1500)
当我检查正在运行的进程使用“顶部”的命令,我看到太多的httpd进程运行,我认为是造成CPU的高使用率。
我试图调整mysql,调整apache,my.cnf,httpd.cnf,删除Apache模块,我不使用,但没有解决问题。
请让我知道你需要知道什么值在我的服务器configuration,以帮助我诊断问题。
提前致谢。
tail -f /var/log/messages在遇到高系统负载时会说什么?
你的进程是非常I / O还是非常密集的CPU?
一个观察:
看起来你有18G的物理内存,但是交换空间为零 ,例如你的top命令显示“Swap:0k total”…这意味着你没有configuration任何交换空间。
您应该始终在UNIX系统上拥有足够的交换空间! 交换大小= 1 … 2倍RAM大小是一个好主意。 使用快速分区是一个好主意。 真的不好的事情发生,如果你的UNIX系统内存不足,并没有交换 ..进程只是莫名其妙地死亡..这是一件坏事! 特别是在生产中。 磁盘很便宜! 添加一个慷慨的交换分区! 🙂
在任何UNIX系统上,您都需要交换空间 – 因为这是进程所处的地方,而不是在其中一个CPU上进行调度。 如果你没有交换空间,真的很糟糕的事情将会发生,因为你的系统将用尽创build新进程的地方(RAM) – 它不能把它们交换,因为没有,所以你会看到极高的负荷,体系冻结,看似莫名其妙地加工死亡。
要检查使用中的内存和交换空间,可以运行free -k 。 您也可以通过运行swapon -s来检查交换configuration。如果没有configuration交换,这将不会显示任何输出。
根据经验, configuration交换空间约为物理内存大小的1..2倍。 我会说,如果你有18G内存,configuration〜20..30G交换 – 不要吝啬交换,因为“磁盘是污垢便宜”!
两个创build交换空间的select:
或者创build一个交换分区,最好在最快的磁盘分区上(最好的select;或者将闪存驱动器添加到物理服务器上)
或创build一个交换文件(如果您没有剩余的磁盘空间进行分区;如果您以后发现需要更多的交换空间,这也是一个不错的select)
…然后格式化交换分区或交换文件,使其可用于与mkswap命令交换。
一旦你使用sudo swapon -a启用交换空间,你应该看到它在top列出并且带有swapon -s ,并且你的系统应该performance的更好。
关于交换空间的文章:
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 fstab , vim /etc/fstab
编辑
因为这个问题已经迁移到ServerFault ..我会在这里添加一个评论,因为脂肪酶抱怨我引用旧的规则:“1..2倍内存大小==交换大小”
一个2TB的SATA驱动器这些天花费在70美元左右,这意味着20GB的花费你大约70美分 – 这是很便宜的! 我知道20GB听起来很多,但是把它想象成一个非常便宜的“最糟糕的保险”!
有人说:“如果你的系统装满18GB,换成20GB,那么你的问题就更大了”
当然如此,但如果出现意想不到的事情时有了慷慨的交换空间,将会使服务器及其上的进程彻底崩溃! 您仍然可以在系统仍在运行(缓慢)的情况下检查系统,然后修复(尽pipe速度很慢),而不必重新启动。在生产服务器上,确实没有理由不使用慷慨的交换。
如果我有一个18GB内存的服务器,它运行MongoDB的例子(这是非常内存密集型)..我一定会configuration非常慷慨的交换空间,甚至40..60GB …以防万一有什么意外出错。
20GB – 30GB的交换空间非常高。 如果你在Linux上交换20GB,你会遇到更大的问题。
几乎可以肯定,你的机器内存不足,因为你有太多“胖”的Apache进程做很less或没有工作。
Apache通常使用“prefork”模式。 PHP通常在进程中运行。 这可能是有问题的,因为:
一个“坏”的解决办法是closureskeepalive(或者减lesskeepalive时间)。 请注意,Keepalive对于性能非常好,特别是在HTTPS上。
一个“更好”的解决scheme是转向更好的架构。 一个更好的架构将是一个你不浪费“胖”进程无所作为的架构。 一个更好的架构的典型实现,将是Nginx + PHP / FastCGI。
我不一定主张使用Nginx,如果你运行一个不同的MPM(Multiprocessing模块,例如worker,event,prefork),并且使用FastCGI把PHP移出进程,你也可以用Apache来做。
在你的情况下,你不需要交换。 如果你希望你可以创build1-2GB的交换分区或者文件来为文件系统caching提供更多的物理内存。
我不明白为什么caching的内存和缓冲区的内存是0.你可以粘贴cat /proc/meminfo的输出吗?
你有很高的I / O负载。 这可以是磁盘或networking。 尽量减less负载。 对于磁盘挂载数据分区noatime. Try to find out which process is most I/O intensive. Use noatime. Try to find out which process is most I/O intensive. Use 为此noatime. Try to find out which process is most I/O intensive. Use iotop and dstat`。
尝试升级磁盘控制器和网卡的固件和潜水员(内核模块)。 如果您正在运行虚拟机,请确保您正在安装半虚拟化驱动程序(例如VMware Tools)。 如果您正在运行带有PAE的32位内核,请尝试切换到64位分发(您将从内核时间减less)。