누가 cpu를 강점했습니까

1674 단어
어떤 서버의 cpu 사용률이 높아지지 않는 것을 발견하면 누가 진범인지 잡아야 한다.본고는 진상을 밝힐 수 있는 방법을 제공한다.
  • ps 명령을 통해 프로세스마다 라인의 cpu 사용률
  • 을 표시합니다
    >ps -Leo pid,lwp,user,comm,pcpu
    
    PID   LWP USER     COMMAND         %CPU
        1     1 root     systemd          0.5
        2     2 root     kthreadd         0.0
        3     3 root     ksoftirqd/0      0.0
        5     5 root     kworker/0:0H     0.0
    ......
    
  • 모든java 프로세스를 찾고 5열에 따라 출력
  • >ps -Leo pid,lwp,user,comm,pcpu|awk '$4=="java"{print $0}'|sort -k5 -r -n|head --lines 3
    
     7114  7199 ocdp     java             0.4
    28178 28205 root     java             0.4
     2046  2355 ocdp     java             0.3
    
  • 이렇게 하면 cpu 사용률이 가장 높은 프로세스는 7114의 스레드 7199를 찾았고 스레드 id를 16진법printf %x 7199으로 전환한 결과1c1f
  • 프로세스의 스택 정보를 임시 파일로 내보내기 jstack 7114 > ~/7114.tmp
  • 임시 파일에서 찾기1c1f, 이 라인의 현재 상태를 찾아 해당하는 코드를 찾을 수 있습니다
  • "sparkDriverActorSystem-scheduler-1" #41 daemon prio=5 os_prio=0 tid=0x00007f649d661000 nid=0x1c1f waiting on condition [0x00007f646bbfc000]
       java.lang.Thread.State: TIMED_WAITING (sleeping)
            at java.lang.Thread.sleep(Native Method)
            at akka.actor.LightArrayRevolverScheduler.waitNanos(Scheduler.scala:226)
            at akka.actor.LightArrayRevolverScheduler$$anon$8.nextTick(Scheduler.scala:405)
            at akka.actor.LightArrayRevolverScheduler$$anon$8.run(Scheduler.scala:375)
            at java.lang.Thread.run(Thread.java:745)
    

    총결산


    본고는 psjstack 명령을 결합하여 cpu를 가장 소모하는java 라인을 찾아 해당하는 코드로 포지셔닝하는 방법을 소개했다.

    좋은 웹페이지 즐겨찾기