我一直在我的apache服务器上运行过时的,锁定的(php)会话文件,这会阻止线程关闭,从而吞噬我的服务器资源。
它是一个Ubuntu框并且有session_write_close();在自动附加的脚本doenst帮助。我一直以锁定的会话文件结束,这些文件是本地的(内存磁盘),没有其他进程试图访问它...
我只是不知道在哪里看......
稍微澄清一下:
问题不一致且在不同的时间间隔出现。但在查看打开的文件(通过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
等)的事实是否与任何事情有关?
答案 0 :(得分:0)
非常短的帖子。我们感到痛苦,但是......
陈旧,锁定,(php)会话文件
这很奇怪。通常系统不会锁定会话文件。你有什么eveidnece线程没有关闭因为会话文件被锁定了?
阻止线程关闭
这是一个线程化的还是pre-fork apache?虽然这些日子不应该有太大的区别,但知道它会有所帮助。
您使用的是自定义会话处理程序还是默认值?
您是否尝试过使用不使用文件作为基材的自定义会话处理程序(例如mysql,memcache)。虽然这实际上并没有解决问题,但它可能表明出现了什么问题。
您是否检查过已创建的会话文件的状态?是否创建了新文件?有什么权限?如果关闭Web服务器,请手动删除文件,然后重新启动会立即显示问题,或者仅在延迟后显示(后者可能表示垃圾回收存在问题)。
syslog中的任何注意事项或httpd / error_log?
您最近是否对文件系统进行过调试?
虽然文件锁定确实存在问题,但我从未遇到过像这样的问题。
答案 1 :(得分:0)
不是真正的解决方案,但我现在通过让cron脚本每4小时重启apache来绕过这个问题......这样至少问题不会产生那么大的影响......