C3P0 Очевидная взаимоблокировка

Мой сервер раньше видел APPARENT DEADLOCK в журналах. У меня есть несколько серверов, работающих за балансировщиком нагрузки, и, что интересно, я вижу, что DEADLOCK происходит на всех серверах одновременно (кто-нибудь знает, почему это влияет на все серверы)?. В течение этого периода запросы MySQL, которые обычно занимают 200 мс, занимают> 60 секунд. Вот как тогда выглядели логи:

com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@58780f76
 -- APPARENT DEADLOCK!!! Complete Status: 
        Managed Threads: 3
        Active Threads: 3
        Active Tasks: 
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@25ff87d4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@10ccf7ef (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@3305ec37 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
        Pending Tasks: 
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@39cc9e5a
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@60d46f90
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@17509fea
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@b28bd63
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@56cbdc12
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@15a091b4
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@61ce325
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@48119520
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@4032fb7c
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@518eefff
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@30ea3b20
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@74960088
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@23a8fc7d
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@5ff0ee0
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@642d0644
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@207bc809
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@44d4936f
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@39a10d1b
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@3532334d
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@4bf79e62
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@2bd83398
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@1a202a2d
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@3eacda7f
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@495f5746
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@23f1f906

Итак, я пришел к Stack Overflow и нашел этот ответ, который предложил я установил statementCacheNumDeferredCloseThreads на 1. Я сделал это и вижу DEADLOCK реже и только на нескольких серверах за балансировщиком нагрузки, а не на всех.

Журналы теперь выглядят немного иначе, но в период DEADLOCK запросы по-прежнему очень длинные:

10 Oct 2018 06:33:32,037 [WARN]  (Timer-0) com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4f39ad63 -- APPARENT DEADLOCK!!! Complete Status: 
        Managed Threads: 3
        Active Threads: 3
        Active Tasks: 
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@34dee200 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@3727ee6b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@4afb8b9 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        Pending Tasks: 
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@384a3b5b
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@7bc700b0
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@731bfd15
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@a88e9bf
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@63f18b56
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@20f0c518
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@caf7746
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@41a7a27d
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@2ee32a24
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@81df2e5
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7f7fa1e7
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@337503f
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@34b2f877
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@53dfbede
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@512d5ddb
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@68a25969
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@4bf0754a
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@65770ba4
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@5e0f4154
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@249c22ed
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@6c8e5911
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@3179550f
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@15d8a795
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@50966489
                com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@4ecee95b
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StmtAcquireTask@35640ca0
                com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@6550f196
                com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@6816399
                com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@3fbcd623
Pool thread stack traces:
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
                com.mysql.jdbc.PreparedStatement.realClose(PreparedStatement.java:2765)
                com.mysql.jdbc.StatementImpl.close(StatementImpl.java:541)
                com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:41)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask.run(GooGooStatementCache.java:404)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
                com.mysql.jdbc.PreparedStatement.realClose(PreparedStatement.java:2765)
                com.mysql.jdbc.StatementImpl.close(StatementImpl.java:541)
                com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:41)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask.run(GooGooStatementCache.java:404)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
                com.mysql.jdbc.PreparedStatement.realClose(PreparedStatement.java:2765)
                com.mysql.jdbc.StatementImpl.close(StatementImpl.java:541)
                com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:41)
                com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask.run(GooGooStatementCache.java:404)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

Есть идеи, как это исправить? Я мог бы попробовать вообще отключить кеширование операторов, но меня беспокоит общее снижение производительности. Некоторые другие важные параметры:

minPoolSize = 30
maxPoolSize = 30
maxStatements = 100
unreturnedConnectionTimeout = 500
idleConnectionTestPeriod = 60
acquireIncrements = 3
C3p0 version = 0.9.1.2

Редактировать: Я забыл упомянуть, что во время этого улучшения, когда я видел меньше взаимоблокировок, я также увеличил maxStatements, что могло бы объяснить улучшение. Однако теперь я просто вижу https://github.com/swaldman/c3p0/issues/53, в котором говорится, что version 0.9.2 вводит этот новый параметр statementCacheNumDeferredCloseThreads. Моя версия слишком старая. Я не получаю предупреждений / ошибок о том, что этот параметр не существует.

Я закончил установку maxStatements = 0 и увеличил оборудование RDS MySQL. Когда мы увидели эту проблему, загрузка ЦП была на 100%.

Ryan Smith 24.04.2019 16:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
352
1

Ответы 1

Может уже поздно, но вы пробовали увеличить количество numHelperThreads?

Это не ответ, а комментарий.

Jonas 26.03.2019 20:51

Другие вопросы по теме