It's rare but occasionally there are more than one reads and sometimes they fill up to half of the read buffer. So I believe it's prudent to increase the 8kb read buffer to 16k.

Note that the select() call returns only if there are newly ready SocketChannels ready to be read from, so if we don't fully drain the SocketChannel in a loop, that data just sits there and clogs the connection.

Note that we're now less sure that the previous code actually introduced much latency or "clogs" (see OP), it's hard to know exactly how the selector works. But we agreed this change is a good thing, regardless.