【问题标题】:Netty socket generate Close_wait statusNetty socket 生成 Close_wait 状态
【发布时间】:2016-06-17 02:55:36
【问题描述】:

我的应用程序 java,正在服务器中运行,打开端口并通过套接字与设备建立连接。一切都运行到某个点,很多连接都停留在 CLOSE_WAIT 中,即使我的应用程序完成了我收到的数据包的处理。

我说的是CPU开始使用双资源,打开的文件越来越多,CLOSE_WAIT状态的数量也越来越多。

在wireshark中,发送的数据包离开CLOSE_WAIT状态,我们看到服务器没有向客户端发送FIN。

PS:我在 ubuntu 14.04 可信赖的服务器上,我使用的是 Netty 3.10.1

这是我制作管道的代码:

@Override
public ChannelPipeline getPipeline() {
    ChannelPipeline pipeline = Channels.pipeline();
    if (resetDelay != null) {
        pipeline.addLast("idleHandler", new IdleStateHandler(GlobalTimer.getTimer(), resetDelay, 0, 0));
    }
    pipeline.addLast("openHandler", new OpenChannelHandler(server));
    if (loggerEnabled) {
        pipeline.addLast("logger", new StandardLoggingHandler());
    }
    addSpecificHandlers(pipeline);
    if (filterHandler != null) {
        pipeline.addLast("filter", filterHandler);
    }
    if (reinitializeHandler != null) {
        pipeline.addLast("reinitialize", reinitializeHandler);
    }
    if (refineHandler != null) {
        pipeline.addLast("refine", refineHandler);
    }
    if (noFilterHandler != null) {
        pipeline.addLast("nofilter", noFilterHandler);
    }
    if (specificFilterHandler != null) {
        pipeline.addLast("specificfilter", specificFilterHandler);
    }
    if (reverseGeocoder != null) {
        pipeline.addLast("geocoder", new ReverseGeocoderHandler(reverseGeocoder, processInvalidPositions));
    }
    pipeline.addLast("handler", new TrackerEventHandler(dataManager));
    return pipeline;
}

【问题讨论】:

    标签: java linux sockets tcp netty


    【解决方案1】:

    您的应用程序因未能关闭套接字而泄漏套接字。所以关闭它们。他们都是。在 finally 块中。当您读取流的结尾或在套接字上获得任何IOException 操作时。

    【讨论】:

      【解决方案2】:

      CLOSE_WAIT 表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它这样做)。将 -p 添加到 netstat 以获取 pid,然后更强有力地终止它(如果需要,使用 SIGKILL)。那应该摆脱您的 CLOSE_WAIT 套接字。您也可以使用 ps 来查找 pid。

      SO_REUSEADDR 用于服务器和 TIME_WAIT 套接字,因此不适用于此处。

      其他回复请参阅this thread

      检查您的应用程序代码以检查您是否在处理完客户端会话后对所有创建的套接字显式调用 close。

      【讨论】:

      • 应用程序正在与许多设备进行通信,正如我所说的,直到某一点,一切都正常进行,这意味着我的应用程序关闭了连接。我也无法杀死,因为我的应用程序正在与服务器正确关闭与它们的连接的其他设备进行通信。
      • 你能分享你负责客户端处理的代码的sn-ps吗?
      • 我们没有客户端代码,因为它是由一个设备 (GPS) 处理的,该设备有一个由我们的提供商制作的程序。但是我们知道这个问题来自我们的服务器,它有时没有关闭连接(通过 Netty)
      • @EspritBat 你能在你构建 netty 管道的地方添加你的代码吗?
      • 即使 TCP/IP 是“面向连接”的协议,通常也不会通过空闲连接发送数据。您可以让一个套接字打开一年,而 IP 堆栈不会通过它发送一个比特。为了注意到连接丢失,您必须在应用程序级别发送一些数据。(*)尝试使用示例来实现某种应用程序级别的保活机制。
      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多