处理服务器session问题导致的高负载
2014-03-23 00:00
197 查看
参考http://www.xobm.com/php/id-48.html 1、现象
a、服务器高负载,24核的服务器,最高负载跑到200多。
b、所有用户登录,退出,页面需要io操作的均缓慢。
2、排查(关键步骤) 进入系统开始排查问题 根据观察发现大量php-cgi进程和mysql进程占用大量cpu,所以决定从这两个方向进行排查。
a、排查数据库:进入数据库查看系统进程,看看是否有长时间锁表的操作。有的话,针对这条sql查询,找到对应的程序。
b、排查程序:开启php-fpm的slow.log和php-fpm.log,找到访问量最大的语句,经过观察php-fpm.log和slow.log是一一对应的,所以这时以slow.log中的函数所操作的文件为突破口。
根据我自己的情况,有大量的session_start()操作,然后顺藤摸瓜,找到php的session配置文件,发现session的默认配置文件路径为/tmp 接下来进入/tmp目录下,ls后出现too many arguments,一下明白了问题的根源,find一下,查出来,目录下有50w文件。 因为session的读写涉及到大量小文件的随机读写,并且是集中在一个目录下,iowait也急剧升高。 3、处理 已经锁定问题,接下来针对session进行优化,按照文档内的做法,具体步骤如下: 第一步,考虑将session放入内存中,最简单的办法莫过于将/tmp挂载为 tmpfs文件系统,也就是内存中 修改/etc/fstab 在最后一行添加如下内容
切记,等第四步结束后迅速重启php,否则会有部分session不同步的现象 第四步,将全部session删除 删除的时候仍然提示too many arguments,这时候就要分层删除,由于sess的值是按照16进制的命名方式来操作,于是我们可以用
a、服务器高负载,24核的服务器,最高负载跑到200多。
b、所有用户登录,退出,页面需要io操作的均缓慢。
2、排查(关键步骤) 进入系统开始排查问题 根据观察发现大量php-cgi进程和mysql进程占用大量cpu,所以决定从这两个方向进行排查。
a、排查数据库:进入数据库查看系统进程,看看是否有长时间锁表的操作。有的话,针对这条sql查询,找到对应的程序。
b、排查程序:开启php-fpm的slow.log和php-fpm.log,找到访问量最大的语句,经过观察php-fpm.log和slow.log是一一对应的,所以这时以slow.log中的函数所操作的文件为突破口。
根据我自己的情况,有大量的session_start()操作,然后顺藤摸瓜,找到php的session配置文件,发现session的默认配置文件路径为/tmp 接下来进入/tmp目录下,ls后出现too many arguments,一下明白了问题的根源,find一下,查出来,目录下有50w文件。 因为session的读写涉及到大量小文件的随机读写,并且是集中在一个目录下,iowait也急剧升高。 3、处理 已经锁定问题,接下来针对session进行优化,按照文档内的做法,具体步骤如下: 第一步,考虑将session放入内存中,最简单的办法莫过于将/tmp挂载为 tmpfs文件系统,也就是内存中 修改/etc/fstab 在最后一行添加如下内容
none /tmp/sessions tmpfs defaults,size=5120m 0 0添加完后执行
mount -a第二步,创建session存储文件夹 php并不会自动去创建这些文件夹,不过在源文件中提供了一些创建文件夹的脚本。下面这个脚本也好用,脚本内容如下
#!/bin/sh I="0 1 2 3 4 5 6 7 8 9 a b c d e f" for acm in $I; do for x in $I; do mkdir -p /tmp/sessions/$acm/$x; done; done chown -R nobody:nobody /tmp/sessions chmod -R 1777 /tmp/sessions因为/tmp/sessions是用的内存,服务器重启后,里面的所有文件都会丢失,所以,需要把上面的脚本加入到 /etc/rc.local中,并且要放在启动php之前 第三步,将session存储到不同的目录中 php本身支持session的多级散列 在php.ini中,将 ;session.save_path = /tmp 改为
session.save_path = "2;/tmp/sessions"表示将session存储到 /tmp/session这个文件夹中,并且是用2级散列。 保存退出
切记,等第四步结束后迅速重启php,否则会有部分session不同步的现象 第四步,将全部session删除 删除的时候仍然提示too many arguments,这时候就要分层删除,由于sess的值是按照16进制的命名方式来操作,于是我们可以用
rm -rf sess_0* && rm -rf sess_1 && rm -rf sess_2 .... && rm -rf sess_f执行完毕,仔细查看session的生成情况,以及负载情况,应该能够得到我们想要的结果了。 第五步,session的回收 session在使用2分法,更改过默认存储路径后,会无法定时删除sessions 所以我们需要手动定时删除,下面这个命令可以删除过期的session 我这里定义的过期时间是3小时内
*/10 * * * * /bin/find /tmp/sessions/ -amin +180 -type f -exec rm -rf {} \;放入cron中,10分钟执行一次,完事。 有疑问的朋友,欢迎加入ttlsa群,一起讨论,联系方式在网站中有。
相关文章推荐
- PHP处理服务器session问题导致的高负载
- 服务器维护中处理高并发导致的一些常见问题解决方案
- 服务器意外重启导致storm报错的问题处理
- WINDOWS 2008的trustedinstallerexe占用过多CPU导致服务器性能下降的问题处理
- SpringMVC 拦截器遇到浏览器请求/favicon.ico被拦截导致触发session失效问题的处理办法
- session存放数据过大导致频繁GC影响服务器性能以及高并发问题解决
- asp.net处理删除网站下文件夹导致iis重启session丢失的问题
- Tapestry 会话缓存(@SessionState )导致串数据问题处理
- Web.Config中设置Session问题,导致无法向会话状态服务器发出会话状态请求
- 【troubleshooting】记一次Kafka集群重启导致消息重复消费问题处理记录
- 搭建IIS服务器80端口却已被占用的问题和用了Sc config http start= disabled命令导致HTTP服务无法启动的解决方案
- 服务器配置python时一些问题的处理方法 [转]
- 关于android客户端访问web服务器session问题。
- 解决部署服务器时传参乱码导致的问题
- 关于一般处理程序获取session问题
- 关于ASP.NET 2.0的目录结构变化导致Session丢失的问题
- 微信公众平台开发教程(八)Session处理问题
- Windows7蓝屏导致Oracle回滚段损坏(ORA-01115和ORA-27070)数据库无法启动的问题处理
- 解决应用服务器变为集群后的Session问题
- IIS服务器中 ASP.NET State Service 开启后 Session 仍容易丢失的问题终极解决办法