Я нагрузочно тестирую проект на основе Netty, ударяя по нему множеством одновременных GET
запросов.
При большой нагрузке я получаю много примеров этого:
WARNING: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
java.io.IOException: Connection reset by peer
at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:247)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1147)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
[snip]
Я понимаю, что сообщение об ошибке говорит мне, что последний элемент моего конвейера не обрабатывает это IOException
. В первую очередь я заинтересован в предотвращении ошибки.
Правильно ли я понимаю, что это означает, что по какой-то причине Нетти пытается прочитать из закрытого канала? Означает ли это, что мой инструмент нагрузочного тестирования закрыл сокет, в который он записал такие вещи, как заголовки запросов и т. Д., Пока Netty пытается читать из него, и поэтому Netty выдает это исключение?
Учитывая, что явидеть это только при большой нагрузке, означает ли это, что (например) мой цикл обработки событий слишком занят, чтобы фактически "отвечать на звонки", когда инструмент "нагрузочного тестирования" "звонит"? Если да, то почему он вообще пытается читать с канала?