php - 为什么 PHP Symfony sfSessionStorage::initialize 有时需要很长时间?

标签 php performance symfony session io

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

我说的是加载分钟。以这个 newrelic trace 为例:

enter image description here

在这里您可以看到 sfSessionStorage::initialize 花费了 185 秒。我们已经调试了好几天了,到目前为止还没有成功。我们查看了 GC 设置,尝试将 session 存储在文件系统中的位置挂载到 RamDisk 中,但没有任何效果。

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

最佳答案

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
  • 尝试重现问题

如果它在一次系统调用中停留几分钟,您会在 strace 的标准输出中清楚地看到阻止程序。如果没有单一的阻塞程序,而是一长串重复的系统调用,您可能需要将其记录到一个文件中,稍后再进行分析。例如。 sudo strace -p {pid} | tee/tmp/strace.log.

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

关于php - 为什么 PHP Symfony sfSessionStorage::initialize 有时需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702497/

相关文章:

php - 使用 LEAST 和 GREATEST 函数将 SQL 转换为 Doctrine

php - PHP + Ajax innerHTML 后可点击的 JS 函数不起作用

php - Laravel Eloquent 关系 - 违反完整性约束

php - Laravel 4 Illuminate\Database\Eloquent\MassAssignmentException 错误

c++ - For 循环还是无循环? (数据集很小,不会改变)

symfony - 如何打印带 0 的整数作为小数值?

php - 使用 php 和 mysql 按年和月对存档进行分组

java - Android 静态类 vs 非静态类内存性能

javascript - 使用函数式 Javascript 与 "procedural"的性能影响

symfony - 检查 Doctrine 中是否存在持久化和非持久化实体