如何防止从 close_wait 连接打开太多文件

Posted

技术标签:

【中文标题】如何防止从 close_wait 连接打开太多文件【英文标题】:How prevent too many file open from close_wait connections 【发布时间】:2020-06-25 19:44:13 【问题描述】:

我的程序正在通过他们的Java SDK 在 min.io 服务器上获取一些图像。

问题是即使在inputStream.close() 之后,Java 代码中的连接仍然保持打开状态。我可以通过lsof -p <PID> 看到它。

一段时间后,它消失了,但有时它不会消失,我猜速度足够快,并且 java 服务器会抛出一些 too many open files 错误。

有没有像垃圾收集器一样从操作系统中删除连接? 如何防止这些too many open files 错误?

以防万一,代码如下:

public static byte[] getImageByImageBinaryId(String imagId) throws IOException 
    InputStream object = null;

    try 
        object = getMinioClientClient().getObject(ServerProperties.MINIO_BUCKET_NAME, imagId);
        return IOUtils.toByteArray(object);
     catch (Exception e) 
        log.error(e);
     finally 
        IOUtils.closeQuietly(object);
    

    return null;

【问题讨论】:

【参考方案1】:

minio-java 内部使用 OkHttp 进行 HTTP 调用。 OkHttp 与许多 Http 客户端一样,在内部使用连接池来加速对同一位置的重复调用。如果您需要不持久的连接,您可以将您自己的 OkHttp 客户端传递给具有您自己的池配置的可用构造函数之一,但我不推荐它。

Minio 可能应该公开一个 close 方法来清理这些资源,但它们的预期用例可能涉及客户在您的应用程序的整个生命周期中。

【讨论】:

以上是关于如何防止从 close_wait 连接打开太多文件的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接(转)

windows server 2008 如何关闭 CLOSE_WAIT 状态的连接

Too many open files (CLOSE_WAIT过多)的解决方案:修改打开文件数的上限值调整TCP/IP的参数

码头 9.0.3 中的 Close_wait 太多

如何删除 CLOSE_WAIT 套接字连接

web服务器出现大量CLOSE_WAIT连接的前因后果