1. 查看日志
tail /var/log/messages
tail /alidata/log/mysql/error.log
Out of memory: Kill process 19359 (mysqld)
结论:mysqld
的进程自动被kill
,导致数据库shutdown
无法访问,但是Apache
服务正常,原因是可用内存不足。
2. 是否MySQL
占用内存过高?
查看MySQL配置项 innodb_buffer_pool_size:view /etc/my.cnf
只有64M,并不会占用太高的内存,所以是其它进程占用内存过高。
3. 什么进程很占用内存?
查看系统运行状态:top
按照内存占用排序:shift+m
可以看到上图中,运行着很多个httpd
进程(即Apache
),虽然平均占用只有2%,但是有大约30个就已经耗费系统60%的内存,而系统本身运行也需要内存。
服务器2G内存的配置,只剩下约75M可用,直接导致MySQL进程自动被kill。
4. 如何解决?
Apache开启的进程过多,其实不需要开启那么多,需要进行优化。
优化
1. 查看当前Apache配置及运行情况
查看Apache运行模式:httpd -l
当前Apache连接数:ps aux | grep httpd | wc -l
计算httpd占用内存平均数:ps aux | grep -v grep |awk '/httpd/{sum += $6;n++};END{print sum/n}'
当前的运行模式是 prefork
模式,32个进程,平均约17M。
2. 查找Apache配置 httpd.conf
查看Apache路径:whereis httpd
查找配置文件:vim /etc/httpd/conf/httpd.conf
或者:find / -name httpd.conf
本站配置
- 操作系统:CentOS 7.2 64位
- CPU:1核
- 内存:2GB
- Apache:2.4.10
3. 关于prefork模式及配置
prefork是Apache是linux默认安装使用的模式,而prefork是多进程处理的,每个进程都使用一定内存。
所以限制httpd进程的数量,即可达到优化Apache占用内存的目的。
修改httpd.conf文件
1 2 3 4 5 6 7 8 9 10 11 12 |
Timeout 30 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 4 <IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 5500 MaxClients 5000 MaxRequestsPerChild 100 </IfModule> |
参数详解
Timeout
:单个连接多长时间后断开,一般值30-60
KeepAlive
:on | off ,值为on时,用户在发起HTTP请求后,Apache不会立刻关闭此连接,等待KeepAliveTimeout时间后关闭
MaxKeepAliveRequests
:一个连接的最大请求量,当页面中含较多图片时,可适当调高,一般值80-120
KeepAliveTimeout
:当处理用户的一次连接,如果在该时间内还有请求则继续执行,无需创建新连接,直到达到MaxKeepAliveRequests最大值时退出。
以上为可能影响Apache性能的配置,以下为prefork参数设置,前面3个参数决定空闲进程数量
StartServers
:启动时默认启动的进程数
MinSpareServers
:设置空闲子进程的最小数量。空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程
MaxSpareServers
:置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
ServerLimit
:Apache最大并发响应数,即最大支持同时连接的客户端数
MaxClients
:设定Apache可同时处理的请求数量,MaxClients不得大于ServerLimit参数
MaxRequestsPerChild
:每个子进程理多少个请求后将自动销毁。到达MaxRequestsPerChild的限制后,子进程将会结束
各参数设置可以参考以上值,根据服务器配置做相应调整。
4. 重启Apache
service httpd restart
优化后
查看内存占用情况:free -m
网站访问恢复正常,除了以上配置,还可以修改Apache的模块加载数,移除不必要的模块。