Skip to content

Server side: OutOfDirectMemoryError #11350

Open
@flagshen

Description

@flagshen

grpc version: 1.52.1
java version: 1.8
Now my client uses 100 threads, each thread sends 1M data, the server directly returns the response, I set the out-of-heap memory size limit to 512M, the client as long as the execution of the server will appear the following error, and the server program will not reduce the memory.

io.grpc.netty.shaded.io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 4194304 byte(s) of direct memory (used: 532676887, max: 536870912)
        at io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent.incrementMemoryCounter(PlatformDependent.java:845)
        at io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent.allocateDirectNoCleaner(PlatformDependent.java:774)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:649)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:624)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:203)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena.tcacheAllocateSmall(PoolArena.java:173)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena.allocate(PoolArena.java:134)
        at io.grpc.netty.shaded.io.netty.buffer.PoolArena.allocate(PoolArena.java:126)
        at io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:396)
        at io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:188)
        at io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179)
        at io.grpc.netty.shaded.io.netty.channel.unix.PreferredDirectByteBufAllocator.ioBuffer(PreferredDirectByteBufAllocator.java:53)
        at io.grpc.netty.shaded.io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:120)
        at io.grpc.netty.shaded.io.netty.channel.epoll.EpollRecvByteAllocatorHandle.allocate(EpollRecvByteAllocatorHandle.java:75)
        at io.grpc.netty.shaded.io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:785)
        at io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:487)
        at io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:385)
        at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
        at io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:750)

The client code is as follows:

Svs.CommonDataResponse response = clientStub.sOFSignData(Svs.SignDataRequest.newBuilder()
                .setInData(ByteString.copyFrom(inData))
                .build());
        if (response.getRv() == Error.OK.getCode()) {
            return response.getData();
        }

The server code is as follows:

ServerCallStreamObserver<Svs.CommonDataResponse> clientCallStreamObserver = (ServerCallStreamObserver<Svs.CommonDataResponse>) responseObserver;
        clientCallStreamObserver.setOnReadyHandler(()-> {
            if (clientCallStreamObserver.isReady()) {
                Svs.CommonDataResponse resp = Svs.CommonDataResponse.newBuilder()
                        .setRv(ErrorMgr.RET_OK)
                        .setData("signature")
                        .build();
                clientCallStreamObserver.onNext(resp);
                clientCallStreamObserver.onCompleted();
            }
        });

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions