반응형

Too many open files

java.io.IOException: Too many open files
Operation timed outerverSocketChannelImpl.accept0(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
    at io.netty.util.internal.SocketUtils$5.run(SocketUtils.java:119)
    at io.netty.util.internal.SocketUtils$5.run(SocketUtils.java:116)
    at java.security.AccessController.doPrivileged(Native Method)
    at io.netty.util.internal.SocketUtils.accept(SocketUtils.java:116)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doReadMessages(NioServerSocketChannel.java:147)
    at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)


FD(File Descriptor/open files) 수가 부족한 경우 발생.

FD 사용 개수 확인.
$ lsof -p [PID] | wc -l
$ lsof -u [UID] | wc -l


Network connetion 개수 확인
$ netstat -an | wc -l

 

FD(File Descriptor/open files)
 - 프로세스가 가질 수 있는 소켓 포함 파일 개수
 - Java에서 소켓 통신(HTTP API, JDBC 커넥션 등)은 open file 옵션을 따라간다.


User Limit 확인
$ ulimit -aS


Hard Limit 확인
$ ulimit -aH


JDK 내부 코드상에서 Hard Limit 값이 soft limit에 update.
 - Java 프로세스는 Hard Limit 까지 file open 가능.


https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
$ java -XX:+PrintFlagsFinal -version | grep MaxFDLimit
     bool MaxFDLimit                                = true                                {product}
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

MaxFDLimit 옵션이 true일 경우 setrlimit 으로 limit을 증가.


Limit 설정.
$ vi /etc/security/limits.conf
계정명 soft nofile 40960
계정명 hard nofile 40960

보통 soft limit과 hard limit을 같은 값으로 설정한다.





Java에서 동시에 생성 가능한 쓰레드 수는 max user processes를 따라간다.

ps 명령어로 스레드 생성 개수를 확인(-L 옵션 : Show threads, possibly with LWP and NLWP columns.)
$ ps -efL | grep java | grep -v grep | wc -l
UID PID PPID LWP C NLWP STIME TTY TIME CMD

- PPID : 부모 프로세스 ID
- LWP : LWP(Light Weight Process, is thread). 쓰레드 ID
- C : CPU 사용율
- NLWP : LWP(Number Light Weight Process). 해당 프로세스에서 동작하고 있는 쓰레드 개수.
- STIME : 프로세스 시작 시간
- TIME : 총 CPU 사용 시간

반응형

'프로그래밍 > Java' 카테고리의 다른 글

java file.encoding  (0) 2022.07.12
[JAVA] java.lang.UnsatisfiedLinkError: no net in java.library.path  (1) 2021.06.25
환경변수 값 읽어오기.  (0) 2021.04.05
[Spring Boot] log4jdbc 설정.  (1) 2020.01.16
Rabbit MQ 간단 사용.  (0) 2018.12.21

+ Recent posts