2014-09-18 7 views
2

Glassfish 4 (4.1 빌드 13), JDK 1.7 업데이트 67 및 AWS Linux AMI에서 실행중인 저지 응용 프로그램을 가지고 있으며 몇 시간 동안 실행 한 후에 CPU 사용량이 증가하고 클라이언트가 중지 되더라도 계속 유지됩니다.글래스 피쉬 4 그리즐리 쓰레드 CPU 사용량이 많음

"top -H"를 실행하면 CPU 사용량이 많은 두 개의 HTTP Listener1 커널 스레드 (총 16 개)가 식별됩니다.

"http-listener-1-kernel(3) SelectorRunner" daemon prio=10 tid=0x00007fbc68251000 nid=0xaee runnable [0x00007fbcb55ce000] 
    java.lang.Thread.State: RUNNABLE 
     at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
     at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) 
     at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) 
     at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) 
     - locked <0x000000060263ad88> (a sun.nio.ch.Util$2) 
     - locked <0x000000060263ad78> (a java.util.Collections$UnmodifiableSet) 
     - locked <0x00000006025fb068> (a sun.nio.ch.EPollSelectorImpl) 
     at sun.nio.ch.SelectorImpl.selectNow(SelectorImpl.java:106) 
     at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:114) 
     at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:338) 
     at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:278) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
     at java.lang.Thread.run(Thread.java:745) 


"http-listener-1-kernel(8) SelectorRunner" daemon prio=10 tid=0x00007fbc6825b800 nid=0xaf3 runnable [0x00007fbcb50c9000] 
    java.lang.Thread.State: RUNNABLE 
     at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
     at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) 
     at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) 
     at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) 
     - locked <0x00000006026648b8> (a sun.nio.ch.Util$2) 
     - locked <0x00000006026648a8> (a java.util.Collections$UnmodifiableSet) 
     - locked <0x0000000602664790> (a sun.nio.ch.EPollSelectorImpl) 
     at sun.nio.ch.SelectorImpl.selectNow(SelectorImpl.java:106) 
     at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:114) 
     at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:338) 
     at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:278) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
     at java.lang.Thread.run(Thread.java:745) 

흥미롭게도, CPU를 소비하지 않는 다른 스레드 sun.nio.ch.SelectorImpl에서 다른 방법을 사용하는 (대신에 selectNow의 선택) : 그럼이 두 개의 스레드를 확인하는 쓰레드 덤프를했다

"http-listener-1-kernel(7) SelectorRunner" daemon prio=10 tid=0x00007fbc68259800 nid=0xaf2 runnable [0x00007fbcb51ca000] 
    java.lang.Thread.State: RUNNABLE 
     at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
     at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) 
     at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) 
     at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) 
     - locked <0x0000000602665f20> (a sun.nio.ch.Util$2) 
     - locked <0x0000000602665f10> (a java.util.Collections$UnmodifiableSet) 
     - locked <0x0000000602665df8> (a sun.nio.ch.EPollSelectorImpl) 
     at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98) 
     at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:112) 
     at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:338) 
     at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:278) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
     at java.lang.Thread.run(Thread.java:745) 

그런 다음 클라이언트를 다시 켜고 다시 몇 시간 동안 실행 한 다음 다시 중지합니다. 물론, "top -H"는 CPU 사용량이 다시 증가했음을 나타냅니다.

"http-listener-1-kernel(6) SelectorRunner" daemon prio=10 tid=0x00007fbc68257800 nid=0xaf1 runnable [0x00007fbcb52cb000] 
    java.lang.Thread.State: RUNNABLE 
     at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) 
     at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) 
     at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) 
     at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) 
     - locked <0x00000006026675c0> (a sun.nio.ch.Util$2) 
     - locked <0x00000006026675b0> (a java.util.Collections$UnmodifiableSet) 
     - locked <0x0000000602667498> (a sun.nio.ch.EPollSelectorImpl) 
     at sun.nio.ch.SelectorImpl.selectNow(SelectorImpl.java:106) 
     at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:114) 
     at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:338) 
     at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:278) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
     at java.lang.Thread.run(Thread.java:745) 

뭔가의 "에 selectNow"메소드를 호출하는 스레드를 일으키는 것으로 보인다 : 다른 스레드 덤프는 또 하나 개의 스레드가 "에 selectNow"를 전환하고 지금 (다른이와 함께) 더 많은 CPU 시간이 소요되는 것을 알 수 sun.nio.ch.SelectorImpl 그리고 일단 서버에 들어가면 CPU 사용량이 많이 증가하고 서버가 재시작되지 않으면 감소하지 않습니다.

이 것이 알려진 문제입니까? 어떻게 든 내 코드에 의해 발생할 수 있습니까?

도움 주셔서 감사합니다.

+0

"http-thread-pool"에 몇 개의 스레드가 있습니까? 요청을 처리 할 수있는 스레드가 충분하지 않으면 SelectRunner가 "회전"할 수 있습니다. – dlaudams

답변