本篇文章是为使用Apache+MySQL,并为Apache耗尽内存而困扰的系统管理员而写。如果您没有耐心读完本文,请参考以下步骤:

  1. 修改/etc/my.cnf,加上这样一行:

    log-slow-queries=queries-slow.log

  2. 重启MySQL
  3. 酌情过上一段时间,执行mysqldumpslow命令,或直接查看datadir/queries-slow.log,从中找出执行超时的SQL语句。其中datadir是MySQL所有数据库的存放路径。
  4. 根据上一步找出的SQL语句的内容,找到相应的数据表和脚本文件,查看超时原因所在。可能的原因有:数据量确实太大,未使用索引加快查询速度,等等。但程序没写好肯定是原因之一。
  5. 根据查出的原因酌情解决。

可能有很多系统管理员都为这样的情形而困扰过:Apache进程动辄占用内存几百兆,而且剧烈浮动,变化无常,有时甚至耗掉上G内存。在访问者那里的表现就是网站速度极不稳定,间歇性抽风,有时甚至会有5-30分钟无法打开网页。这时候,你的上司或同事可能会急切地打来电话问:我们的网站怎么上不去了?我们今天还要xxxx呢!但这时你的SSH也无法像往常一样忠实地给你一个“login:”,因为它也连不上服务器了。这个时候你的服务器在做什么呢?你找出各种理由向他们解释之后,过上一段时间,网站能够正常访问了,你也终于SSH上了服务器(听起来系统管理员真没用),然后你会用dmesg或者在/var/log/messages里面发现一堆有关内存的信息,什么DMA了,HighMem了,其中会包含类似这样一行:

Out of Memory: Killed process 6760 (httpd).

它告诉你的信息是,你的服务器物理内存耗尽,也没什么好向交换区淘汰的了,只好杀掉了你的Apache的一个进程。之所以选择这个进程,基本上就是因为它占用的物理内存最多。

很没面子的说,我被这样的问题困扰了大半年。我曾在网上疯狂地搜索解决的办法,那些文章一般都会告诉你修改httpd.conf,把MinSpareThreads或是MaxSpareThreads或是MaxRequestsPerChild设小一点,我尝试过各种设定,都没有明显的效果。我甚至曾极端地经把MaxRequestsPerChild设为1,但是Apache的进程还是会淤积,超过ServerLimit设定值,直到耗尽内存。

我曾经怀疑过是PHP内存泄漏,因为PHP官方不保证PHP的各种扩展是线程安全的,推荐使用prefork MPM而不是worker MPM.于是我也曾经把ThreadsPerChild设为1,因为这样每个进程也就只有一个线程,在一定意义上相当于prefork MPM,但是这种做法还是没有效果,问题依旧。

大约一周以前,我在检查MySQL的运行状态的时候,发现有一项Slow_queries数值很高,我敏感地认识到可能是某个程序的SQL语句没有写好,而且很可能就是这样的程序导致Apache进程淤积。然后我翻阅了MySQL手册中有关Slow query log的部分,按照那里的指示,修改/etc/my.cnf,在mysqld那一段加上如下一行:

log-slow-queries=queries-slow.log

重启MySQL。过上一段时间以后,用mysqldumpslow命令找出了执行超时的那条语句,根据那条查询的内容,我找出相应的脚本。那是一个留言本页面,程序确实没有写好,成了垃圾广告的乐园。有人通过这个页面向数据库里面写入了超过10万条的流言,而正常的留言还不到300条。而且这个程序里面分页的做法,居然是查询数据表里面所有10万条数据并排序,而用到的只有区区10条。竟然不使用LIMIT语句,我~@#$% ^&*!后来证实这个留言本已经是废弃的了(我想也不可能是正在使用的,因为每次都执行超时,已经无法使用了),就删掉了。之后,就再也没有出现过进程淤积、内存耗尽的问题。在ThreadsPerChild=64的情况下,每个Apache进程的内存一般就几十兆,最多的时候也就只有200M,进程数量也很少超过六七个。

历经千辛万苦,终于搞定了这个问题。在此加以总结,希望本文能够给跟我一样被程序员害惨的系统管理员们一点点帮助。

好文章啊 ,留下 做参考

不再为Apache进程淤积、耗尽内存而困扰((转))的更多相关文章

  1. python 计算apache进程占用的内存大小以及占物理内存的比例

      目的:计算所有apache进程占用的内存大小以及占物理内存的比例: 思路:利用系统中/proc/meminfo的现有数据进行统计 1.pidof列出服务对应进程的PID [root@yanglih ...

  2. wdcp-apache配置错误导致进程淤积进而内存吃紧

    内存总是越来越少,虚拟内存使用越来越多 首先确定到底是什么占用了大量的内存 可以看到,大部分内存被闲置的httpd进程占用 且当我重启mysql服务后,内存没有出现明显变化,但是当我重启apache时 ...

  3. apache 占用内存总量与每个apache进程的平均内存占用量计算

    方法1: ps aux | grep httpd | grep -v pts | awk '{ tot += $6; procs += 1; print $2,$6,$11 } END { print ...

  4. 解决Apache长时间占用内存大的问题,Apache 内存优化方法

    问:为什么服务器在连续运行多天后或访问峰值后,进程中的一个Apache.exe占用内存几百兆不减少?答:用记事本打开apache2\conf\httpd.conf,我在centos5上装了kloxo, ...

  5. Linux下php-fpm进程过多导致内存耗尽问题

    这篇文章主要介绍了解决Linux下php-fpm进程过多导致内存耗尽问题,需要的朋友可以参考下   最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是 ...

  6. 一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)

    各位看官们.大家好,上一回中咱们说的是从内存角度看进程和线程的样例.这一回咱们说的样例是:创建进程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们都知道使用fork函数能 ...

  7. PG进程结构和内存结构

    ​ 本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. ​ 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...

  8. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  9. Windows进程通信 -- 共享内存(1)

    共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...

随机推荐

  1. SpringMVC参数自动绑定

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  2. nginx----------------环境搭建遇到的一些问题汇总--(多域名配置,配置文件修改问题)

    nginx的启动命令是:(通用) /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重启命令: /usr/local/ng ...

  3. android Dialog重绘

    String title = ""; if(itemInfo!=null) title = "\n\""+itemInfo.itemSSID+&quo ...

  4. TortoiseGit 连接oschina不用每次输入用户名和密码的方法

    每次git clone 和push 都要输入用户名和密码.虽然安全,但在本机上每次都输有些麻烦,如何记住用户名和密码呢? 在网上看了各种方法,太杂,很多可能环境不一样,一直行不通.最后找到一种有效的方 ...

  5. Windows Phone 十八、加速计

    加速度传感器 手机的加速度传感器工作时是通过 x.y.z 三个轴的偏移来计算的 在代码基本的 API 主要集中在 Accelerometer 类型中 主要是使用该类型的对象捕获 ReadingChan ...

  6. Datatypes translation between Oracle and SQL Server

    Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes tran ...

  7. Extjs 3.4 同值合并

    摘自:http://www.cnblogs.com/kunpengit/archive/2012/11/13/2768239.html/** * grid gridPanel 需要合并的表格 * ro ...

  8. My Env

    Font -- YaHei Consolas Hybrid YaHei ConsolasAsume that we put the font file in /usr/share/fonts/myfo ...

  9. (一)sql入门 导读

    从转行做软件始,就开始接触sql,但还是不怎么深入,回忆3月份找工作的时候,左关联都没有写出来,真是丢脸,以此博客做个认真的开始. 以后的日子,遇到了圆柱体的空心物体,我就应该联想到一样东西,那就是数 ...

  10. UVa 10917 Dijkstra

    本来就是水题一道. 题意:一个人要从点1去到点2,中间还有很多点和很多条边.问你如果他每次走的边(a,b)都满足:a点到目标点的最短距离<b点到目标点的最短距离,那么他从点1出发到点2总共有多少 ...