为什么PHP Symfony sfSessionStorage :: initialize有时需要非常长的时间?

时间:2015-11-13 22:03:41

标签: php performance symfony session io

我们在symfony 1.4和symfony 2中都有不同的PHP应用程序,并且所有这些应用程序在某些时候都有sfSessionStorage :: initialize需要很长时间的请求。

我正在谈论要加载几个分钟。以这个新的痕迹为例:

enter image description here

在这里你可以看到sfSessionStorage :: initialize花了 185秒。我们已经调试了好几天了,到目前为止还没有成功。我们已经查看了GC设置,尝试将会话存储在文件系统中的事件安装到RamDisk中,但没有效果。

这可能是什么原因?你有没有遇到过同样的问题?非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:3)

strace可能会对正在发生的事情有所了解。

假设您无法使用cli重现问题,我建议将进程数限制为1(mod_php的MaxRequestWorkers和php_fpm的max_children),将strace附加到进程并检查它挂起的位置。

例如在php_fpm案例中:

  • 打开/etc/php5/fpm/pool.d/www.conf并确保设置

    pm = static  
    pm.max_children = 1
    
  • 重启php_fpm和nginx

  • grep aux | php找出进程ID
  • sudo strace -p后跟进程ID
  • 尝试重现问题

如果只用一个系统调用它会坚持几分钟,你就会清楚地看到阻挡器在stdout of strace中。如果没有单个阻止程序,而是重复系统调用的长循环,您可能需要将其记录到文件中并在以后进行分析。例如。 sudo strace -p {pid} | tee /tmp/strace.log

如果单个工作人员无法重现问题,请尝试增加工作人员数量,并捕获所有进程的strace。

答案 1 :(得分:2)

不确定这会有所帮助,但请检查。

如果您手动处理会话,则应在frontend/config/factories.yml

中关闭会话
all:
  storage:
    class: sfSessionStorage
    param:
      auto_start: false

您应该看到Deactivating the Unused Features以提高效果。

又猜测:

会话依赖于文件。因此,检查您的系统是否能够打开会话所需的许多文件。或者是否有任何创建文件的问题。

答案 2 :(得分:1)

感谢@SomeHelpingDude的评论指向这个帖子:http://webdriver.io/api/action/click.html,有人提到了实现自己的会话处理程序(https://forums.powweb.com/showthread.php?t=77977)的可能性。

我们做到了,并实现了一个使用memcached的会话处理程序。现在问题已经消失了。

我假设会话处理(文件系统)的本地方式最终会遇到死锁和其他性能问题,这些问题只能通过根本不使用文件系统来避免。

我仍然对为什么ramdisk首先没有解决这个问题感到困惑,所以如果有人能够解释这个问题,我会改变接受的答案。谢谢!