면접관: 애플리케이션이 가동된 후 급증하는 CPU 사용량 문제를 해결하는 방법은 무엇입니까?

안녕하세요 여러분 미스티입니다.

면접관은 지난번에 다음과 같은 질문 을 했습니다. 응용 프로그램이 온라인 상태가 된 후 급증하는 CPU 사용량 문제를 해결하는 방법은 무엇입니까?

사실 이것은 매우 흔한 문제이고 매우 간단한데 왜 써야 하는 걸까요? 지난번에 대답했을 때 스레드 PID를 16진수 명령으로 변환하는 것을 잊었기 때문입니다.

그래서 이 질문에 대해 다시 한 번 생각해 보기로 했습니다.물론 테스트 코드도 준비해 놓았으니 실제로 실행해보시면 다음번에 잊지 않으실 거에요.

높은 CPU 시나리오 시뮬레이션

public class HighCpuTest {
    public static void main(String[] args) {
        List<HignCpu> cpus = new ArrayList<>();

        Thread highCpuThread = new Thread(()->{
            int i = 0;
            while (true){
                HignCpu cpu = new HignCpu("Java日知录",i);

                cpus.add(cpu);
                System.out.println("high cpu size:" + cpus.size());
                i ++;
            }
        });
        highCpuThread.setName("HignCpu");
        highCpuThread.start();
    }
}
复制代码

메인 메소드에서 스레드가 시작되고 HighCpu객체가 무한히 생성됩니다.

@Data
@AllArgsConstructor
public class HignCpu {
    private String name;
    private int age;
}
复制代码

위의 코드를 준비하고 HighCpuTest를 실행하면 일련의 작업을 시작하여 문제의 원인을 찾을 수 있습니다.

문제 해결 단계

첫 번째 단계는 top을 사용하여 CPU 사용량이 가장 높은 Java 프로세스를 찾는 것입니다.

1. 监控cpu运行状,显示进程运行信息列表
top -c

2. 按CPU使用率排序,键入大写的P
P
复制代码

image-20220627165915946

두 번째 단계, top -Hp명령을 하여 가장 높은 CPU를 차지하는 스레드를 봅니다.

이전 단계에서는 Java가 top명령 . 그 과정에 쓰레드가 너무 많아 모든 쓰레드가 항상 CPU를 점유하는 것은 불가능합니다. 이 단계에서 우리가 해야 할 일은 범인을 찾는 것입니다. 물론 한 개 이상이 있을 수도 있습니다.

명령을 실행합니다 top -Hp pid. pid는 이전 Java 프로세스입니다. 내 예 16738에서 전체 명령은 다음과 같습니다.

top -Hp 16738, P(대문자 p)를 입력하면 스레드가 CPU 사용량에 따라 정렬됩니다.

실행 후 효과는 다음과 같습니다.

image-20220627165953456

가장 높은 CPU를 차지하는 스레드의 PID는 16756임을 알 수 있다.

세 번째 단계는 스택 정보를 보고 해당 코드를 찾는 것입니다.

printf 명령어를 통해 16진수로 변환해야 하는 이유는 스택의 쓰레드 id가 16진수로 표현되기 때문이다. (당시 이 명령어를 깜빡했네요~)

[root@review-dev ~]# printf "%x\n" 16756
4174
复制代码

16진수로 얻은 스레드 ID는 4174입니다.

jstack 명령어를 통해 스택 정보 보기

jstack 16738 | grep '0x4174' -C10 --color
复制代码

image-20220627170218909

위 그림과 같이 CPU 사용량이 많은 쓰레드에 해당하는 쓰레드 이름 "HighCpu"를 찾아 해당 쓰레드가 실행하고 있는 코드의 스택을 보여준다.

마지막으로 스택의 정보에 따라 해당 무한 루프 코드를 찾아 완료합니다.

요약

cpu使用率飙升后如何排查这个问题不仅面试中经常会问,而且在实际工作中也非常有用,大家最好根据上述步骤实际操作一下,这样才能记得住记得牢。

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

추천

출처juejin.im/post/7119116752939646984