org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351)
at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776)
at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:681)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:386)
엑셀 다운로드 기능을 구현했는데, 위와 같은 로그들을 만나게 되었다.
개수가 적을 때는 문제가 없지만, 많아지게 되니, 이슈가 생겼는데 아마 I/O 과정에서 너무 많은 Network를 타서 불안정한 Stream에 의해 끊긴 것으로 추측된다.
더 깊은 Log를 까보면 다음과 같았다.
Caused by: java.io.IOException: Broken pipe
at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:113)
at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:79)
at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:50)
at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:466)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253)
at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764)
at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:584)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:528)
at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:546)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110)
at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193)
at org.apache.coyote.Response.doWrite(Response.java:601)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339)
나와 같은 상황은 다음과 같다. 그리고 해결방법이다.
원인은 다음과 같이 정리할 수 있다.
적은 개수에 대해서는 이슈가 없으나, 데이터의 개수가 많아질 때마다 이슈가 생기는 것으로 보아 JVM 메모리가 부족하다는 것을 합리적인 의심을 할 수 있었고, 나는 다음과 같이 조치를 취했다.
사용 메모리보다 크게 jib JVM 옵션 설정
근데 아직 해결 못함. 미해결 이슈