Netty如何处理"Last write attempt timed out; force-closing the connection."异常?
How to deal with Netty "Last write attempt timed out; force-closing the connection." exception?
最近部署后,我在我的生产服务器上发现了很多这样的错误:
Last write attempt timed out; force-closing the connection.
目前我每小时从不同的主机收到大约 5 个这样的错误。
我查看了 Netty SslHandler
中的代码,发现当 close_notify
事件未完全发送到接收方时(根据评论),预计会发生此异常。
但是,我以前从未见过这个错误。这让我认为这可能是某种错误的管道配置问题。所以目前,我不确定是我的错误还是网络问题。
Netty 版本 4.1.22.Final
使用 netty-tcnative-boringssl-static 2.0 启用了 Epoll 和 ssl。7.Final
我做了很少的单元测试,但没有任何运气。
有人有线索吗?
除了延长超时时间外,您无能为力。这意味着您无法以足够快的速度将数据写出到远程对等点,这很可能意味着远程对等点的读取速度不够快。另一个原因可能是您阻塞了 EventLoop,因此它无法及时取得任何进展。
经过一些调查,我能够解决问题。似乎问题出在管道配置中。
管道有错误:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(appChannelStateHandler);
没有问题的管道:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(appChannelStateHandler)
.addLast(sslCtx.newHandler(ch.alloc()))
其中 appChannelStateHandler
是 ChannelInboundHandlerAdapter
:
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
log.trace("State handler. App timeout disconnect. Event : {}. Closing.", ((IdleStateEvent) evt).state());
ctx.close();
} else {
ctx.fireUserEventTriggered(evt);
}
}
问题可能是 ctx.close();
在 SslHandler
和 appChannelStateHandler
中都被调用了。至少这是首先想到的。我仍然不确定 - 是网络问题还是错误的管道配置?无论如何,我无法在本地重现该问题。
最近部署后,我在我的生产服务器上发现了很多这样的错误:
Last write attempt timed out; force-closing the connection.
目前我每小时从不同的主机收到大约 5 个这样的错误。
我查看了 Netty SslHandler
中的代码,发现当 close_notify
事件未完全发送到接收方时(根据评论),预计会发生此异常。
但是,我以前从未见过这个错误。这让我认为这可能是某种错误的管道配置问题。所以目前,我不确定是我的错误还是网络问题。
Netty 版本 4.1.22.Final
使用 netty-tcnative-boringssl-static 2.0 启用了 Epoll 和 ssl。7.Final
我做了很少的单元测试,但没有任何运气。
有人有线索吗?
除了延长超时时间外,您无能为力。这意味着您无法以足够快的速度将数据写出到远程对等点,这很可能意味着远程对等点的读取速度不够快。另一个原因可能是您阻塞了 EventLoop,因此它无法及时取得任何进展。
经过一些调查,我能够解决问题。似乎问题出在管道配置中。
管道有错误:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(appChannelStateHandler);
没有问题的管道:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(appChannelStateHandler)
.addLast(sslCtx.newHandler(ch.alloc()))
其中 appChannelStateHandler
是 ChannelInboundHandlerAdapter
:
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
log.trace("State handler. App timeout disconnect. Event : {}. Closing.", ((IdleStateEvent) evt).state());
ctx.close();
} else {
ctx.fireUserEventTriggered(evt);
}
}
问题可能是 ctx.close();
在 SslHandler
和 appChannelStateHandler
中都被调用了。至少这是首先想到的。我仍然不确定 - 是网络问题还是错误的管道配置?无论如何,我无法在本地重现该问题。