Spring boot 使用流式api,堆外内存无需绑定即可增长

Spring boot 使用流式api,堆外内存无需绑定即可增长,spring-boot,grpc-java,Spring Boot,Grpc Java,我的grpc java服务器堆外内存增长无限制 gRPC版本 服务器:GRPCJava1.34.1 客户端:grpc java 1.34.1、grpc Swift 1.0.0 其他资料 用于聊天服务的服务器端流式RPC 通过SSL连接,SSL卸载在负载平衡器上处理 负载不是那么高 每台服务器低于100卢比/秒 每台客户端低于10卢比/秒 我没有应用流量控制 客户总数有限;这两个时间跨度之间并没有太大差别 服务器保留配置 保持时间:30秒 保存超时:5s 最大连接空闲时间:60s

我的grpc java服务器堆外内存增长无限制

gRPC版本

  • 服务器:GRPCJava1.34.1
  • 客户端:grpc java 1.34.1、grpc Swift 1.0.0
其他资料

  • 用于聊天服务的服务器端流式RPC
  • 通过SSL连接,SSL卸载在负载平衡器上处理
  • 负载不是那么高
    • 每台服务器低于100卢比/秒
    • 每台客户端低于10卢比/秒
    • 我没有应用流量控制
  • 客户总数有限;这两个时间跨度之间并没有太大差别
  • 服务器保留配置
    • 保持时间:30秒
    • 保存超时:5s
    • 最大连接空闲时间:60s
  • 每晚3:00,我对服务器上的所有
    StreamObserver
    s执行onComplete();聊天服务目前不提供
  • 客户端随机获取
    INTERNAL:RST\u流关闭流。HTTP/2错误代码:LB的内部_错误
    ,所以我想服务器端会有一些断开的连接。
    • 我知道这个负载平衡器问题是不寻常的;正在检查中
  • 移动客户端由于各种原因突然与服务器断开连接,并重新连接到服务器;我想服务器端也会有一些断开的连接。
    • 客户端上可能存在奇怪的连接误用;i、 e.与流的意外多个连接
  • 一旦内存达到极限,我就会得到
    io.grpc.netty.shaded.io.netty.util.internal.OutOfDirectMemoryError
    。内存配置如下:
    • -Xmx1536m
    • -XX:MaxDirectMemorySize=3584m
一些观察

  • 无法使用下面的选项找到内存泄漏
    • -Dio.grpc.netty.shaded.io.netty.leakDetection.level=PARANOID-Dio.netty.leakDetection.level=PARANOID
  • 一旦内存增长,即使在3:00
    onComplete()事件之后,它也不会下降;我希望连接空闲后,与连接相关的资源将被释放
  • 有一刻记忆消失了,错误如下;我猜这触发了记忆的释放。
    • io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception$StreamException:在写入之前关闭流
  • 正如我所测试的,
    • 连接后,流从服务器端打开,在保留期服务器发送出站离开后,调用
      onComplete()
    • 然而,当我打开连接和流,然后突然终止进程时,服务器从不发送
      出站GOAWAY
以下是我的问题:

  • 在突然终止进程后,不发送出站退出是否明智?在keepalive期间或任何其他时间段之后,资源是否被释放
  • 即使服务未使用,内存也未释放的原因应该是什么?以及
    StreamObserver
    s all
    onCompleted()
  • 如果这都是关于断开连接的资源,那么
    maxConnectionAge
    maxConnectionAgeGrace
    是否有助于这种情况?通过这些选项,我可以看到正常连接的
    消失
    ,但是没有看到连接突然断开的日志
  • 我希望直接内存中未引用的
    StreamObserver
    对象和相关资源会被垃圾收集。对于资源发布,我应该显式调用
    onCompleted()
    还是
    onError()
    ?;实际上,我已经在所有
    StreamObserver
    s上调用了
    onError()
    onCompleted()
    ,请求终止,但只是以防万一
  • 这是否有可能是由客户的grpc库错误引起的
  • 很抱歉,这里没有提供任何源代码,如果您需要可复制的源代码,我会准备好;原始资料正在制作中,所以我现在无法提供


    提前谢谢

    我已在以下地址回复了您关于grpc java的查询:
    2021-04-07T20:36:18.051+09:00 DEBUG 35024 --- [       grpc-nio-worker-ELG-3-4] [ i.g.n.s.i.grpc.netty.NettyServerHandler: 214] : [id: 0x333386d4, L:/172.20.40.169:31105 - R:/172.20.40.169:50188] OUTBOUND GO_AWAY: lastStreamId=2147483647 errorCode=0 length=8 bytes=6d61785f69646c65
    2021-04-07T20:36:18.051+09:00 DEBUG 35024 --- [       grpc-nio-worker-ELG-3-4] [ i.g.n.s.i.grpc.netty.NettyServerHandler: 214] : [id: 0x333386d4, L:/172.20.40.169:31105 - R:/172.20.40.169:50188] OUTBOUND PING: ack=false bytes=40715087873
    2021-04-07T20:36:18.060+09:00 DEBUG 35024 --- [       grpc-nio-worker-ELG-3-4] [ i.g.n.s.i.grpc.netty.NettyServerHandler: 214] : [id: 0x333386d4, L:/172.20.40.169:31105 - R:/172.20.40.169:50188] INBOUND PING: ack=true bytes=40715087873
    2021-04-07T20:36:18.061+09:00 DEBUG 35024 --- [       grpc-nio-worker-ELG-3-4] [ i.g.n.s.i.grpc.netty.NettyServerHandler: 214] : [id: 0x333386d4, L:/172.20.40.169:31105 - R:/172.20.40.169:50188] OUTBOUND GO_AWAY: lastStreamId=5 errorCode=0 length=8 bytes=6d61785f69646c65