keycloak / keycloak-benchmark

Keycloak Benchmark
https://www.keycloak.org/keycloak-benchmark/
Apache License 2.0
128 stars 71 forks source link

Performance problem with Amazon JDBC wrapper version 2.3.4 #734

Open ahus1 opened 6 months ago

ahus1 commented 6 months ago

Describe the bug

When using the wrapper, it seems that this is becoming a bottleneck for database interactions.

Version

main

Expected behavior

Performance should be similar to when not using the wrapper

Actual behavior

All threads block on a global lock in the wrapper.

"pool-11-thread-29" #207 prio=5 os_prio=0 cpu=24970.50ms elapsed=1270.97s tid=0x00007fe5e80293b0 nid=0x273 waiting on condition  [0x00007fe42f8f6000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@17.0.10/Native Method)
    - parking to wait for  <0x000000075ba39bb0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(java.base@17.0.10/LockSupport.java:211)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@17.0.10/AbstractQueuedSynchronizer.java:715)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@17.0.10/AbstractQueuedSynchronizer.java:938)
    at java.util.concurrent.locks.ReentrantLock$Sync.lock(java.base@17.0.10/ReentrantLock.java:153)
    at java.util.concurrent.locks.ReentrantLock.lock(java.base@17.0.10/ReentrantLock.java:322)
    at software.amazon.jdbc.util.WrapperUtils.executeWithPlugins(WrapperUtils.java:236)
    at software.amazon.jdbc.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:613)
    at io.agroal.pool.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:658)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:153)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:155)
    at org.hibernate.sql.exec.spi.JdbcSelectExecutor.lambda$scroll$1(JdbcSelectExecutor.java:102)
    at org.hibernate.sql.exec.spi.JdbcSelectExecutor$$Lambda$2286/0x00007fe629f4b4e8.apply(Unknown Source)
    at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:231)
    at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:167)
    at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:218)
    at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:98)
    at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19)
    at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66)
    at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:51)
    at org.hibernate.query.internal.ScrollableResultsIterator.hasNext(ScrollableResultsIterator.java:33)
    at java.util.Iterator.forEachRemaining(java.base@17.0.10/Iterator.java:132)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(java.base@17.0.10/Spliterators.java:1845)
    at java.util.stream.AbstractPipeline.copyInto(java.base@17.0.10/AbstractPipeline.java:509)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@17.0.10/AbstractPipeline.java:499)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@17.0.10/ReduceOps.java:921)
    at java.util.stream.AbstractPipeline.evaluate(java.base@17.0.10/AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(java.base@17.0.10/ReferencePipeline.java:682)
    at org.keycloak.utils.ClosingStream.collect(ClosingStream.java:182)
    at org.keycloak.models.jpa.JpaRealmProvider.getClientScopes(JpaRealmProvider.java:1106)
    at org.keycloak.models.jpa.JpaRealmProvider.addClientScopes(JpaRealmProvider.java:1068)
    at org.keycloak.storage.ClientStorageManager.addClientScopes(ClientStorageManager.java:265)
    at org.keycloak.models.cache.infinispan.RealmCacheSession.addClientScopes(RealmCacheSession.java:1417)
    at org.keycloak.models.jpa.ClientAdapter.addClientScopes(ClientAdapter.java:356)
    at org.keycloak.protocol.AbstractLoginProtocolFactory.lambda$addDefaultClientScopes$2(AbstractLoginProtocolFactory.java:88)
    at org.keycloak.protocol.AbstractLoginProtocolFactory$$Lambda$2448/0x00007fe629f8eb88.accept(Unknown Source)
    at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(java.base@17.0.10/Streams.java:411)
    at java.util.stream.ReferencePipeline$Head.forEach(java.base@17.0.10/ReferencePipeline.java:762)
    at org.keycloak.protocol.AbstractLoginProtocolFactory.addDefaultClientScopes(AbstractLoginProtocolFactory.java:94)
    at org.keycloak.protocol.AbstractLoginProtocolFactory.addDefaultClientScopes(AbstractLoginProtocolFactory.java:76)
    at org.keycloak.protocol.AbstractLoginProtocolFactory$1.onEvent(AbstractLoginProtocolFactory.java:51)
    at org.keycloak.services.DefaultKeycloakSessionFactory.publish(DefaultKeycloakSessionFactory.java:91)
    at org.keycloak.models.jpa.ClientAdapter.setProtocol(ClientAdapter.java:266)
    at org.keycloak.models.utils.RepresentationToModel.createClient(RepresentationToModel.java:354)
    at org.keycloak.models.utils.RepresentationToModel.createClient(RepresentationToModel.java:313)
    at org.keycloak.services.managers.ClientManager.createClient(ClientManager.java:82)
    at org.keycloak.benchmark.dataset.DatasetResourceProvider.createClients(DatasetResourceProvider.java:983)
    at org.keycloak.benchmark.dataset.DatasetResourceProvider.lambda$createClientsImpl$8(DatasetResourceProvider.java:313)
    at org.keycloak.benchmark.dataset.DatasetResourceProvider$$Lambda$3376/0x00007fe62a2feb58.run(Unknown Source)
    at org.keycloak.models.utils.KeycloakModelUtils.lambda$runJobInTransaction$1(KeycloakModelUtils.java:257)
    at org.keycloak.models.utils.KeycloakModelUtils$$Lambda$2230/0x00007fe629ef8880.run(Unknown Source)
    at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithResult(KeycloakModelUtils.java:379)
    at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:256)
    at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithTimeout(KeycloakModelUtils.java:398)
    at org.keycloak.benchmark.dataset.ExecutorHelper.lambda$addTaskRunningInTransaction$0(ExecutorHelper.java:58)
    at org.keycloak.benchmark.dataset.ExecutorHelper$$Lambda$3377/0x00007fe62a2fed80.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.10/Executors.java:539)
    at java.util.concurrent.FutureTask.run(java.base@17.0.10/FutureTask.java:264)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.10/ThreadPoolExecutor.java:1136)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.10/ThreadPoolExecutor.java:635)
    at java.lang.Thread.run(java.base@17.0.10/Thread.java:840)

How to Reproduce?

In the preparation phase on the nightly run, create a thread dump for using kill -3 1 in the Pod.

Anything else?

See upstream issue https://github.com/awslabs/aws-advanced-jdbc-wrapper/issues/921