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 사용량이 많이 증가하고 서버가 재시작되지 않으면 감소하지 않습니다.
이 것이 알려진 문제입니까? 어떻게 든 내 코드에 의해 발생할 수 있습니까?
도움 주셔서 감사합니다.
"http-thread-pool"에 몇 개의 스레드가 있습니까? 요청을 처리 할 수있는 스레드가 충분하지 않으면 SelectRunner가 "회전"할 수 있습니다. – dlaudams