1.别的先无论,先top看一下cpu、ram、swap哪一个比较紧张。php
由上图分析,能够看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…?
CPU显示,CPU压力并不大,能够说没有压力。咱们再看内存使用概要,发现4G的内存,消耗得所剩余无几(free+buffers), 95%以上的内存都已分配。交互空间使用状况,咱们暂时不去关心。指令top还列出了占用资源最多的进程,运行时间最久(Time+)的mysqld(约 2小时)占用资源并非最多。另外,再看php-cgi,单个php-cgi占用的内存也不算多。因此,能够大胆地猜测:服务器内存资源比较紧张,并无 被某个进程占用大量内存,有可能被某些挂起的进程占着内存没有释放。经过free进一步监控内存使用状况,验证咱们的想法。html
2.指令free,了解RAM资源使用状况。固然,你也能够查看文件/proc/meminfomysql
咱们先来看Mem统计信息,total表示物理内存总量,约4G。used,表示已分配内存,分配了并不表示使用了,包括 (buffer&cached)。free指未分配的内存,buffers与cached表示分配了但尚未被使用的内存。第二行 (buffers/cache)的,used表示真正被使用了内存,由第一行的(used-buffer-cached)获得,free则表示尚未被使 用的内存,由第一行的(free+buffer+cached)获得。Swap行则表示内存交换使用状况,少许的(不频繁地)swpd,是不会影响服务器 性能的,由于系统须要将V类型的内存页面交换出去或者调整了buffer与cached的大小。可是频繁地swpd,则有可能意味着服务器物理内存不足, 小于指定的swap额定值,须要换出内存页。nginx
查看free结果的时候,咱们主要查看第二行。一眼就能看出4G的内存,其中有3898M内存被用了,还有49M内存没有,都快用完了。这也证明了咱们第 一步的猜测,内存被用完。这里,咱们进一步猜测,内存空间严重不足的状况下,进程会被blocked,系统会不断地将不用的数据换出so,将要用的数据读 入si。咱们能经过vmstat进一步验证,咱们的这个猜测。sql
3.指令vmstat监控内存使用状况bash
做为对内存监控,咱们比较关心swpd、free、si、so。通常系统不繁忙的状态下,咱们看到swpd,so的值不会持续很高,常常为0。这里,咱们 看到swpd值为1.5G,以及free值很小,再一次代表物理内存不足。其中si报告了每秒从swap区移入到物理内存的内存总量,so报告了每秒从物 理内存移出到swap区的内存总量。固然,si有时较大,并不要过份的焦虑,常常碰到一个程序须要较大内存来读写媒体文件时,si值就会变大。反却是 so,它一般是一个内存紧缺的一个信号,若是长时间这个值一直保持较大的话,则颇有可能内存不够,小额波动,能够不用理会。接下来,能够经过ps找出消耗 内存的元凶。服务器
4.指令ps找出消耗内存的元凶ssh
[root@localhost ~]# ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -15 1 COMMAND %MEM %CPU 1 mysqld 0.6 0.0 503 php-cgi 0.3 0.0 5 php-cgi 0.2 0.0 1 php-cgi 0.1 0.0 1 php-cgi 0.0 0.0 1 memcached 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 2 bash 0.0 0.0 3 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0
指令ps比较经常使用,也比较简单。上面报告结果,咱们一眼就能够命中php-cgi这个进程。虽然单个php-cgi占用内存并不算太大,可是503 个php-cgi进程,就有点恐怖了。几乎占尽了所有内存(503*0.3%)。咱们能够猜测,php-cgi由php-fpm管理,是否是能够php- fpm的某个参数配置不当,致使打开过多的php-cgi进程。ide
5.设置php-fpm进程数量管理memcached
经过从新将php-conf.conf的max_children值设置为150,系统内存又恢复到正常使用状况。free、si、so、b均表示内存系统资源正常,没有压力。
php-cgi进程释放的内存并不会被系统当即回收,一个php-cgi大概占用20kb内存(取决于你加载的php extensions)。因此,有必要限制你启动的php-cgi进程数量。那么,这个数量多少合适呢,你能够在服务器高峰期经过top统计出php- cgi数量。也能够像php-fpm建议的那样,经过netstat -np | grep 127.0.0.1:9000来收集数据,经过设置max_children使等待的数量尽可能小
6.一个php-cgi占用多少内存
一个php-cgi进程,大概占用多少内存呢,大概是20MB。能够经过pmap指令查看哪些地方占用了内存。因此,尽可能不要加载没必要要的php扩展模块,能够减小没必要要的内存浪费。
[root@localhost etc]# pmap $(pgrep php-cgi |head -1) 6746: /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm.conf 0000000000400000 6680K r-x– /usr/local/php/bin/php-cgi 0000000000c86000 268K rw— /usr/local/php/bin/php-cgi 0000000000cc9000 56K rw— [ anon ] 0000000005012000 2240K rw— [ anon ] 0000003efd200000 112K r-x– /lib64/ld-2.5.so ……. 00002ac28a7a5000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so 00002ac28a9a5000 4K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so 00002ac28a9a6000 84K r-x– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28a9bb000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28abbb000 8K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28abbd000 32K rw— [ anon ] 00002ac28abd4000 40K r-x– /lib64/libnss_files-2.5.so 00002ac28abde000 2044K —– /lib64/libnss_files-2.5.so 00002ac28addd000 4K r—- /lib64/libnss_files-2.5.so 00002ac28adde000 4K rw— /lib64/libnss_files-2.5.so 00007fffa717e000 84K rw— [ stack ] ffffffffff600000 8192K —– [ anon ] total 154172K
7.使用xhprof、xdebug、tideways(PHP7)分析PHP程序内存等使用状况
点击下载Windows下 xhprof 扩展,Windows 下经常使用扩展下载(http://dev.freshsite.pl/php-accelerators.html)
8.nginx配合php-fpm,开启php-fpm自带实时监控(/status)
9.今天还碰到一种状况,set_time_limit(0),致使全部的php-fpm都会一直执行,直到达到最大分配值,新请求没法被响应。
转自:http://blog.csdn.net/pestd/article/details/26230351