KCFUN-138: ClientRequestQuotaManager jmh benchmark (#4594)
What Quota manager code has non-insignificant overhead on clusters with high request rate, we should benchmark and fix this~. Profiles of both prod clusters and profiles of local benchmarks show that most of the overhead is in string generation to retrieve sensors. Approach: ThreadUsageSensors We currently generate a sensor name to look up/create ThreadUsageSensors when recording values. This adds some amount of overhead in both the request handler thread and the network threads. These sensors are also created with an expiration time, which doesn't make sense because the number of these sensors is fixed and usually small (3 * (1 for request threads + # of listeners). Instead of generating these sensors lazily, we can just keep the thread usage sensors in-sync with the configured listeners. NetworkThreadCallback If we change the ordering in ClientRequestQuotaManager.record() and grab a reference to the recorded sensors, we can avoid performing the expensive sensor name creation in the network thread callback. Before: Benchmark Mode Cnt Score Error Units ClientRequestQuotaManagerBench.testNetworkThreadCallback avgt 15 940.726 ± 15.790 ns/op ClientRequestQuotaManagerBench.testNetworkThreadCallback:·async avgt NaN --- ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.alloc.rate avgt 15 2764.859 ± 75.832 MB/sec ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.alloc.rate.norm avgt 15 2880.003 ± 0.010 B/op ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.count avgt 15 997.000 counts ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.time avgt 15 1253.000 ms ClientRequestQuotaManagerBench.testRecord avgt 15 1240.281 ± 36.303 ns/op ClientRequestQuotaManagerBench.testRecord:·async avgt NaN --- ClientRequestQuotaManagerBench.testRecord:·gc.alloc.rate avgt 15 2452.718 ± 104.847 MB/sec ClientRequestQuotaManagerBench.testRecord:·gc.alloc.rate.norm avgt 15 3368.004 ± 0.014 B/op B/op ClientRequestQuotaManagerBench.testRecord:·gc.count avgt 15 1022.000 counts ClientRequestQuotaManagerBench.testRecord:·gc.time avgt 15 1224.000 ms JMH benchmarks done After: Benchmark Mode Cnt Score Error Units ClientRequestQuotaManagerBench.testNetworkThreadCallback avgt 15 54.259 ± 12.669 ns/op ClientRequestQuotaManagerBench.testNetworkThreadCallback:·async avgt NaN --- ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.alloc.rate avgt 15 0.004 ± 0.014 MB/sec ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.alloc.rate.norm avgt 15 ≈ 10⁻⁴ B/op ClientRequestQuotaManagerBench.testNetworkThreadCallback:·gc.count avgt 15 ≈ 0 counts ClientRequestQuotaManagerBench.testRecord avgt 15 548.622 ± 40.003 ns/op ClientRequestQuotaManagerBench.testRecord:·async avgt NaN --- ClientRequestQuotaManagerBench.testRecord:·gc.alloc.rate avgt 15 1489.022 ± 106.025 MB/sec ClientRequestQuotaManagerBench.testRecord:·gc.alloc.rate.norm avgt 15 896.077 ± 0.009 B/op ClientRequestQuotaManagerBench.testRecord:·gc.count avgt 15 864.000 counts ClientRequestQuotaManagerBench.testRecord:·gc.time avgt 15 855.000 ms JMH benchmarks done
显示
- ce-broker-plugins/src/main/java/io/confluent/kafka/multitenant/quota/TenantQuotaCallback.java 14 个添加, 12 个删除...onfluent/kafka/multitenant/quota/TenantQuotaCallback.java
- core/src/main/scala/kafka/server/ClientQuotaManager.scala 7 个添加, 6 个删除core/src/main/scala/kafka/server/ClientQuotaManager.scala
- core/src/main/scala/kafka/server/ClientRequestQuotaManager.scala 40 个添加, 27 个删除...c/main/scala/kafka/server/ClientRequestQuotaManager.scala
- core/src/main/scala/kafka/server/DynamicBrokerConfig.scala 3 个添加, 0 个删除core/src/main/scala/kafka/server/DynamicBrokerConfig.scala
- core/src/main/scala/kafka/server/QuotaFactory.scala 3 个添加, 1 个删除core/src/main/scala/kafka/server/QuotaFactory.scala
- core/src/main/scala/kafka/server/ThreadUsage.scala 89 个添加, 74 个删除core/src/main/scala/kafka/server/ThreadUsage.scala
- core/src/test/scala/unit/kafka/server/ConfluentClientRequestQuotaManagerTest.scala 27 个添加, 22 个删除...kafka/server/ConfluentClientRequestQuotaManagerTest.scala
- core/src/test/scala/unit/kafka/server/RequestQuotaTest.scala 4 个添加, 4 个删除core/src/test/scala/unit/kafka/server/RequestQuotaTest.scala
- jmh-benchmarks/src/main/java/org/apache/kafka/jmh/server/ClientRequestQuotaManagerBench.java 167 个添加, 0 个删除...ache/kafka/jmh/server/ClientRequestQuotaManagerBench.java
- jmh-benchmarks/src/main/java/org/apache/kafka/jmh/server/MultiTenantSaslSecretsLoaderBench.java 2 个添加, 2 个删除...e/kafka/jmh/server/MultiTenantSaslSecretsLoaderBench.java
加载中
想要评论请 注册 或 登录