[netty] netty 이용시 다수의 소켓생성시 오류 관련 해결팁. :)
네트워크 서버의 성능테스트용으로 netty(http://netty.io)기반으로 테스트툴을 만들었는데,
테스트툴 내부에서 여러개의 소켓 생성시 문제가 발생. 이를 step by step으로 확인해 봄~
* 윈도우에서는 괜찮았는데, 리눅스(centos 6.3)에서는 10개이상의 소켓을 생성하려고 하면 오류발생.
오류 :
org.jboss.netty.channel.ChannelException: Failed to create a selector.
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.openSelector(AbstractNioSelector.java:343)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.<init>(AbstractNioSelector.java:100)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:52)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:28)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.newWorker(AbstractNioWorkerPool.java:143)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:81)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:151)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:116)
at boazcmt.tip.client.TipClient.init(TipClient.java:196)
at boazcmt.tip.client.TipClient.<init>(TipClient.java:70)
at boazcmt.nsst.client.tip.TipTestClient.init(TipTestClient.java:39)
at boazcmt.nsst.task.InitClientTask.runTask(InitClientTask.java:43)
at boazcmt.nsst.task.BaseTask.run(BaseTask.java:20)
at boazcmt.nsst.schedule.scheduler.StartScheduler.execute(StartScheduler.java:36)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: java.io.IOException: 열린 파일이 너무 많음
at sun.nio.ch.IOUtil.makePipe(Native Method)
at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:65)
at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36)
at java.nio.channels.Selector.open(Selector.java:227)
at org.jboss.netty.channel.socket.nio.SelectorUtil.open(SelectorUtil.java:63)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.openSelector(AbstractNioSelector.java:341)
... 19 more
오류 중간에 보면 '열린 파일이 너무 많음' 이라고 보임.
구글링 해보니 OS의 설정에 열 수 있는 파일의 최대개수를 확인해 보라 함.
그래서 확인해 보니
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127124
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
음.. 최대 1024개까지만 생성(?). 이미 netty 클라이언트를 100개 생성해서 돌리고 있는 상황에서 뭐 이것저것 하다보면 1024가 초과가 될 수도 있겠다 생각이 듬.
open files 값을 늘려 보기로 함.
설정관련된 글은 http://blog.naver.com/yehyang0512/40146844770 참고.
OS에서의 최대 파일 개수, 사이즈 관련 글은 http://parknom.tistory.com/336 참고.
* 현재 프로세스가 사용한 파일개수 확인
lsof -p 프로세스ID |wc -l -> 전체 파일 확인
lsof -p 프로세스ID |grep 'TCP' |wc -l -> TCP연결만 확인
* 위의 명령어로 확인해 보니 아래처럼 특정 패턴의 파일들이 너무 많음.
java 29539 hotchat 233w FIFO 0,8 0t0 9642247 pipe
java 29539 hotchat 234u REG 0,9 0 3650 anon_inode
java 29539 hotchat 235r FIFO 0,8 0t0 9642248 pipe
java 29539 hotchat 236w FIFO 0,8 0t0 9642248 pipe
java 29539 hotchat 237u REG 0,9 0 3650 anon_inode
* 관련 내용을 구글링 해 보니 아래와 같은 글이 있음.
내용인 즉슨, nio 사용시 많이 생길수 있다(?) ㅡ.ㅡ;;;;
그래서 TipClient에서 bootstrap 생성시 소켓을 NioClient에서 OioClient로 생성하니
NioClient일때는 약 1400여개 였던게
OioClient를 사용하니 164개로 급떨어짐.
테스트툴에서는 단순히 내부적으로 복수개의 소켓을 생성해서 테스트하려는 서버에 접속해서
테스트용 패킷을 주고받는 역할을 하는지라 굳이 nio를 사용하지 않아도 되지 싶다.
어쨌든 소중한(?) 경험을 한 것 같아 기분이 참 좋았다(초딩 일기체 ㅋㅋ)