티스토리 뷰

네트워크 서버의 성능테스트용으로 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


* 관련 내용을 구글링 보니 아래와 같은 글이 있음.

http://goo.gl/ZtnnYs

내용인 즉슨, nio 사용시 많이 생길수 있다(?) .;;;;

그래서 TipClient에서 bootstrap 생성시 소켓을 NioClient에서 OioClient 생성하니 

NioClient일때는 1400여개 였던게 

OioClient 사용하니 164개로 급떨어짐.


테스트툴에서는 단순히 내부적으로 복수개의 소켓을 생성해서 테스트하려는 서버에 접속해서

테스트용 패킷을 주고받는 역할을 하는지라 굳이 nio를 사용하지 않아도 되지 싶다.

어쨌든 소중한(?) 경험을 한 것 같아 기분이 참 좋았다(초딩 일기체 ㅋㅋ)


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함