不再为Apache进程淤积、耗尽内存而困扰((转))
本篇文章是为使用Apache+MySQL,并为Apache耗尽内存而困扰的系统管理员而写。如果您没有耐心读完本文,请参考以下步骤:
- 修改/etc/my.cnf,加上这样一行:
log-slow-queries=queries-slow.log
- 重启MySQL
- 酌情过上一段时间,执行mysqldumpslow命令,或直接查看datadir/queries-slow.log,从中找出执行超时的SQL语句。其中datadir是MySQL所有数据库的存放路径。
- 根据上一步找出的SQL语句的内容,找到相应的数据表和脚本文件,查看超时原因所在。可能的原因有:数据量确实太大,未使用索引加快查询速度,等等。但程序没写好肯定是原因之一。
- 根据查出的原因酌情解决。
可能有很多系统管理员都为这样的情形而困扰过: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进程淤积、耗尽内存而困扰((转))的更多相关文章
- python 计算apache进程占用的内存大小以及占物理内存的比例
目的:计算所有apache进程占用的内存大小以及占物理内存的比例: 思路:利用系统中/proc/meminfo的现有数据进行统计 1.pidof列出服务对应进程的PID [root@yanglih ...
- wdcp-apache配置错误导致进程淤积进而内存吃紧
内存总是越来越少,虚拟内存使用越来越多 首先确定到底是什么占用了大量的内存 可以看到,大部分内存被闲置的httpd进程占用 且当我重启mysql服务后,内存没有出现明显变化,但是当我重启apache时 ...
- apache 占用内存总量与每个apache进程的平均内存占用量计算
方法1: ps aux | grep httpd | grep -v pts | awk '{ tot += $6; procs += 1; print $2,$6,$11 } END { print ...
- 解决Apache长时间占用内存大的问题,Apache 内存优化方法
问:为什么服务器在连续运行多天后或访问峰值后,进程中的一个Apache.exe占用内存几百兆不减少?答:用记事本打开apache2\conf\httpd.conf,我在centos5上装了kloxo, ...
- Linux下php-fpm进程过多导致内存耗尽问题
这篇文章主要介绍了解决Linux下php-fpm进程过多导致内存耗尽问题,需要的朋友可以参考下 最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是 ...
- 一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)
各位看官们.大家好,上一回中咱们说的是从内存角度看进程和线程的样例.这一回咱们说的样例是:创建进程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们都知道使用fork函数能 ...
- PG进程结构和内存结构
本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- Windows进程通信 -- 共享内存(1)
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...
随机推荐
- vue.js在windows本地下搭建环境和创建项目
Vue.js是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vu ...
- 探索性思维——How to Solve It
我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...
- 目标检测方法——SSD
SSD论文阅读(Wei Liu--[ECCV2016]SSD Single Shot MultiBox Detector) 目录 作者及相关链接 文章的选择原因 方法概括 方法细节 相关背景补充 实验 ...
- Nodejs express 文件上传
文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data. index.htm 文件代码修改如下: <html ...
- MySQL免安装的配置
①:下载并获取解压路径: ②:修改 my-default.ini: ③:管理员身份进入cmd,并cd到上面的路径(否则发生错误2,找不到文件): ④:忘记ROOT密码如何重置:
- 物理引擎-Physx的源代码去哪里找
前几天无意中看到了Physx开源了,就连自己的领导也高兴了一下,让本道士去下载源代码琢磨一下,顺便做几个例子跑起来.结果没成想这个nvidia的github上的源代码被移除了,而且csdn,pudn上 ...
- AngularJs--angular-pagination可复用的分页指令
1.angular-pagination 是基于angular 编写的可复用分页指令 安装 克隆项目到本地: git clone https://github.com/febobo/angular-p ...
- HTML5 Web app开发工具Kendo UI Web中如何绑定网格到远程数据
在前面的文章中对于Kendo UI中的Grid控件的一些基础的配置和使用做了一些介绍,本文来看看如何将Kendo UI 中的Grid网格控件绑定到远程数据. 众所周知Grid网格控件是用户界面的一个重 ...
- nodejs的初学
1.启服务器.先server.js,再命令行输入命令node server.js,打开浏览器输入http://127.0.0.1:2016可以看到有内容输出. server.js代码如下: var h ...
- iOS开发中设置UITextField的占位文字的颜色,和光标的颜色
在iOS开发中,对于很多初学者而言,很有可能碰到需要修改UITextField的占位文字的颜色,以及当UITextField成为第一响应者后光标的颜色,那么下面小编就介绍一下修改占位文字和光标的颜色. ...