Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Netty 4: high and low write watermarks

I am working with Netty 4. I see folowing options of Netty server: WRITE_BUFFER_HIGH_WATER_MARK and WRITE_BUFFER_LOW_WATER_MARK.

The official page Related articles has link to Netty best practices (slides w/ video) by Norman Maurer. One of slides looks like this:

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);   

and has this preface:

Set sane WRITE_BUFFER_HIGH_WATER_MARK and WRITE_BUFFER_LOW_WATER_MARK

But what is it WRITE_BUFFER_HIGH_WATER_MARK and WRITE_BUFFER_LOW_WATER_MARK? And how to set them to be sane?

I did not find any clear information. Thanks for your help.

like image 654
DmitryKanunnikoff Avatar asked Aug 13 '14 08:08

DmitryKanunnikoff


2 Answers

Some information about watermarks from this article:

For instance, imagine you have a queue of tasks on server side that is filled by clients and processed by backend. In case clients send tasks too quick the length of the queue grows. One needs to introduce so named high watermark and low watermark. If queue length is greater than high watermark stop reading from sockets and queue length will decrease. When queue length becomes less than low watermark start reading tasks from sockets again.

Note, to make it possible for clients to adapt to speed you process tasks (actually to adapt window size) one shouldn't make a big gap between high and low watermarks. From the other side small gap means you'll be too often add/remove sockets from the event loop.

For Netty it seems to be true, because this JavaDoc for ChannelConfig says:

If the number of bytes queued in the write buffer exceeds writeBufferHighWaterMark value, Channel.isWritable() will start to return false.

And for low watermark:

Once the number of bytes queued in the write buffer exceeded the high water mark and then dropped down below this value, Channel.isWritable() will return true again.

About sanity, I think, it is relative question, that depends on information that you are sending through the channel and how often. There is no strict rules for what values you must define for that variables. So, I think, you must found your own values in practice. Slides show you one of the examples for that.

like image 61
Michael Zhavzharov Avatar answered Oct 16 '22 13:10

Michael Zhavzharov


WRITE_BUFFER_HIGH_WATER_MARK and WRITE_BUFFER_LOW_WATER_MARK

options and relative methods in ChannelConfig are deprecated.

.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1, 2))

that's how you do it.

like image 45
Ivan Avatar answered Oct 16 '22 13:10

Ivan