imiphp / imi

imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。它支持 HttpApi、WebSocket、TCP、UDP、MQTT 服务的开发。特别适合互联网微服务、即时通讯聊天im、物联网等场景!QQ群:17916227
https://www.imiphp.com
Other
1.16k stars 170 forks source link

Fail imi-swoole-pgsql-raw with PHP 8.3 in Techempower benchmark #661

Closed joanhey closed 6 months ago

joanhey commented 7 months ago

image

VERIFYING QUERY COUNT FOR http://tfb-server:8080/pgUpdateRaw?queries=20
--------------------------------------------------------------------------------
imi-swoole-pgsql-raw: [2023-11-29 18:19:31] imi.ERROR: PDOException: SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected
imi-swoole-pgsql-raw: DETAIL:  Process 369 waits for ShareLock on transaction 1128; blocked by process 491.
imi-swoole-pgsql-raw: Process 491 waits for ShareLock on transaction 1132; blocked by process 403.
imi-swoole-pgsql-raw: Process 403 waits for ShareLock on transaction 999; blocked by process 259.
imi-swoole-pgsql-raw: Process 259 waits for ExclusiveLock on tuple (13,50) of relation 16416 of database 16384; blocked by process 418.
imi-swoole-pgsql-raw: Process 418 waits for ShareLock on transaction 1112; blocked by process 309.
imi-swoole-pgsql-raw: Process 309 waits for ShareLock on transaction 1134; blocked by process 347.
imi-swoole-pgsql-raw: Process 347 waits for ShareLock on transaction 1049; blocked by process 369.
imi-swoole-pgsql-raw: HINT:  See server log for query details.
imi-swoole-pgsql-raw: CONTEXT:  while updating tuple (23,199) in relation "world" in /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php:146
imi-swoole-pgsql-raw: Stack trace:
imi-swoole-pgsql-raw: #0 /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php(146): PDOStatement->execute()
imi-swoole-pgsql-raw: #1 /imi/ApiServer/Controller/PgController.php(194): Imi\Pgsql\Db\Drivers\PdoPgsql\Statement->execute(Array)
imi-swoole-pgsql-raw: #2 /imi/vendor/imiphp/imi/src/Util/DelayServerBeanCallable.php(86): ImiApp\ApiServer\Controller\PgController->pgUpdateRaw(20)
imi-swoole-pgsql-raw: #3 /imi/vendor/imiphp/imi/src/Server/Http/Middleware/ActionMiddleware.php(79): Imi\Util\DelayServerBeanCallable->__invoke('20')
imi-swoole-pgsql-raw: #4 /imi/vendor/imiphp/imi/src/Server/Http/Dispatcher.php(68): Imi\Server\Http\Middleware\ActionMiddleware->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest), Object(Imi\Swoole\Http\Message\SwooleResponse))
imi-swoole-pgsql-raw: #5 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Listener/BeforeRequest.php(49): Imi\Server\Http\Dispatcher->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest))
imi-swoole-pgsql-raw: #6 /imi/vendor/imiphp/imi/src/Event/TEvent.php(202): Imi\Swoole\Server\Http\Listener\BeforeRequest->handle(Object(Imi\Swoole\Server\Event\Param\RequestEventParam))
imi-swoole-pgsql-raw: #7 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Server.php(125): Imi\Server\Contract\BaseServer->trigger('request', Array, Object(Server__Bean__29), 'Imi\\Swoole\\Serv...')
imi-swoole-pgsql-raw: #8 [internal function]: Imi\Swoole\Server\Http\Server->Imi\Swoole\Server\Http\{closure}(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
imi-swoole-pgsql-raw: #9 {main}  
imi-swoole-pgsql-raw: [2023-11-29 18:19:31] imi.ERROR: PDOException: SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected
imi-swoole-pgsql-raw: DETAIL:  Process 423 waits for ShareLock on transaction 1089; blocked by process 125.
imi-swoole-pgsql-raw: Process 125 waits for ShareLock on transaction 1190; blocked by process 117.
imi-swoole-pgsql-raw: Process 117 waits for ShareLock on transaction 1106; blocked by process 297.
imi-swoole-pgsql-raw: Process 297 waits for ShareLock on transaction 1145; blocked by process 353.
imi-swoole-pgsql-raw: Process 353 waits for ShareLock on transaction 1129; blocked by process 423.
imi-swoole-pgsql-raw: HINT:  See server log for query details.
imi-swoole-pgsql-raw: CONTEXT:  while updating tuple (82,125) in relation "world" in /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php:146
imi-swoole-pgsql-raw: Stack trace:
imi-swoole-pgsql-raw: #0 /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php(146): PDOStatement->execute()
imi-swoole-pgsql-raw: #1 /imi/ApiServer/Controller/PgController.php(194): Imi\Pgsql\Db\Drivers\PdoPgsql\Statement->execute(Array)
imi-swoole-pgsql-raw: #2 /imi/vendor/imiphp/imi/src/Util/DelayServerBeanCallable.php(86): ImiApp\ApiServer\Controller\PgController->pgUpdateRaw(20)
imi-swoole-pgsql-raw: #3 /imi/vendor/imiphp/imi/src/Server/Http/Middleware/ActionMiddleware.php(79): Imi\Util\DelayServerBeanCallable->__invoke('20')
imi-swoole-pgsql-raw: #4 /imi/vendor/imiphp/imi/src/Server/Http/Dispatcher.php(68): Imi\Server\Http\Middleware\ActionMiddleware->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest), Object(Imi\Swoole\Http\Message\SwooleResponse))
imi-swoole-pgsql-raw: #5 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Listener/BeforeRequest.php(49): Imi\Server\Http\Dispatcher->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest))
imi-swoole-pgsql-raw: #6 /imi/vendor/imiphp/imi/src/Event/TEvent.php(202): Imi\Swoole\Server\Http\Listener\BeforeRequest->handle(Object(Imi\Swoole\Server\Event\Param\RequestEventParam))
imi-swoole-pgsql-raw: #7 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Server.php(125): Imi\Server\Contract\BaseServer->trigger('request', Array, Object(Server__Bean__29), 'Imi\\Swoole\\Serv...')
imi-swoole-pgsql-raw: #8 [internal function]: Imi\Swoole\Server\Http\Server->Imi\Swoole\Server\Http\{closure}(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
imi-swoole-pgsql-raw: #9 {main}  
imi-swoole-pgsql-raw: [2023-11-29 18:19:32] imi.ERROR: PDOException: SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected
imi-swoole-pgsql-raw: DETAIL:  Process 403 waits for ShareLock on transaction 999; blocked by process 259.
imi-swoole-pgsql-raw: Process 259 waits for ShareLock on transaction 1031; blocked by process 418.
imi-swoole-pgsql-raw: Process 418 waits for ShareLock on transaction 1179; blocked by process 122.
imi-swoole-pgsql-raw: Process 122 waits for ShareLock on transaction 1128; blocked by process 491.
imi-swoole-pgsql-raw: Process 491 waits for ShareLock on transaction 1132; blocked by process 403.
imi-swoole-pgsql-raw: HINT:  See server log for query details.
imi-swoole-pgsql-raw: CONTEXT:  while updating tuple (77,90) in relation "world" in /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php:146
imi-swoole-pgsql-raw: Stack trace:
imi-swoole-pgsql-raw: #0 /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php(146): PDOStatement->execute()
imi-swoole-pgsql-raw: #1 /imi/ApiServer/Controller/PgController.php(194): Imi\Pgsql\Db\Drivers\PdoPgsql\Statement->execute(Array)
imi-swoole-pgsql-raw: #2 /imi/vendor/imiphp/imi/src/Util/DelayServerBeanCallable.php(86): ImiApp\ApiServer\Controller\PgController->pgUpdateRaw(20)
imi-swoole-pgsql-raw: #3 /imi/vendor/imiphp/imi/src/Server/Http/Middleware/ActionMiddleware.php(79): Imi\Util\DelayServerBeanCallable->__invoke('20')
imi-swoole-pgsql-raw: #4 /imi/vendor/imiphp/imi/src/Server/Http/Dispatcher.php(68): Imi\Server\Http\Middleware\ActionMiddleware->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest), Object(Imi\Swoole\Http\Message\SwooleResponse))
imi-swoole-pgsql-raw: #5 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Listener/BeforeRequest.php(49): Imi\Server\Http\Dispatcher->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest))
imi-swoole-pgsql-raw: #6 /imi/vendor/imiphp/imi/src/Event/TEvent.php(202): Imi\Swoole\Server\Http\Listener\BeforeRequest->handle(Object(Imi\Swoole\Server\Event\Param\RequestEventParam))
imi-swoole-pgsql-raw: #7 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Server.php(125): Imi\Server\Contract\BaseServer->trigger('request', Array, Object(Server__Bean__29), 'Imi\\Swoole\\Serv...')
imi-swoole-pgsql-raw: #8 [internal function]: Imi\Swoole\Server\Http\Server->Imi\Swoole\Server\Http\{closure}(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
imi-swoole-pgsql-raw: #9 {main}  
imi-swoole-pgsql-raw: [2023-11-29 18:19:32] imi.ERROR: PDOException: SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected
imi-swoole-pgsql-raw: DETAIL:  Process 341 waits for ShareLock on transaction 1037; blocked by process 313.
imi-swoole-pgsql-raw: Process 313 waits for ExclusiveLock on tuple (7,70) of relation 16416 of database 16384; blocked by process 370.
imi-swoole-pgsql-raw: Process 370 waits for ShareLock on transaction 1028; blocked by process 440.
imi-swoole-pgsql-raw: Process 440 waits for ShareLock on transaction 1170; blocked by process 106.
imi-swoole-pgsql-raw: Process 106 waits for ShareLock on transaction 1149; blocked by process 110.
imi-swoole-pgsql-raw: Process 110 waits for ShareLock on transaction 1072; blocked by process 260.
imi-swoole-pgsql-raw: Process 260 waits for ShareLock on transaction 1036; blocked by process 371.
imi-swoole-pgsql-raw: Process 371 waits for ShareLock on transaction 1085; blocked by process 237.
imi-swoole-pgsql-raw: Process 237 waits for ShareLock on transaction 1108; blocked by process 341.
imi-swoole-pgsql-raw: HINT:  See server log for query details.
imi-swoole-pgsql-raw: CONTEXT:  while rechecking updated tuple (127,2) in relation "world" in /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php:146
imi-swoole-pgsql-raw: Stack trace:
imi-swoole-pgsql-raw: #0 /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php(146): PDOStatement->execute()
imi-swoole-pgsql-raw: #1 /imi/ApiServer/Controller/PgController.php(194): Imi\Pgsql\Db\Drivers\PdoPgsql\Statement->execute(Array)
imi-swoole-pgsql-raw: #2 /imi/vendor/imiphp/imi/src/Util/DelayServerBeanCallable.php(86): ImiApp\ApiServer\Controller\PgController->pgUpdateRaw(20)
imi-swoole-pgsql-raw: #3 /imi/vendor/imiphp/imi/src/Server/Http/Middleware/ActionMiddleware.php(79): Imi\Util\DelayServerBeanCallable->__invoke('20')
imi-swoole-pgsql-raw: #4 /imi/vendor/imiphp/imi/src/Server/Http/Dispatcher.php(68): Imi\Server\Http\Middleware\ActionMiddleware->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest), Object(Imi\Swoole\Http\Message\SwooleResponse))
imi-swoole-pgsql-raw: #5 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Listener/BeforeRequest.php(49): Imi\Server\Http\Dispatcher->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest))
imi-swoole-pgsql-raw: #6 /imi/vendor/imiphp/imi/src/Event/TEvent.php(202): Imi\Swoole\Server\Http\Listener\BeforeRequest->handle(Object(Imi\Swoole\Server\Event\Param\RequestEventParam))
imi-swoole-pgsql-raw: #7 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Server.php(125): Imi\Server\Contract\BaseServer->trigger('request', Array, Object(Server__Bean__29), 'Imi\\Swoole\\Serv...')
imi-swoole-pgsql-raw: #8 [internal function]: Imi\Swoole\Server\Http\Server->Imi\Swoole\Server\Http\{closure}(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
imi-swoole-pgsql-raw: #9 {main}  
imi-swoole-pgsql-raw: [2023-11-29 18:19:33] imi.ERROR: PDOException: SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected
imi-swoole-pgsql-raw: DETAIL:  Process 313 waits for ExclusiveLock on tuple (7,70) of relation 16416 of database 16384; blocked by process 370.
imi-swoole-pgsql-raw: Process 370 waits for ShareLock on transaction 1028; blocked by process 440.
imi-swoole-pgsql-raw: Process 440 waits for ShareLock on transaction 1170; blocked by process 106.
imi-swoole-pgsql-raw: Process 106 waits for ShareLock on transaction 1149; blocked by process 110.
imi-swoole-pgsql-raw: Process 110 waits for ShareLock on transaction 1096; blocked by process 244.
imi-swoole-pgsql-raw: Process 244 waits for ShareLock on transaction 1189; blocked by process 236.
imi-swoole-pgsql-raw: Process 236 waits for ShareLock on transaction 1037; blocked by process 313.
imi-swoole-pgsql-raw: HINT:  See server log for query details. in /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php:146
imi-swoole-pgsql-raw: Stack trace:
imi-swoole-pgsql-raw: #0 /imi/vendor/imiphp/imi/src/Db/Drivers/TPdoStatement.php(146): PDOStatement->execute()
imi-swoole-pgsql-raw: #1 /imi/ApiServer/Controller/PgController.php(194): Imi\Pgsql\Db\Drivers\PdoPgsql\Statement->execute(Array)
imi-swoole-pgsql-raw: #2 /imi/vendor/imiphp/imi/src/Util/DelayServerBeanCallable.php(86): ImiApp\ApiServer\Controller\PgController->pgUpdateRaw(20)
imi-swoole-pgsql-raw: #3 /imi/vendor/imiphp/imi/src/Server/Http/Middleware/ActionMiddleware.php(79): Imi\Util\DelayServerBeanCallable->__invoke('20')
imi-swoole-pgsql-raw: #4 /imi/vendor/imiphp/imi/src/Server/Http/Dispatcher.php(68): Imi\Server\Http\Middleware\ActionMiddleware->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest), Object(Imi\Swoole\Http\Message\SwooleResponse))
imi-swoole-pgsql-raw: #5 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Listener/BeforeRequest.php(49): Imi\Server\Http\Dispatcher->dispatch(Object(Imi\Swoole\Http\Message\SwooleRequest))
imi-swoole-pgsql-raw: #6 /imi/vendor/imiphp/imi/src/Event/TEvent.php(202): Imi\Swoole\Server\Http\Listener\BeforeRequest->handle(Object(Imi\Swoole\Server\Event\Param\RequestEventParam))
imi-swoole-pgsql-raw: #7 /imi/vendor/imiphp/imi-swoole/src/Server/Http/Server.php(125): Imi\Server\Contract\BaseServer->trigger('request', Array, Object(Server__Bean__29), 'Imi\\Swoole\\Serv...')
imi-swoole-pgsql-raw: #8 [internal function]: Imi\Swoole\Server\Http\Server->Imi\Swoole\Server\Http\{closure}(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
imi-swoole-pgsql-raw: #9 {main}  
# Use dockerfile
FROM php:8.3-cli

ENV SWOOLE_VERSION 5.1.1
ARG TFB_TEST_DATABASE
ENV TFB_TEST_DATABASE=${TFB_TEST_DATABASE}

RUN apt -yqq update && \
    apt upgrade -y && \
    apt -yqq install git unzip libpq-dev

RUN docker-php-ext-install -j$(nproc) pdo_pgsql opcache mysqli

RUN cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
        && cd swoole-src-${SWOOLE_VERSION} \
        && phpize && ./configure --enable-swoole-pgsql && make -j install \
        && docker-php-ext-enable swoole

COPY . /imi
COPY php.ini /usr/local/etc/php/

RUN chmod -R ug+rwx /imi/.runtime

WORKDIR /imi

COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
RUN composer install --no-dev --classmap-authoritative --quiet
RUN composer require imiphp/imi-swoole:~2.1.0 -W
RUN composer dumpautoload -o

EXPOSE 8080

CMD ./run-swoole.sh


<!-- If you do not submit according to the template, the issue will be closed. -->
Yurunsoft commented 7 months ago

This problem is very strange. Transactions are not used in the code. It is not clear why a deadlock occurs.

Yurunsoft commented 6 months ago

I saw this PR was merged, maybe this is a sporadic issue. If there are still problems later, you can reopen this issue.