[
https://issues.apache.org/jira/browse/THRIFT-1167?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Steve Jiang updated THRIFT-1167:
--------------------------------
Attachment: threadedselectorthrift3.diff
Sure, this is an architecture similar to that used by other high-throughput
servers. Here's a brief summary of the changes from HsHa:
THsHaServer has an async selector thread that is responsible for accepting new
connections and selecting for IO, reading until full request frames are
buffered. It then hands off processing to a worker pool (executor) to service
the requests.
The threaded selector server splits the role of the selector thread into
multiple threads:
An accept thread responsible for accepting connections on the listen socket and
handing them off to Selector threads
A collection of (rather than one) Selector threads each responsible for a
subset of connected client sockets.
The worker pool (Executor) remains, handling invocations once requests have
been read.
This solves two potential issues with HsHa:
1. In an RPC-heavy app server where the thrift processor does relatively little
work (e.g. a service for generating UUIDs), a significant portion of CPU time
is spent handling selection on sockets and doing reading/writing from the
network. The HsHa server handles selection on all sockets and IO on a single
thread, which on a multi-core platform limits the request throughput to a
single core. This leaves the worker pool that can run on the remaining cores
underutilized. Having socket selection and IO split across multiple threads
increases maximum throughput in these situations.
2. The HsHa server accepts connections on the selector thread as fast as
possible, even when the executor service is saturated and starts throwing
RejectedExecutionException. In this case connections are closed whenever
exceptions are thrown (after a request has already been read on the connection)
potentially causing a lot of flapping. The FAIR_ACCEPT accept policy in the new
server submits the accept socket handoff to the same executor service that
handles invocations, which results in a close of a new connection immediately
if the executor is saturated.
A potential downside to this design is there are additional context switches
because accept happens on a separate thread.
> Java nonblocking server with more than one thread for select and handling IO
> ----------------------------------------------------------------------------
>
> Key: THRIFT-1167
> URL: https://issues.apache.org/jira/browse/THRIFT-1167
> Project: Thrift
> Issue Type: New Feature
> Components: Java - Library
> Reporter: Steve Jiang
> Assignee: Bryan Duxbury
> Attachments: threadedselectorthrift3.diff
>
>
> I've used the HsHa server model to write a server that uses a thread for
> accept and a separate, configurable number of Selector threads to handle IO.
> I'd like to contribute this back to Thrift.
> For apps that are RPC-heavy and require little computation from the executor
> pool running on multi-core architectures, this server allows gets throughput
> as IO is not limited by one CPU.
> Please take a look at the attached patch.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira