转自:http://www.mylogged.com/?post=96

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

本篇文章是为使用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://blog.51cto.com/holy2010/582349

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

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

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

  2. 不再为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. 2015年美军将具备60分钟内打击全球目标能力(图)
  2. 联想笔记本电脑,重新安装系统之U盘启动方法
  3. SAP内向交货详解 Details on SAP inbound delivery
  4. (转) OpenLayers3基础教程——OL3 介绍control
  5. 息系统项目管理师知识点:区块链
  6. java 如何将word 转换为ftl_使用 freemarker导出word文档
  7. 云计算技术背后的天才程序员:Open VSwitch鼻祖Martin Casado
  8. JEECG(J2EE Code Generation) 基于代码生成器J2EE智能开发框架 杂记:发布新版本 JEECG_v2.0
  9. CGI form标签学习
  10. fullcalendar内容如何默认展示一条其他的点击展示_LinkedIn广告全指南:如何从零开始成为Linkedin广告高手?...
  11. 华为模拟器ensp下载地址
  12. 【Google】谷歌搜索高级用法:包括指定文件类型
  13. Unity手机游戏广告接入的大致思路(Android和iOS)
  14. 笔记本电脑装固态硬盘和内存
  15. php判断某天星期几,php怎么判断指定日期是星期几?
  16. Win10子系统Ubuntu安装Thingworx8.5--1. WSL Ubuntu 安装
  17. 一天 第二章 纤腰舞困因谁,知谁系斑骓?
  18. QObject::killTimer: Timers cannot be stopped from another thread
  19. linux---VI
  20. android照片不小心删除,如何恢复安卓手机误删除的照片

热门文章

  1. 脱贫利器 | PYTHON多线程行情抓取工具实现
  2. maven(5)--依赖特性
  3. mybatis学习笔记二(接口注解)
  4. 软考中项学习之路--在路上
  5. 在Xen虚拟机下修改或同步时间失败的解决方法
  6. Zend Studio 10代码格式化设置
  7. HDOJ_ACM_折线分割平面
  8. 开发函数计算的正确姿势——支持 ES6 语法和 webpack 压缩
  9. Android多媒体之GLES2战记第四集--移形换影
  10. C#中用schema验证xml的合法性