Linux command - atop

sycho·2023년 12월 1일
0

Linux Commands

목록 보기
4/30

atop

  • documentation. 여기서 설명하는 것 이상으로 유용한 command 및 atop에서 출력하는 정보에 대한 내용이 써져 있으니 궁금하면 찾아보자.

  • background에서 주기적으로 CPU, memory, disk I/O 등을 process 혹은 thread가 얼마나 했는지를 분석하고 이를 로그로 남기는 command다.

  • 또한 htop처럼 실시간으로 각 process 혹은 thread가 위를 얼마나 소모했는지 분석하는 것도 가능하다.

  • 보통 설치를 해야 하는데, 다음과 같은 command를 사용하면 된다.

$ sudo apt-get install atop

작동 원리

  • atop command를 terminal에 입력하면 먼저 stdout이 스크린 상에 연결이 되어 있는지, 아니면 파일이나 pipe에 연결되어 있는지를 파악한다.

interactive mode

  • 전자의 경우 htop처럼 실시간으로 분석을 하는 화면이 나오게 된다. 후자의 경우 파일에다가 실시간으로 나올 화면 output을 주기적으로 저장한다. 실시간 화면의 경우 밑과 같다.

  • 이 때 키보드 버튼을 누르면서 위 화면이 어떻게 표시를 할지를 조작하는 것이 가능하다. 아니면 처음에 켜질 때부터 어떻게 표시 될지를 지정하기 위해 flag를 부여하는 것도 가능하다. format은 다음과 같다.
atop [-g|-m|-d|-n|-u|-p|-s|-c|-v|-o] [-C|-M|-D|-N|-A] [-af1x] [-L linelen] [-Plabel[,label]...] [ interval [ samples ]]

Raw Data Storage

  • 그러면 output을 파일에 저장하도록 시킬거면, 즉 실시간 분석 화면이 아닌 background에서 분석하면서 로깅을 하려고 하면 어떻게 해야 하는가? -w flag를 사용하면 된다. 뒤에 파일 이름까지 지정해줘야 한다. 이미있는 파일 이름이고 그게 raw data file인것도 확인이 되면 파일 내용물 끝에 이어서 기록을 한다.

  • 경로를 따로 알려주지 않고 파일 이름만 적으면 현재 경로에다가 해당 rawfile을 저장한다.

  • 실시간 화면도 그렇고 이 저장방식도 그런데, output에 남는 process는 지정된 주기동안 활동을 한 process들만 기록이 된다. 즉 process가 존재하더라도 해당 주기에서 활동을 아무것도 안했으면 기록이 안 남는데, 이것은 -a flag를 통해 활동 안한 process들도 기록이 남도록 수정하는게 가능하다. (참고로 실시간 화면에서는 a 버튼을 누르면 된다.)

  • 기본적으로 주기는 10초이며, sampling 횟수는 무한대다. 즉 강제로 종료되지 않을 때까지 sampling을 하는 것이다. sampling 횟수랑 주기는 전부 수정이 가능하며, sampling 횟수 설정 대신 -S를 사용해가지고 자정 전에 끝나도록 설정하는 것도 가능하다.

  • format은 다음과 같다.

atop -w rawfile [-a] [-S] [ interval [ samples ]]
  • 만일 특정 rawfile을 읽고 싶으면 다음과 같은 format을 사용하면 된다.
atop -r [ rawfile ] [-b hh:mm ] [-e hh:mm ] [-g|-m|-d|-n|-u|-p|-s|-c|-v|-o] [-C|-M|-D|-N|-A] [-f1x] [-L linelen] [-Plabel[,label]...]
  • flag 없는 출력은 다음과 같다.

  • atop은 설치가 되자마자 atop.daily라는 script file을 저장한다. 이게 뭘 하냐면 atop을 매 자정마다 실행, 10분 간격으로 /var/log/atop/atop_YYYYMMDD라는 파일에다가 저장한다. 또 4주 이상 지난 rawfile은 전부 삭제한다. 여기서 YYYY는 시작 연도, MM은 달, DD는 날짜에 해당한다. 2023년 12월 1일의 경우 atop_20231201이라는 파일에 저장이 될 것이다.

  • 위 script file은 cron daemon이 관리한다. 아까 말한 script file의 저장 경로는 정확히는 /etc/atop/atop.daily에 존재하는데, cron daemon은 0 0 * * * root /etc/atop/atop.daily라는 구문을 실행한다.

  • 저 구문은 cron job entry인데, 매년 매월 매일 0시 0분에 (0 0 * * * ), root 권한으로 (root), /etc/atop/atop.daily를 수행한다는 것을 의미한다.

  • github에 해당 script file이 공유되어 있다.

output 설명 (System-level, 상위 부분 창)

PRC (process level totals)

  • system mode(sys)와 user mode(user)에서 CPU가 얼마나 가동되었는지를 알려준다.

  • running 중인 process(#proc) / running 중인 thread(#trun) / sleeping interruptible(#tslpi) / sleeping uninterruptible(#tslpu) / zombie(#zombie) / clone system call('clones') / 종료된 process('exit') 개수를 전부 알려준다.

CPU (CPU utilization)

  • OS 입장에서 본 코어별 CPU 정보.
    • kernel mode 수행 비중 ('sys')
    • user mode 수행 비중 ('user')
    • interupt handling 수행 비중 ('irq')
    • disk I/O를 기다리느라 사용 못한 CPU 비중 ('wait')
    • VM의 경우 같은 하드웨어에서 수행하는 다른 VM 때문에 빼았긴 비중 ('steal')
    • 암것도 안한 비중('idle')
    • 평균 frequency ('avgf')
    • 현재 frequency ('curf')

CPL (CPU load information)

  • CPU에 load되서 돌아갈 수 있는 thread들(R), 혹은 disk I/O를 기다리는 thread들(D)에 대한 평균 부하(load average) 정보를 나타낸다. 평균 부하에서 흔히 사용되는 단위인 1분, 5분, 15분 평균을 측정한다.

  • context switch 횟수, interrupt 처리 횟수, 가용가능 cpu 개수도 보여준다.

MEM (memory occupation)

  • 메모리 관련 수치를 제공한다.
    • 총 제공가능한 실제 메모리 양 ('tot')
    • 현재 사용중이지 않은 메모리 양 ('free')
    • page cache 차지량 ('cache')
    • filesystem metadata 차지량 ('buff')
    • kernel malloc 차지량 등등

SWP (swap occupation and overcommit info)

  • swap space 관련 수치를 제공한다.
    • disk에서 제공중인 swap 공간 ('tot')
    • 현재 사용중이지 않은 swap 공간 ('free')
    • 현재 Virtual Memory 공간 ('vmcom')
    • 최대 Virtual Memory 공간 ('vmlim')

PAG (paging frequency)

  • paging 관련 operation을 어마나 했는지에 대한 수치를 알려준다.
    • 여유 공간이 부족해서 drop할 page를 정하기 위해 scanning 한 횟수 ('scan')
    • 긴급히 특정 page를 disk에서 다시 memory에 load 한 횟수 ('stall')
    • disk의 swap space에서 memory로 page 이동한 횟수 ('swin')
    • disk의 swap space로 memory page를 이동한 횟수 ('swout')

LVM/MDD/DSK (logical volume / multiple device / disk utilization)

  • 디스크 관련 정보
    • request 처리하느라 바빴던 비중 ('busy')
    • read request 처리량 ('read')
    • write request 처리량 ('write')
    • read당 읽은 KB ('KiB/r')
    • 평균 request queue depth ('avq')
    • request당 seek, latency, data transfer에 평균적으로 소요된 시간. ms 단위 ('avio')

NET (network utilization)

  • Transport layer

    • 오류로 받은 segment를 포함하는 받은 모든 tcp segment 개수 ('tcpi')
    • UDP datagram 받은 횟수 ('udpi')
    • UDP datagram 전송 횟수 ('udpo')
    • active TCP open 개수 (본인이 client) ('tcpao')
    • passive TCP open 개수 (본인이 server) ('tcppo')
    • retransmission ('tcprs')
    • UDP no port (본인이 datagram에 적힌 port 운용하는게 없음) ('udpnp')
    • UDP input 오류 ('tcpie')
  • IP layer

    • interface에서 받은 IP datagram인데 그게 오류인 개수 ('ipi')
    • transmission을 위해 본인이 운용중인 higher layer protocol에서 제공한 datagram 개수 ('ipo')
    • 다른 interface로 forward된 ip datagram 개수 ('ipfrw')
    • 본인이 운용중인 higher layer protocol에 전달한 datagram 개수 ('deliv')
    • 수신한 ICMP datagram 개수 ('icmpi')
    • 송신한 ICMP datagram 개수 ('icmpo')
  • Active Interface

    • 받은 packet 개수 ('pcki')
    • 전송한 packet 개수 ('pcko')
    • 초당 받은 bit 개수 ('si')
    • 초당 송신한 bit 개수 ('so')
    • collision 횟수 ('coll')
    • multicast packet 수신 횟수 ('mlti')
    • packet 수신에서 오류가 나온 횟수 ('erri')
    • packet 송신에서 오류가 나온 횟수 ('erro')
    • 수신한 packet이 drop된 횟수 ('drpi')
    • 송신한 packet이 drop된 횟수 ('drpo')

output 설명 (Process-level, 하위 부분 창)

  • PID : process-id. 가끔 '?'가 나오는데, 측정되던 interval에서 생성되고 바로 종료된 경우에 그렇다. 단 'acct'라는 kernel patch가 설치되면 해당 경우에도 잘 나온다.

  • SYSCPU : system call handling 때문에 system mode에서 해당 process가 CPU를 사용한 시간

  • USRCPU : user mode에서 해당 process가 CPU를 사용한 시간

  • RGROW : 물리 메모리 사용량이 저번 주기동안 얼마나 늘어났는지 알려준다.

  • VGROW : 가상 메모리 사용량이 저번 주기동안 얼마나 늘어났는지 알려준다.

  • EXC : 저번 주기에 종료된 녀석인 경우, exit code가 무엇이었는지 알려준다.

  • THR : process에서 사용한 thread 개수

  • S : process의 main thread의 현재 상태

    • R : run queue에 있거나 실행 중
    • S : event(interrupt) 기다리는 sleep
    • D : interrupt 영향을 안받는 sleep
    • Z : zombie
    • T : 멈춤
    • W : swapping 중
    • E : 종료
  • CPUNR : main thread가 최근에 실행된, 아니면 현재 실행 중인 cpu core 번호

  • CPU : CPU 사용 비중

  • CMD : process 이름.

주요 Interactive mode 단축키

정보 관련

  • g (-g) : 위의 사진에서 나온 기본 창 모드

  • m (-m) : 메모리와 관련해서 더 상세한 정보가 나온다.

  • d (-d) : 디스크와 관련해서 더 상세한 정보가 나온다.

  • n (-n) : 네트워크와 관련해서 더 상세한 정보가 나온다.

  • c (-c) : process의 전체 command line을 보여준다.

process 정렬 관련

  • C (-C) : CPU 사용량에 따라 정렬

  • M (-M) : 메모리 소모량에 따라 정렬

  • D (-D) : 디스크 사용량에 따라 정렬

  • N (-N) : 네트워크 사용량에 따라 정렬. netatop kernel이 설치된 경우에만 작동

  • A (-A) : 가장 많이 사용된 system 자원에 따라 정렬

주요 raw data storage 단축키

  • 앞에서 소개한 interactive mode 단축키들을 여기서 전부 flag 형태로 사용하는게 가능하다.

  • -b : raw file의 특정 시간 이후만을 선택할 때 사용. -e와 혼용 가능.

  • -e : raw file의 특정 시간 이전을 선택할 때 사용. -b와 혼용 가능.

  • -L : 줄 길이 조절. 기본은 80개 ASCII character.

  • y : filename에 y를 집어넣을 경우, 현재 날짜 기준 어제의 log file이 자동으로 열린다. 여러개를 연속으로 넣어서 n일차 전 log file을 여는게 가능하다 (ex : yyyy를 사용하면 4일 전 log file이 자동으로 열린다.)

htop과의 비교

  • 일단 가장 큰 차별점은 interactive mode에서 주기적으로 보여주는 데이터를 파일에도 저장하는게 지원된다는 것이다. htop도 좀 더러운 방법으로 가능은 하나 command상에서 깔끔하게 지원하는 방식은 없다.

  • 특히 '특정 주기'동안 실행된 process/thread의 자원 소모량을 분석하기 때문에 현재 시점에서 이미 종료된 process나 thread의 자원 소모량도 분석이 가능하다는 장점이 있다.

  • 그리고 네트워크/디스크 I/O 자원을 얼마나 소모했는지도 알려준다는 장점이 있다. htop은 이게 불가능하다.

  • 단점도 물론 있다. 일단 마우스 스크롤이랑 마우스 클릭을 지원하지 않는다. 순수 키보드를 통해 조작을 해야 한다.

  • 또 다른 단점은 기본적으로 색깔이 없어서 예쁘지 않다는 것이다(...). 극단적으로 자원을 사용하는 것들은 색깔 부여를 하나 그 외의 경우에는 다 검정이나 하양이어서 분석에 약간 애로사항이 있을 수 있다.

  • 둘 다 기본 Linux에서는 제공이 되지 않다보니, 편의성 및 필요한 기능에 따라 사용할 녀석을 고르면 된다. 둘 다 설치하거나

여담

profile
CS 학부생, 핵심 관심 분야 : Embed/System/Architecture/SWE

0개의 댓글