[ 
https://issues.apache.org/jira/browse/CASSJAVA-145?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18137580#comment-18137580
 ] 

Jeff Shaw commented on CASSJAVA-145:
------------------------------------

I created a downstream issue and PR for Scylla.
https://github.com/scylladb/java-driver/issues/1362
https://github.com/scylladb/java-driver/pull/1361

> Reduce CPU cost of DefaultLoadBalancingPolicy query plans
> ---------------------------------------------------------
>
>                 Key: CASSJAVA-145
>                 URL: https://issues.apache.org/jira/browse/CASSJAVA-145
>             Project: Apache Cassandra Java driver
>          Issue Type: Improvement
>            Reporter: Jeff Shaw
>            Assignee: Jeff Shaw
>            Priority: Normal
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> I have an application that I need to run insert queries as efficiently as 
> possible. Using a Java Flight Recorder profile of the Scylla client version 
> 4.17.0, I found that DefaultLoadBalancingPolicy.newQueryPlan() used 38% of 
> the CPU time. This ticket aims to reduce that without changing the query plan 
> order. The Scylla client uses the Cassandra client as an upstream library, so 
> I want to do as much work as possible here first.
> The first optimization I found is to avoid ArrayUtils.rotate()'s O(n^2) 
> implementation, where n is the number of live nodes in the local data center. 
> The way I think this could be done efficiently is to instead introduce a new 
> class that provides elements in the rotated order as they are requested. This 
> makes the worst case O( n ), but many cases won't need to produce all n 
> values.
> A second optimization is to rewrite ArrayUtils.bubbleDown() and bubbleUp() 
> using System.arraycopy().
> A third optimization in newQueryPlan() is to exit the replica scan once all 
> replicas are found.
> Optionally, I thought maybe a good optimization would be to reorder the 
> method calls in isUnhealthy() to call isResponseRateInsufficient() first. 
> With that change, some calls to getInFlight() will be skipped.
> Following are benchmark results for when a busy node has a sufficient 
> response rate in 4.x and then after a draft implementation for this ticket.
>  
> ||node count||before (ns)||after (ns)||
> |3|82|71|
> |10|176|115|
> |20|483|134|
> |50|2460|197|
> For 3 nodes, reordering isUnhealthy() causes some regressions when nodes 
> aren't busy: from 59 to 86 ns with an insufficient response rate, and from 57 
> to 73 ns with a sufficient one.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to