【问题标题】:Long running doctrine queries lock other simple queries - MySQL issue excluded长时间运行的学说查询锁定其他简单查询 - 排除 MySQL 问题
【发布时间】:2016-12-30 07:58:36
【问题描述】:

我有一个使用 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>

不使用 cmets 中所述的 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 多个连接。

【问题讨论】:

    标签: php mysql symfony doctrine-orm doctrine


    【解决方案1】:

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

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

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

    至于为什么这会在 dev/prod 上工作,配置文件中会话处理程序设置的差异会做到这一点。

    或者,如果这不是原因,我会使用 strace -p PID/proc/PID 来确定 apache/PHP 进程在哪个系统调用上被阻止(可能会烦人找出哪个是被阻止的进程,但你只有5 个 apache 进程和 2 分钟的窗口来找到正确的)

    【讨论】:

    • 是的,谢谢,我在@Vinicius 发表评论后看到了这个。这解决了问题。奇怪我之前没有遇到过这个问题
    • 哎哟!这是对第 3 方软件“妨碍”使用 MySQL 的最严重指控之一!
    【解决方案2】:

    不是symfony引起的,是webserver引起的。关于 laravel 的另一个 php mvc 框架请求可以参考我的post

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

    【讨论】:

    • 正如我的问题中所述,当报告在 /app.php 中运行时,我可以浏览 /app_dev.php,反之亦然。基于此,我看不到您的帖子如何适用于此。我的 Web 服务器和数据库应该同时处理多个数据库读取和输出事务,至少 2 个!
    • 我已经仔细检查并将我的 php-fpm 连接增加到 50,同样的问题
    • 您是否尝试同时在两个不同的浏览器中运行?另一个选项在同一浏览器中运行一个匿名模式的请求和另一个正常模式的请求?如果它有效,那么它是由@KrisRoofe 所说的网络服务器引起的。
    • @ViníciusFagundes 同意,但我找不到我的瓶颈。还有其他想法吗?已向问题添加配置详细信息
    • @jdog 其实可以多种原因查this related question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多