Apache无缘无故地锁定会话文件

时间:2010-11-22 08:44:02

标签: php apache session locking

我一直在我的apache服务器上运行过时的,锁定的(php)会话文件,这会阻止线程关闭,从而吞噬我的服务器资源。

它是一个Ubuntu框并且有session_write_close();在自动附加的脚本doenst帮助。我一直以锁定的会话文件结束,这些文件是本地的(内存磁盘),没有其他进程试图访问它...

我只是不知道在哪里看......


稍微澄清一下:

  • 我们正在使用标准的PHP会话处理运行ubuntu stock apache2(相信MPM prefork)
  • 会话存储在ramdrive上,所以fsck-ing事情不会做太多;)

问题不一致且在不同的时间间隔出现。但在查看打开的文件(通过lsof | grep sess_)后,我一直看到apache2线程持有这些文件。

apache2   28405 www-data   30uW     REG               0,18     38652    2737432 /data/ramdrive/sess_8f95700e5d2ed8daf2e2d12625ed7d53

由于我没有问题ATM我没有实际的实时数据,但它看起来像这样: 对前面提到的id做一个strace -p

我会看到一些东西
F_LOCK(30, 

东西... 做一个ls -l /proc/[apache pid]/fd/30 (BTW每次总是30!)它会指向一些会话文件

实际文件中没有任何奇怪的内容,看起来很健全......

当它发生时,所有FD指向30(因此最终会成为/proc/123123/fd/30/proc/123124/fd/30等)的事实是否与任何事情有关?

2 个答案:

答案 0 :(得分:0)

非常短的帖子。我们感到痛苦,但是......

  

陈旧,锁定,(php)会话文件

这很奇怪。通常系统不会锁定会话文件。你有什么eveidnece线程没有关闭因为会话文件被锁定了?

  

阻止线程关闭

这是一个线程化的还是pre-fork apache?虽然这些日子不应该有太大的区别,但知道它会有所帮助。

您使用的是自定义会话处理程序还是默认值?

您是否尝试过使用不使用文件作为基材的自定义会话处理程序(例如mysql,memcache)。虽然这实际上并没有解决问题,但它可能表明出现了什么问题。

您是否检查过已创建的会话文件的状态?是否创建了新文件?有什么权限?如果关闭Web服务器,请手动删除文件,然后重新启动会立即显示问题,或者仅在延迟后显示(后者可能表示垃圾回收存在问题)。

syslog中的任何注意事项或httpd / error_log?

您最近是否对文件系统进行过调试?

虽然文件锁定确实存在问题,但我从未遇到过像这样的问题。

答案 1 :(得分:0)

不是真正的解决方案,但我现在通过让cron脚本每4小时重启apache来绕过这个问题......这样至少问题不会产生那么大的影响......