本篇文章是为使用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,进程数量也很少超过六七个。

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

好文章啊 ,留下 做参考

转载于:https://www.cnblogs.com/luomir/p/5923993.html

不再为Apache进程淤积、耗尽内存而困扰((转))相关推荐

  1. 不再为Apache进程淤积、耗尽内存而困扰[转载]

    转自:http://www.mylogged.com/?post=96 不再为Apache进程淤积.耗尽内存而困扰[转载] 本篇文章是为使用Apache+MySQL,并为Apache耗尽内存而困扰的系 ...

  2. apache php 内存,不再为Apache进程淤积、耗尽内存而困扰

    本篇文章是为使用Apache+MySQL,并为Apache耗尽内存而困扰的系统管理员而写.如果您没有耐心读完本文,请参考以下步骤: 修改/etc/my.cnf,加上这样一行: log-slow-que ...

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

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

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

    当个人博客数据库服务经常突然挂断,造成无法访问时我们能做什么?本篇主题就是记录博主针对这一现象时发现问题,分析问题,最后解决问题的过程. 欢迎访问我的个人博客 发现问题 最近,发现个人博客的Linux ...

  5. linux apache占用内存过高,linux – 找出高CPU占用率的apache进程实际上在做什么?...

    目前我们的服务器存在一些问题,间歇性地,我们似乎得到了运行和运行的apache进程,占用了100%的cpu. 在运行top时,我们会看到以下内容: PID USER PR NI VIRT RES SH ...

  6. c++ fork 进程时 共享内存_linux共享内存mmap

    Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...

  7. Android系统中的进程管理:内存的回收

    本文是Android系统进程管理的第三篇文章.进程管理的前面两篇文章,请参见这里: Android系统中的进程管理:进程的创建 Android系统中的进程管理:进程的优先级 本文适合Android平台 ...

  8. 32位linux进程线程在内存中的样子

    1.线程诞生史 1.1 线程诞生的原因 早期是没有线程概念的,只有进程的概念,操作系统以进程为调度单位.--可以这么来理解:早期进程相当于现在的单线程的进程(只有一个线程的进程,创建进程时,里面有一个 ...

  9. java代码耗尽内存_windows server 2008 环境下,运行java程序,内存耗尽问题

    经历的几天的分析,希望把自己学到的知识总结一下. 系统版本:Windows Server 2008 R2 Standard 系统类型:64bit 内存:32GB 程序:在系统上部署了solr,然后写5 ...

最新文章

  1. [转]PDO防注入原理分析以及使用PDO的注意事项
  2. linux在机房设置ip,双线机房双IP linux设置路由
  3. VSTO Office二次开发PPTRibbonX命令操作及对象添加
  4. AI入门:不用任何公式把主成分分析讲清楚
  5. ios plist 国际化_Java与iOS对话:Java对象与Apple plist序列化
  6. Android天气预报设计
  7. 扫地机器人什么牌子好?2021最新扫地机器人排行榜
  8. 强化学习常用算法+实际应用
  9. 【AngularJs学习笔记五】AngularJS从构建项目开始
  10. 洛谷——P1554 梦中的统计
  11. webplayer 设置加载图标和屏蔽右键
  12. sublime_text_2 注册
  13. 【数字图像处理系列三】图像增强:线性、 分段线性、 对数、 反对数、 幂律(伽马)变换、直方图均衡
  14. 3D游戏引擎技术剖析
  15. Silvaco TCAD介绍
  16. C/C++中取地址符的语义
  17. 使用fiddler代理,手机无法上网
  18. 计算机硬盘数据如何恢复,怎样进行硬盘数据恢复
  19. VSCode 过滤.meta 文件
  20. 如何让浏览器用极速模式打开网站而不是兼容模式

热门文章

  1. 【xitongshoucang.com】全方位对Shift键大揭秘
  2. 1.清除最近使用过的文档记录
  3. 301 Moved Permanently错误
  4. 体验为王的时代,如何提高售后服务环节的客户参与度?
  5. weblogic动态调试环境搭建
  6. 摩尔斯电码转换python编码_摩尔斯电码到英文python3
  7. 太极拳口令yangyi.c
  8. 行车记录仪改家用监控求助
  9. vc idispatchimpl 怎么实例化_京东APP订单业务楼层化技术实践解密
  10. 虹软java接摄像头_Java调用虹软SDK的错误