[ 
https://issues.apache.org/jira/browse/CASSANDRA-1358?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12895419#action_12895419
 ] 

Jonathan Ellis commented on CASSANDRA-1358:
-------------------------------------------

bq. So are the message deserializer threads blocking on a response from (or 
pushing a task onto a queue for) a different thread pool then?

yes.

bq. If the intent is to have a single threaded executor, the second argument 
should be 1

true, but possibly moot, because:

bq. it's unable to process gossip requests / responses in a timely manner

good point.  we have a separate connection for gossip and acks so they won't be 
blocked by a large request on the outbound path, but combining them both 
through the same MDP on the inbound side defeats that to a large degree.

probably we should just get rid of MDP, and do the deserialize on the 
IncomingTcpConnection thread.  (This would require moving the flow control from 
CASSANDRA-685 / CASSANDRA-1284 into RMVH / RVH.)


> Message deserializer pool will never grow beyond a single thread.
> -----------------------------------------------------------------
>
>                 Key: CASSANDRA-1358
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-1358
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: Core
>    Affects Versions: 0.6.3
>         Environment: All.
>            Reporter: Mike Malone
>            Priority: Minor
>
> The message deserialization process can become a bottleneck that prevents 
> efficient resource utilization because the executor that manages the 
> deserialization process will never grow beyond a single thread. The message 
> deserializer executor is instantiated in the MessagingService constructor as 
> a JMXEnableThreadPoolExecutor, which extends 
> java.util.concurrent.ThreadPoolExecutor. The thread pool is instantiated with 
> a corePoolSize of 1 and a maximumPoolSize of 
> Runtime.getRuntime().availableProcessors(). But, according to the 
> ThreadPoolExecutor documentation "using an unbounded queue (for example a 
> LinkedBlockingQueue without a predefined capacity) will cause new tasks to be 
> queued in cases where all corePoolSize threads are busy. Thus, no more than 
> corePoolSize threads will ever be created. (And the value of the 
> maximumPoolSize therefore doesn't have any effect.)"
> The message deserializer pool uses a LinkedBlockingQueue, so there will never 
> be more than one deserialization thread. This issue became a problem in our 
> production cluster when the MESSAGE-DESERIALIZER-POOL began to back up on a 
> node that was only lightly loaded. We increased the core pool size to 4 and 
> the situation improved, but the deserializer pool was still backing up while 
> the machine was not fully utilized (less than 100% CPU utilization). This 
> leads me to think that the deserializer thread is blocking on some sort of 
> I/O, which seems like it shouldn't happen.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to