|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
DoTheTwist : 1 Новичок
|
Янв 25, 2012 15:18 |
|
|
Доброго времени, суток.
Ситуация следующая. Написан сервер на Netty, который при подключении клиента отправляет ему каждые 2 микросекунды сообщение ( создаем нагрузку около 500К сообщений в секунду ). Используется текстовый, открытый протокол, размеры сообщения ~100 байт каждое. Используя написанный третьими лицами клиент обрабатывает ~400k сообщений в секунду. Собственно проблема появилась при написании собственного клиента на Netty. Наивная реализация может обработать около 3к сообщений в секунду, что совсем неудовлетворительно. Клиент и сервер запущены на 1 сервере. Код клиента ниже :
| Код: |
[b]Client.java[/b]
public class Client {
private static ClientBootstrap bootstrap;
private static Channel connector;
public static final int MIN_READ_BUFFER_SIZE = 64;
public static final int INITIAL_READ_BUFFER_SIZE = 16384;
public static final int MAX_READ_BUFFER_SIZE = 655360;
public static boolean start()
{
ChannelFactory factory =
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
bootstrap = new ClientBootstrap(factory);
bootstrap.setPipelineFactory( new ClientPipelineFactory() );
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("receiveBufferSize", 1048576);
bootstrap.setOption(
"child.receiveBufferSizePredictorFactory",
new AdaptiveReceiveBufferSizePredictorFactory(
MIN_READ_BUFFER_SIZE,
INITIAL_READ_BUFFER_SIZE,
MAX_READ_BUFFER_SIZE)
);
ChannelFuture future = bootstrap
.connect(new InetSocketAddress("127.0.0.1", 9013));
if (!future.awaitUninterruptibly().isSuccess()) {
System.out.println("--- CLIENT - Failed to connect to server at " +
"localhost:9013.");
bootstrap.releaseExternalResources();
return false;
}
connector = future.getChannel();
return connector.isConnected();
}
public static void main( String[] args )
{
boolean started = start();
if ( started )
System.out.println( "Client connected to the server" );
}
}
[b]ClientPipelineFactory.java[/b]
public class ClientPipelineFactory implements ChannelPipelineFactory{
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
1024, Delimiters.lineDelimiter()));
// and then business logic.
pipeline.addLast("handler", new ItchMessageHandler() );
return pipeline;
}
}
|
Handler сообщений совсем простой, в messageReceived просто считается пропускная способность.
Обращаюсь к знающим людям : как можно увеличить пропускную способность? Дело не в сервере, так как чужой клиент может обрабатывать 400к сообщений |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Сети |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|