CORB 作业:处理 ServerConnectionException:连接由对等方重置

CORB Job : Handle ServerConnectionException: Connection reset by peer

我正在尝试执行 CORB 作业来处理我的文档。但它在处理整个集合的一部分后抛出以下异常。

com.marklogic.xcc.exceptions.ServerConnectionException: Connection reset by peer
 [Session: user=<username>, cb={default} [ContentSource: <username>, cb={none} [provider: address=<xyz.com>/<IP>, pool=0/64]]]
 [Client: XCC/7.0-2, Server: XDBC/7.0-3.1]
        at com.marklogic.xcc.impl.handlers.AbstractRequestController.runRequest(AbstractRequestController.java:124)
        at com.marklogic.xcc.impl.SessionImpl.submitRequestInternal(SessionImpl.java:388)
        at com.marklogic.xcc.impl.SessionImpl.submitRequest(SessionImpl.java:371)
        at com.marklogic.developer.corb.Transform.call(Transform.java:68)
        at com.marklogic.developer.corb.Transform.call(Transform.java:1)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)

我们尝试增加线程数和内存分配,但无济于事。

我的要求有两个:

  1. 这可能是什么根本原因?有办法解决这个问题吗?

  2. 如果不是,是否有办法在执行相同的 shell 脚本中捕获此异常?

可能的原因有很多。例如,它可能是 JVM 垃圾收集、服务器上的问题,甚至是网络路径中的问题。盲目改变事情不太可能有帮助:首先确定问题,然后纠正它。

最常见的是 JVM 和 GC。 MarkLogic XCC 实现了自己的保活机制,类似于 HTTP 1.1 保活。如果垃圾收集花费太多时间,这可能会导致超时和重置。在错误发生之前,尝试监视 JVM 是否似乎 运行 违反其内存分配并频繁命中垃圾回收。添加 -verbosegc 也可能有助于检测这一点。如果您认为 GC 是问题所在,请尝试添加 -Xincgc。您可能还想 减少 线程数,以减少内存压力。您还可以使用 -Xmx 增加分配。但不要盲目地这样做,我不会超过 1-GiB。

一定要检查ErrorLog.txt,还要检查一般的服务器健康状况。它是否使用任何交换space?是分页吗? OS 日志中有任何可疑之处吗?出现问题时 CPU、内存、磁盘和网络 I/O 看起来如何?

每隔一段时间,这种事情就会变成防火墙或路由器不喜欢长期连接并关闭它们。如果可能的话,安排它使您的客户端和服务器位于同一子网上,除了相对笨拙的集线器或交换机之外,两者之间没有任何东西。如果任一主机上都有本地防火墙,请确保它不会干扰。

'connection by peer'可能的原因有几个:

  1. 对等应用程序故意重置连接。
  2. 对等应用程序在其套接字接收缓冲区中仍有未读数据时关闭了连接。
  3. 对等应用程序关闭了连接,之后您继续发送数据。
  4. 中间防火墙断开了连接,通常是因为超时。

...而且可能还有更多。最常见的原因是 (3),这是某人的应用程序协议错误。