it-source

해질녘에 기다리고 있어Unsecure.park(네이티브 메서드)

criticalcode 2022. 10. 31. 23:58
반응형

해질녘에 기다리고 있어Unsecure.park(네이티브 메서드)

애플리케이션 중 하나가 부하가 걸린 상태에서 실행 중인데, jstack에서 이러한 출력이 발생하는 원인이 무엇인지 아는 사람이 있습니까?

"scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

jstack 출력에서 행할 때 자주 볼 수 있는 현상입니다.

Spring @Async & maps, 동기 지도 및 ehcache를 많이 사용하고 있습니다.

흥미로운 점은 이것이 앱 인스턴스 중 하나에서만 발생한다는 것입니다.다른 두 명은 완벽하게 잘 돌아가고 있어요.이런 경우에 더 자세한 정보를 얻기 위해 제가 또 무엇을 조사할 수 있을까요?

저는 https://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds이라는 게시물을 찾았지만, 제 경우에는 별로 도움이 되지 않습니다.

insecure.park는 스레드와 거의 동일합니다.아키텍처 고유의 코드를 사용하고 있는 것을 제외하고, ('확실한' 이유를 알 수 있습니다.안전하지 않은 기능은 공개적으로 제공되지는 않지만 아키텍처별 코드가 상당한 최적화 이점을 제공하는 Java 내부 라이브러리에서 사용됩니다.스레드 풀링에 많이 사용됩니다.

질문에 답하려면 스레드는 CPU를 사용하지 않고 대기하고 있을 뿐입니다.원래 스택트레이스에서 잠금을 사용하고 있는 것을 고려하면 교착 상태가 발생하고 있다고 생각됩니다.

네, 저는 당신이 이미 이 문제를 해결했다는 것을 알고 있습니다.하지만 누군가가 sun.misc.unsafe.park를 검색하면 당신은 최고의 결과 중 하나입니다.이 질문에 대답하는 것은 CPU를 모두 사용하고 있는 것처럼 보이는 이 방법을 이해하려고 하는 다른 사람에게 도움이 될 것입니다.

스택 트레이스를 보면 ThreadPoolExecutor > Worker 스레드가 시작되어 BlockingQue(Delayed)에서 작업을 사용할 수 있도록 대기하고 있는 것이 명확합니다.WorkQueue)를 사용하여 작업을 선택하고 실행합니다.따라서 이 스레드는 퍼블리셔 스레드에서 시그널을 얻을 때만 WAIT 상태가 됩니다.

비슷한 문제가 있었습니다.앞의 답변(감사합니다!)에 따라 ThreadPoolExecutor 용어집을 검색하여 올바르게 처리하는 방법을 찾을 수 있었습니다.

내 경우, 이렇게 하면 유사한 블록된 스레드의 점진적 증가를 해결할 수 있습니다.

  • 사용한 적이 있다ExecutorService::awaitTermination(x, TimeUnit) ★★★★★★★★★★★★★★★★★」ExecutorService::shutdownNow()이치노
  • 참고로 다음 명령을 사용하여 스레드 수를 검출하고 잠긴 스레드를 나열했습니다.
ps -u javaAppuser -L|wc -l
   
jcmd \`ps -C java -o pid=\` Thread.print >> threadPrintDayA.log
    
jcmd \`ps -C java -o pid=\` Thread.print >> threadPrintDayAPlusOne.log
    
cat threadPrint*.log |grep "pool-"|wc -l

언급URL : https://stackoverflow.com/questions/24241335/waiting-at-sun-misc-unsafe-parknative-method

반응형