记一次 php 优化案例
网站架构简介:
现在很多的企业都是使用 lnmp 或者 lamp 来做企业的网站服务器架构, 这两种网站的服务架构, 我们都是比较熟悉的; 基于 nginx 的性能优于 Apache, 现阶段的很多公司, 都是逐渐把 Apache 替换成 nginx, 毕竟 nginx 的自带的高可用配置, 反向代理等等功能相当突出.
Lnmp 网站服务器架构, 其实就是 linx+nginx+mysql+php 架构体系, 架构安装我就不多说了. 接下来我们来谈谈, 我遇到案例吧
案例:
有一天, 后台的同事, 说后台访问很慢, 而且有时候出现 502 错误. 然后反馈给技术上级, 接着又找到我处理一下(那时在喝着茶), 然后我知道又有事干了.
分析:
然后我直接找到那个同事, 问问是不是网络原因啊, 我也叫其他的同事, 访问一下, 还是出现访问忙的问题. 这时我就知道事情没那么简单了. 公司应用的是 lnmp 网站服务器架构, 以前没有做太多的优化, 接下来我们需要优化网站的服务架构了
一, 案例分析.
我们可以想到, 既然是访问缓慢, 有时候直接访问不了, 以前是没问题的, 到现在就突然出现了问题, 那必定是我们的 nginx 与 php 响应不过来导致的, 原因可能是其他域名网站的用户连接数巨增导致的. 那我们找到问题的根源解决并优化就可以了. 接着凭着自己的经验与百度, 去解决问题.
二, 问题解决与过程分析
1,Nginx 优化:
1, 查看 nginx 的日志, 找出错误
$ cat /usr/local/nginx/logs/error.log | grep error
没发现错误, 正常
查看后台域名的 access.logs
- $ cat /var/log/access_nging.log | grep error
- (这里没及时截到图, 日志是被刷了, 本地做了日志切割, 并定时删除了)
发现日志日志里面可以找到 error 错误信息, 并且有十几个 502 错误. 找到出现的问题了.
2, 问题分析以及 nginx 优化
1,nginx 打开文件数限制导致的.
1), 首先我们想到可能的原因 nginx 的打开文件书的问题, 增加 nginx 的打开文件数
进入 nginx 配置文件, 发现打开文件数为 4096, 果不其然, 打开文件数没有调到最佳, 可能是这个原因导致的. 我们需要把 4096 改为 51200; 保存重新加载 nginx
- # vim /usr/local/nginx/conf/nginx.conf
- worker_rlimit_nofile 51200;
- events {
- worker_connections 51200;
- }
- #service nginx relaod
2),Linux 系统文件限制
我们改了 nginx 的打开文件配置, 不一定有用, 我们需要看一下系统的限制的打开文件数
# ulimit -n
我们可以看到系统的文件打开数量也是 4096, 接下来, 我们更改一下系统的打开文件数, 并配置永久生效.
进入配置文件
# vim /etc/security/limits.conf
更改参数:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
注: 系统限制可以随便改, 我只要比 nginx 的打开文件数大就好.
3,nginx 的 fastcgi 连接时间太短导致的.
一般 nginx 响应 php, 都是通过 FastCGI 接口来调用, 所以 fastcgi 参数配置很重要, 当 HTTP 服务器每次遇到动态程序时, 可以将其直接交付给 FastCGI 进程来执行, 然后将得到的结果返回给浏览器, 而很多 php 的网页都是采用动态程序. 所以 fastcgi 的配置, 也起的至关重要的作用. 所以这是一个优化不可缺少的一部分.
进入 nginx.conf 配置文件
# vim /usr/local/nginx/conf/nginx.conf
把 fastcgi 的 connect,send,read 的参数的时间改成 300, 配置如下:
重新加载 nginx
#service nginx reload
4, 访问域名测试.
重新访问域名, 发现网页已经加载出来了, 持续访问了几次, 发现访问还是有点慢, 虽然访问稳定了. 到这里, 我们就可以把问题指向到 php 里面了, 继续下一步的 php 优化.
2,Php 优化:
1, 查看 php 日志
首先, 我们需要跟 nginx 的操作一样, 需要先查看一下日志.
#tail -n 100 /usr/local/php/var/log/php-fpm.log
在日志里面我们可以发现, php 日志出现警告
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
从告警的意思, 我们知道 php 出现告警了, 而且是叫我们增加 php 的, pm.start_servers, or pm.min/max_spare_servers 的值.
2, 原因分析
首先我们, 看到日志只是出现这个警告, 证明还不是很严重, 至于为什么出现这个警告, 接下来我们一起分析一下.
首先我们很明确的知道, pm.start_servers,,pm.min/max_spare_servers 在 php 里面是起着啥作用先, 为什么会出现这个警告. 我先把的以前的配置参数贴一下.
接下来我们分析一下这几个参数的作用:
参数分析:
pm= dynamic 表示 php 启用的动态模式 注: php 有动态和静态 (static) 两种工作模式, 默认是动态模式.
pm.max_children 表示静态下最大线程数
pm.start_servers 表示动态下启动时的线程数, 该参数大于 pm.min_spare_servers, 小于 pm.max_spare_servers
pm.min_spare_servers 表示动态下最小空闲线程数
pm.max_spare_servers 表示动态下最大空闲线程数
工作模式:
Static 模式
当工作模式设置为静态后, 就只有 pm.max_children 项有效, 即表示 php-fpm 工作时一直保持的线程数.
Dynamic 模式
动态模式下, 与他相关的参数有 pm.start_servers,pm.min_spare_servers ,pm.max_spare_servers, 分别表示开启的 php 进程数, 最小的进程数, 与最大的进程数.
模式比较:
静态模式的话, 比较适合一些内存比较大一点的服务器, 8G 及以上的, 因为对于比较大内存的服务器来说, 设置为静态的话会提高效率.
动态模式适合小内存机器, 灵活分配进程, 省内存. 可以让 php 自动增加和减少进程数, 不过动态创建回收进程对服务器也是一种消耗.
3,php 参数优化
首先我们需要考虑一下问题, 如何去调试参数, 达到优化的目的呢, 一般来说开始的时候一个 php-fpm 进程只占用 3M 左右内存, 但是运行一段时间后就会上升到 20-40M, 这是因为 PHP 程序在执行完成后, 或多或少会产生内存的泄露.
所以按理来说 php 的最大的进程数, 大概是本地内存 / 40, 因为也要考虑系统占用内存的的这种情况, 我们不能直接把除处理的结果, 当成的最大进程数, 不然你会死翘翘的.
我的服务器是 8G 内存的, 所以按理来说是, 最大的 php 进程数是 200 左右, 所以按这个参数我做了一下调整:
采用静态模式, 最大进程数设为 125-150 之间, 搞定.
重新加载 php
#service php-fpm relod
查看进程数:
- # netstat -anpo | grep php-fpm | wc -l
- 128
效果达到了
4, 结果
重新访问, 发现访问 php 页面快了很多, 查看日志, 没出现告警了, 后台访问也好了.
3, 压测
一个网站的性能好不好, 承受量有多高, 这个我们可以通过压测去, 去获取数据, 我这里简单介绍 ab 工具来做压测, 用法如下
ab -n 1000000 -c 10000 http:// 域名 / test.php http://xn--eqrt2g/test.php (一个 php 文件)
-n 参数表示 你压力测试 总量
-c 参数表示 你的模拟的并发用户数
Ab 压力测试工具, 是 apache 自带的, 用起来也方便, 只要本地有, 就可以远程测你的服务器的性能了. 个人觉得还是可以了, 下面是模拟一千个用户访问 100000 次的结果, 但然你自己压测的时候, 慢慢的提升参数, 测试你的网站的瓶颈.
还有分享一下, 下面是一个网站性能工具分析网址, 你可以贴一下你的域名, 进行评分
http://www.mmtrix.com/evaluate/result?popup=true
三, 总结
问题并不难解决, 难的是你没有思考过, 一次个人 php 优化经历, 互相学习.
来源: http://blog.51cto.com/xiaozhagn/2136667