长时间运行的学说查询会锁定其他简单查询 - MySQL问题被排除

时间:2016-12-30 07:58:36

标签: php mysql symfony doctrine-orm doctrine

我有一个使用Symfony 2.8.14 / Doctrine构建的报告应用程序。我的一份报告大约需要2分钟才能运行并执行一系列查询(https://dba.stackexchange.com/questions/157981/reporting-query-blocks-other-query-but-isolation-level-read-uncommitted-set/159495#159495)。

我发现锁定似乎发生在Symfony级别,因为如果我在报告运行时切换到app_dev.php /或在命令行上运行MySQL查询,则可以加载相同的页面没问题。

我是否有意外打开的连接限制或其他锁定?

我的学说配置

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_mysql
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
                options:
                    1001: true
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    AppBundle: ~
                    FOSUserBundle: ~
            errorlog:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    AppBundle: ~

Apache2配置 - mpm-itk

<IfModule mpm_itk_module>
  StartServers             5
  MinSpareServers          5
  MaxSpareServers         10
  MaxRequestWorkers      150
  MaxConnectionsPerChild   0
</IfModule>

不使用评论中所述的PHP-FPM,而是使用mod_php:

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

我在m4.2xlarge上运行MySQL 5.7.11,根据这个:http://pushentertainment.com/rds-connections-by-instance-type/允许2500多个连接。

2 个答案:

答案 0 :(得分:1)

几乎每次我遇到不在数据库中的锁定时,它都是PHP会话序列化。

使用默认的Symfony NativeFileSessionHandler,PHP将在打开会话文件之前等待获取文件锁;在会话关闭之前不会释放锁(即请求已完成)。这有助于避免进程读/写会话数据之间的竞争条件。

如果这是原因,则在同一浏览器中打开2个选项卡(打印$session->getId以确认会话ID已共享)将被阻止,但尝试使用不同的浏览器(不同的会话ID)将不会阻止。请注意,取决于在浏览器中取消的ignore_user_abort() 以前的请求的状态,但仍然处理也会阻止任何新请求。

至于为什么这可以在dev / prod上运行,配置文件中会话处理程序设置的差异就会这样做。

或者,如果这不是原因,我会使用strace -p PID/proc/PID来确定阻止apache / PHP进程的系统调用(可能很烦人解决阻塞进程的问题)但你只有5个apache进程和2分钟的窗口才能找到合适的进程)

答案 1 :(得分:0)

它不是由symfony引起的,它是由网络服务器引起的。你可以参考我的post关于另一个php mvc帧请求的laravel。

要解决此问题,请在后台运行时间成本流程。