【发布时间】:2010-11-22 08:44:01
【问题描述】:
我一直在我的 apache 服务器上遇到过时的、锁定的 (php) 会话文件,这使线程无法关闭,从而占用了我的服务器资源。
它是一个 Ubuntu 机器并具有 session_write_close();在自动附加的脚本中没有帮助。我一直以锁定的会话文件结束,这些文件是本地的(内存磁盘)并且没有其他进程试图访问它......
我只是不知道去哪里找了......
澄清一下:
- 我们正在运行带有标准 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
(顺便说一句,它总是 30!)它会指向一些会话文件
实际文件中没有任何奇怪的东西,看起来很正常......
当它发生时所有 FD 都指向 30(所以它最终会是 /proc/123123/fd/30 和 /proc/123124/fd/30 等)这一事实有什么关系吗?
【问题讨论】:
-
"我相信 MPM prefork" 如果您同时使用 Ubuntu 附带的 Apache 2 和 PHP,那么可以。如果您安装
libapache2-mod-php5,它会强制apache2-mpm-prefork(或不一定稳定的apache2-mpm-itk)。 -
我注意到一个类似的问题。目前还没有解决方案。然而,定期重启 apache 进程对我来说不是一个可行的解决方案。
标签: php apache session locking