Java

리눅스 진단 명령어

hongyb 2025. 6. 17. 00:47

리눅스 진단 명령어

개발을 하다 보면 OS 상황을 모니터 해야 할 경우도 있다. 시스템 장애가 애플리케이션에만 있는 것이 아니기 때문이다. 리눅스 진단에 사용할 수 있는 명령어를 알아보고 OS 상황을 모니터링할 때 활용해 보자.

 

https://www.brendangregg.com/linuxperf.html  [Brendan Gregg 블로그]

위에는 Brendan Gregg의 블로그에서 가져온 리눅스 분석 도구 표이다. 중요한 분석 도구부터 차례대로 알아보도록 하겠다.


CPU 모니터링

CPU를 모니터링할 때 mpstat을 사용한다. mpstat이란 사용 가능한 CPU 사용 상황을 제공한다. 데이터 출력 간격과 수행 횟수를 지정할 수 있다.

mpstat 5 3

명령어 [데이터 출력 간격] [데이터 수행 횟수] 순으로 지정해야 한다.

 

출력된 결과는 다음과 같다.

 

사진 속 결과 의미는 다음과 같다.

  • %usr : 애플리케이션에서 수행되는 동안 사용한 CPU 시간 비율
  • %nice : nice 우선순위로 애플리케이션 레벨에서 수행되는 동안 사용한 CPU 시간 비율
  • %sys : 커널 레벨에서 수행되는 동안 사용한 CPU 시간 비율. 인터럽트 비용은 포함되지 않는다.
  • %iowait : 시스템 디스크의 I/O 요청을 처리하는 동안 CPU가 유휴 상태인 시간 비율
  • %irq : 하드웨어 인터럽트를 CPU에서 처리하는 데 사용한 CPU 시간 비율
  • %soft : 소프트웨어 인터럽트를 CPU에서 처리하는 데 사용한 CPU 시간 비율
  • %steal : 하이퍼바이저가 가상 프로세서 처리할 때 CPU에서 대기하는 데 사용한 시간 비율
  • %guest : 가산 프로세서 수행하기 위해 사용한 시간 비율
  • %idle : 유휴 상태인 시간 비율
nice란 사용자가 nice라는 명령어를 통해 프로세스 우선순위 변경할 수 있는데 그 프로세스에 의해 수행된 시간을 의미한다.

mpstat 옵션

'I' 옵션은 인터럽트 통계 제공한다. 여기서 SUM, CPU, ALL 중 하나를 지정해야 한다.

mpstat -I [SUM | CPU | ALL]
  • SUM은 모든 CPU의 초당 인터럽트 수의 합
  • CPU는 각 CPU 별로 상세한 인터럽트 정보 제공
  • ALL은 둘을 합친 내용
mpstat -I SUM

intr/s는 초당 CPU가 받은 인터럽트 수이다. 이외에 다른 옵션은 mpstat 매뉴얼을 참고하자.

CPU 모니터링 방법

CPU 모니터링은 다음 순서대로 진행하자.

  1. User CPU
  2. System CPU
  3. I/O Wait CPU
  4. 기타 CPU

자바 애플리케이션에서 (User CPU : System CPU) 사용 비율은 10:1 ~ 8:1 정도라고 볼 수 있다. 만약 이 비율이 1:1이나 3:2 정도라면 해당 애플리케이션이 커널 CPU를 많이 쓴다는 의미가 된다.

I/O Wait가 높다면 자바 애플리케이션에서 I/O 작업이 많다는 의미이다. 어디서 I/O가 많은지 찾아야 한다.


전반적인 상황 모니터링

vmstat : 가상 메모리 통계를 제공한다. 프로세스, 메모리, 페이장, 블록 I/O, 트랩스, 디스크, CPU 정보를 제공한다.

다음 명령어를 실행하면 5초 간격으로 데이터를 출력한다.

vmstat 5

결과는 5초간의 평균값이고, 첫 번째는 시스템 부팅된 이후의 통곗값이다.

결과를 정리하면 다음과 같다.

  • procs
    • r : 실행하기 위해 대기 중인 프로세스 수
    • b : uninterruptible sleep 상태에 있는 프로세스 수
  • memory
    • swpd : 가상 메모리 사용한 크기
    • free : 사용하지 않는 메모리 크기
    • buff : 버퍼로 사용하는 메모리 크기
    • cache : 캐시로 사용하는 메모리 크기
  • swap
    • si : 초당 디스크에서 읽은 스왑 된 메모리 크기
    • so : 초당 디스크로 스왑 된 메모리 크기
  • io
    • bi : 블록 디바이스에서 받은 블록 수
    • bo : 블록 디바이스로 보낸 블록 수
  • system
    • in : clock 포함한 초당 인터럽트 수
    • cs : 초당 콘텍스트 전환 개수
  • cpu
    • us : 사용자 코드 수행하는데 소요된 시간
    • sy : 커널 코드 수행하는데 소요된 시간
    • id : idle 상태에서 수행된 시간
    • wa : io 대기하는데 소요된 시간
    • st : 가상 머신에 뺏긴 시간

프로세스별 CPU 사용량 모니터링

프로세스별 CPU 사용량 모니터링 명령어는 다음과 같다.

pidstat


디스크 사용량

디스크 사용량 명령어는 df와 du명령어가 있다. 우선 df 명령어부터 살펴보자.

df -h

Use%는 사용률을 뜻하는데 사용률이 100%가 되면 다음 에러가 발생할 수 있다.

  • 로그가 쓰이지 않아 hang이 발생
  • 컴파일 불가

du 명령어는 파일과 디렉터리 점유 상황을 보여준다.

du -s [디렉터리 경로]

IO 사용량

iostat

IO 모니터링 도구는 iostat이다.

iostat

시스템 부팅 이후 지금까지 통계 정보를 보여준다. 수행 시간 간격을 지정하고 싶다면 옵션으로 간격 수행 횟수를 붙여주면 된다.

결과는 다음을 뜻한다.

  • tps : 디바이스에 초당 전송 요청한 건수
  • read/s : 디바이스에 초당 읽은 데이터 블록 단위
  • wrtn/s : 디바이스에서 초당 쓴 데이터 블록 단위
  • read : 디바이스에서 지정한 간격 동안 읽은 블록 수
  • wrtn : 디바이스에서 지정한 간격 동안 쓴 전체 블록 수

lsof

lsof는 특정 프로세스에서 어떤 IO가 발생하는지 알려주는 명령어다. lsof에서 쓸 만한 옵션이 2가지 정도 있다. 첫 번째는 -p 옵션이다. 해당 pid를 갖는 프로세스에서 참조하는 파일의 목록을 보여준다. -c 옵션은 ‘명령어 이름’과 같은 명령어로 수행된 프로세스에서 참조하는 파일 목록을 보여준다.

lsof -p [pid]

항목의 의미는 다음과 같다.

  • command : 명령어 이름
  • PID : 프로세스 아이디
  • USER : 명령어 수행한 사용자 아이디
  • FD : 파일 설명이나 상태
  • TYPE : 파일 타입
  • DEVICE : 디바이스 정보
  • SIZE/OFF : 파일 크기
  • NODE : 로컬 파일 노드 정보
  • NAME : 파일 이름

'Java' 카테고리의 다른 글

Java 메모리 진단  (0) 2025.06.11
[자바 트러블 슈팅] 스레드 진단  (0) 2025.05.26