【问题标题】:Apache locks session files for no reasonApache无缘无故锁定会话文件
【发布时间】: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


【解决方案1】:

一个很短的帖子。我们感受到你的痛苦,但是......

陈旧、锁定的 (php) 会话文件

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

阻止线程关闭

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

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

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

您是否检查过已创建的会话文件的状态?新文件创建正常吗?有哪些权限?如果您关闭网络服务器,手动删除文件,然后重新启动,问题会立即出现还是仅在延迟后才会出现(后者可能表明垃圾收集存在问题)。

syslog 或 httpd/error_log 中有什么注意事项?

你最近 fsck 了文件系统吗?

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

【讨论】:

  • hmm... 又发生了一次并锁定了整个服务器,不得不执行电源循环.. aargh..
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2013-08-11
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多