【问题标题】:What causes ch.ethz.ssh2.Connection to have a hang time?是什么导致 ch.ethz.ssh2.Connection 有挂起时间?
【发布时间】:2017-11-18 03:35:20
【问题描述】:

我目前正在使用 ch.ethz.ssh2.Connection 连接到我在 java 中的服务器。有时它会挂在一台服务器上。(可能需要 10-15 秒)。我想知道导致此挂起时间的原因以及如何避免它。

连接示例

    conn = new ch.ethz.ssh2.Connection(serverName);
    conn.connect();

    boolean isAuthenticated = conn.authenticateWithPassword(user, pass);
    logger.info("Connecting to " + server);

    if (isAuthenticated == false) {
        logger.info(server + " Please check credentials");              
    } 

    sess = conn.openSession();

   // I am connecting to over 200 servers and closing them. What would be the best practice to loop thru all these servers in the minimal time.

//some servers quickly connects, while some takes some time.
why does this happen?

【问题讨论】:

  • 它总是/经常是同一个服务器还是不同?
  • @Robert 主要在相同的服务器上,但有所不同。另外,对于您之前的线程池示例,是否有最大限制?

标签: java ssh ganymede


【解决方案1】:

主要问题是:是代码问题、网络问题还是服务器问题。

可以调试代码问题 - 不幸的是,ch.ethz.ssh2.Connection 没有任何日志记录可能性来检测里面发生了什么。

您可能应该考虑切换 ssh 库(或将其用于一些有问题的服务器的测试)。根据我的经验,sshj 非常有用。

如果是网络问题或服务器问题,您可以通过 Wireshark 检查发生的情况。如果发送了网络数据包但响应延迟,则问题不是使用的客户端代码。

【讨论】:

  • 我在我的应用程序中使用了执行器服务。但我还有挂机时间。我想知道是什么导致服务器慢。另外我将线程池设置为 80,这会构成威胁吗?
  • 使用你之前展示的执行器服务,如果超过1000毫秒,你将如何关闭线程?
  • 如果连接延迟或停止,则 SSH 库的工作是退出连接。通常您可以设置连接超时和/或您要执行的命令可以花费的最长时间。如果达到超时,库将退出连接并且可运行对象结束。此外,您可以监视 TCP 连接并从 SSH 连接的“外部”关闭它 - 这会导致所有其他操作失败。
  • 我想杀死卡住的线程。我做了一些研究,有人说不可能,有人说使用中断(),未来()
  • interrupt() 仅在线程等待某事或手动轮询isInterrupted() 时才有效。第一种可能是这样,后者通常不用。正如我所说,在处理网络连接时,最直接的方法是从线程外部关闭连接。如果关闭以一种好的方式实现,它会关闭 TCP 连接并强制连接结束(以及线程)。
【解决方案2】:

我的psychic debugging powers 告诉我服务器正在对每个连接的客户端的 IP 地址进行 DNS 查找。这些 DNS 查找要么需要很长时间才能完成,要么完全失败。 DNS 查找将阻止身份验证过程,直到它完成,无论成功与否。

如果服务器是the OpenSSH server,则此行为由sshd config“UseDNS”选项控制。

【讨论】:

  • 如何关闭连接时间较长的服务器?
猜你喜欢
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多