사전 sar
인터페이스

sar

gabury1고친 사람 github-actions[bot]

sar 는 서버가 지난 시간에 얼마나 바빴는지 다시 보여 주는 명령입니다. 평소에 몇 분마다 자원 상태를 파일에 적어 둡니다. 나중에 그 기록을 꺼내 시각별로 찍습니다. 「어젯밤 새벽 세 시에 왜 느렸나」처럼 이미 지나간 일을 따져야 할 때 꺼내는 진단 명령입니다.

쉽고 빠른 이해

sar 는 서버의 바쁜 정도를 기록해 두었다가 나중에 보여 주는 명령입니다. 아침에 출근해서 sar -u 를 치면 어제 자정부터 지금까지 10분 간격으로 「그때 서버가 얼마나 바빴나」가 줄줄이 찍힙니다.

장애는 대개 아무도 화면을 안 보고 있을 때 지나갑니다. 다른 진단 명령은 지금 이 순간만 보여 주므로, 다 끝난 뒤에 치면 평온한 숫자만 나옵니다.

  1. 정해 둔 시각마다 수집 프로그램이 운영체제가 세어 둔 숫자를 읽습니다
  2. 읽은 값을 그날 치 기록 파일에 덧붙입니다
  3. 사람이 sar 를 치면 그 파일을 읽어 시각별 표로 찍습니다

대가가 있습니다. 기록은 몇 분 간격의 평균이라 그보다 짧게 치솟은 순간은 묻힙니다. 어느 프로그램이 자원을 썼는지도 남지 않습니다.

상세

sar 는 system activity report(시스템 활동 보고)를 줄인 이름입니다. 옛 유닉스에서 온 명령입니다. 리눅스에서는 sysstat 라는 도구 묶음에 들어 있습니다. CPU(Central Processing Unit, 중앙 처리 장치), 메모리, 디스크, 네트워크 인터페이스가 어떻게 쓰였는지를 한 명령으로 모두 볼 수 있습니다.

sar 가 하는 일은 둘입니다. 하나는 지금 상태를 몇 초마다 찍는 일입니다. 다른 하나는 미리 쌓아 둔 기록을 꺼내 지난 시각의 상태를 찍는 일입니다.

앞의 일은 다른 명령도 합니다. 디스크 입출력을 지금 찍는 iostat, 메모리와 CPU 를 한 줄로 찍는 vmstat 가 그렇습니다. 뒤의 일이 sar 를 따로 찾는 까닭입니다.

지금 상태를 찍는 쓰임

간격과 횟수를 주면 sar 는 iostat 처럼 지금 상태를 찍습니다. 첫 숫자가 간격(초)이고 둘째 숫자가 횟수입니다.

sar 1 3        # CPU 를 1초마다 세 번
sar -r 5 2     # 메모리를 5초마다 두 번

옵션 글자를 안 주면 CPU 를 봅니다. 무엇을 볼지 고르는 옵션은 아래 「무엇을 볼지 고르는 옵션」 소절에 모았습니다.

기록을 쌓는 수집기

sar 의 쓸모는 아무도 안 보는 동안에도 기록이 쌓인다는 데 있습니다. 기록을 쌓는 일은 sar 가 아니라 sadc 라는 수집 프로그램이 합니다. 이름은 system activity data collector(시스템 활동 자료 수집기)의 줄임입니다.

sadc 는 혼자 돌지 않습니다. 정해진 시각에 프로그램을 띄워 주는 cron 이나 systemd 타이머가 흔히 10분마다 sadc 를 깨웁니다. 깨워진 sadc 는 커널이 켜진 뒤로 계속 더해 온 숫자를 읽어 파일에 적고 끝납니다.

적는 파일은 하루에 하나입니다. 이름은 sa 뒤에 그달의 날짜 두 자리를 붙인 꼴이라, 16일 치는 sa16 입니다. 레드햇 계열 배포판은 /var/log/sa/ 에, 데비안 계열은 /var/log/sysstat/ 에 둡니다. 사람이 읽는 글이 아니라 이진 파일이라 cat 으로 열면 깨져 보입니다.

누적 숫자가 구간 평균이 되는 법

sadc 가 적는 숫자는 커널이 켜진 뒤로 쌓인 합계입니다. 「지금까지 디스크를 몇 번 읽었나」 같은 값이라 그 자체로는 바쁜 정도를 말해 주지 않습니다. sar 는 앞뒤로 적힌 두 값의 차이를 그 사이 시간으로 나눕니다. 그렇게 나온 값이 그 구간의 평균입니다.

서버가 다시 켜지면 커널은 이 합계를 0 부터 다시 셉니다. 그대로 차이를 내면 엉뚱한 값이 나옵니다. 그래서 다시 켜진 시각에는 기록에 LINUX RESTART 라는 줄이 끼어 있습니다. sar 는 이 줄을 넘어가며 차이를 내지 않습니다.

아래 그림은 수집과 읽기가 서로 다른 때 돈다는 것을 보입니다.

flowchart TD
    subgraph S1["평소 · 아무도 안 볼 때"]
        A["타이머가 10분마다 sadc 를 깨운다"] --> B["sadc 가 누적 숫자를 읽어 sa16 에 덧붙인다"]
    end
    subgraph S2["나중 · 사람이 sar 를 칠 때"]
        C["sar 가 sa16 을 읽는다"] --> D["앞뒤 값의 차이로 구간 평균을 내 표로 찍는다"]
    end
    S1 -->|"파일만 남는다"| S2

수집하는 쪽은 화면을 안 띄우고 파일만 남깁니다. 장애가 지나간 뒤에 sar 를 쳐도 장애 시각의 숫자가 남아 있는 까닭입니다.

수집이 꺼져 있는 서버

sysstat 를 깔았다고 기록이 쌓이는 것은 아닙니다. 배포판에 따라서는 수집이 꺼진 채로 깔립니다. 이런 서버에서 지난 기록을 보려 하면 기록 파일이 없다는 에러가 납니다.

데비안 계열이라면 /etc/default/sysstat 에서 수집을 켜야 합니다. 켠 뒤부터 쌓이므로 켜기 전의 일은 볼 수 없습니다. sar 는 미리 켜 둔 서버에서만 쓸모가 있는 명령입니다.

지난 기록 꺼내기

간격을 안 주고 sar 를 치면 오늘 치 기록 파일을 읽습니다. 다른 날을 보려면 -f 로 그날 파일을 고릅니다.

sar -u                      # 오늘 치
sar -u -f /var/log/sa/sa15  # 15일 치
sar -q -s 02:00:00 -e 04:00:00

마지막 줄의 -s 와 -e 는 보고 싶은 시간대의 시작과 끝입니다. 위 예는 새벽 두 시부터 네 시까지의 기록만 찍습니다.

같은 줄의 -q 는 실행 큐를 보는 옵션입니다. 실행 큐는 CPU 를 받으려고 줄 선 프로세스들의 줄입니다. 이 줄이 길면 CPU 가 모자랐다는 뜻입니다.

기록을 다른 도구로 넘기고 싶을 때는 같은 묶음의 sadf 를 씁니다. 같은 기록 파일을 CSV(Comma-Separated Values, 쉼표로 구분한 값)나 JSON(JavaScript Object Notation) 꼴로 바꿔 줍니다.

무엇을 볼지 고르는 옵션

옵션 글자 하나가 자원 하나를 고릅니다. 지금 상태를 볼 때나 지난 기록을 볼 때나 같은 글자를 씁니다.

옵션 보는 것
-u CPU 시간을 어디에 썼나
-P ALL -u 를 코어마다 한 줄씩
-q 실행 큐
-r 메모리를 얼마나 썼나
-W 메모리가 모자라 디스크로 내보내고 들여온 양
-B 메모리에 없어 디스크에서 다시 읽어 온 횟수
-b 디스크 전체의 읽기·쓰기 양
-d 디스크마다 따로
-n DEV 네트워크 인터페이스마다 주고받은 양
-n EDEV 네트워크 인터페이스마다 오류
-w 프로세스를 만들고 바꾼 횟수
-A 위 전부

출력에는 칸이 많습니다. 아래는 진단에서 자주 보는 칸만 하나씩 풉니다.

-q 의 첫 칸 runq-sz 는 실행 큐에 줄 선 프로세스 수입니다. 그 시각에 CPU 를 기다리던 프로세스가 몇이었나를 말합니다.

ldavg-1 은 실행 큐 길이를 지난 1분에 걸쳐 평균 낸 값입니다. 이 값을 로드 애버리지라고 합니다. 순간값보다 덜 출렁여서 추세를 보기 좋습니다.

blocked 는 디스크 응답을 기다리며 멈춘 프로세스 수입니다. runq-sz 가 CPU 를 기다린 줄이라면 blocked 는 디스크를 기다린 줄입니다.

-w 의 cswch/s 는 CPU 가 돌리던 프로세스를 다른 것으로 1초에 몇 번 바꿨나입니다. 이 바꿈이 컨텍스트 스위치입니다. 바꿀 때마다 품이 들어서, 너무 잦으면 일보다 바꾸기에 시간을 씁니다.

메모리가 모자라면 운영체제는 당장 안 쓰는 내용을 디스크의 스왑 공간으로 내보냈다가 필요할 때 들여옵니다. 이렇게 오가는 일을 스와핑이라 합니다. -W 의 pswpin/s 와 pswpout/s 가 1초에 들여오고 내보낸 양입니다. 이 값이 꾸준히 오르면 메모리가 모자라다는 신호입니다.

-B 의 majflt/s 는 필요한 내용이 메모리에 없어 디스크에서 읽어 와야 했던 횟수입니다. 이런 일을 메이저 페이지 폴트라고 합니다. 디스크를 거치므로 한 번 한 번이 느립니다.

-d 의 await 는 디스크에 요청을 낸 뒤 끝나기까지 걸린 평균 시간입니다(밀리초). 디스크가 밀리면 요청이 줄을 서므로 이 값이 늘어납니다.

-d 로 디스크를 볼 때는 -p 를 같이 붙입니다. 붙이지 않으면 장치가 dev8-0 같은 번호로 찍힙니다. 붙이면 sda 처럼 익숙한 이름으로 찍힙니다.

CPU 기록 한 장 읽기

아래는 sar -u 의 출력에서 칸 일부만 추린 모양입니다. 값은 예로 지어낸 것입니다.

          %user %system %iowait %idle
02:50:01   12.1     3.0     0.8  84.1
03:00:01   10.4     4.2    41.7  43.7
03:10:01   11.0     3.9    38.2  46.9
03:20:01   12.6     3.1     1.0  83.3
Average:   11.5     3.6    20.4  64.5

줄 맨 앞의 시각은 그 10분 구간이 끝난 시각입니다. 03:00:01 줄은 두 시 오십 분부터 세 시까지의 평균입니다. 맨 끝 Average: 줄은 위에 찍힌 줄 전부의 평균입니다.

칸은 CPU 시간을 쓰임새별로 나눈 비율(%)입니다. %user 는 프로그램 자신의 코드를 돌린 시간입니다. %system 은 커널이 일한 시간입니다. %idle 은 할 일 없이 쉰 시간입니다.

%iowait 도 쉰 시간의 한 갈래입니다. CPU 는 할 일 없이 쉬고 있었습니다. 다만 그동안 끝나지 않은 디스크 요청이 걸려 있었습니다. 그런 시간의 비율이 %iowait 입니다. 자세한 사정은 입출력 대기 편이 다룹니다.

이 출력에서 눈에 띄는 것은 %iowait 입니다. 두 시 오십 분부터 세 시 십 분 사이에만 41.7, 38.2 로 뛰었다가 다시 내려왔습니다. 다만 이 값은 쉬는 시간의 한 갈래라 이것만으로 디스크가 밀렸다고 단정하지 않습니다. 같은 시간대의 sar -d -p 를 열어 디스크 대기 시간(await 칸)이 함께 늘었는지 봅니다.

기록 간격이 감추는 것

기록 한 줄은 그 간격 동안의 평균입니다. 10분 간격이라고 해 봅시다. 1분만 CPU 가 꽉 찼고 나머지 9분은 한가했다면, 그 줄의 CPU 사용률은 10% 남짓으로 찍힙니다. sar 기록에서 평탄해 보인다고 그 시간대가 무사했다고 볼 수는 없습니다.

간격을 좁히면 덜 묻힙니다. 대신 기록 파일이 그만큼 커집니다. 수집기도 더 자주 깹니다. 짧은 순간을 잡아야 한다면 sar 기록보다 촘촘하게 모으는 모니터링 도구가 맞습니다.

진단 장면

새벽 세 시쯤 API(Application Programming Interface) 응답이 느렸다는 알림이 왔고, 아침에 확인하니 지금은 멀쩡하다고 해 봅시다. sar 로 그 시간대를 되짚는 순서는 아래와 같습니다.

flowchart TD
    A["sar -q -s 02:30:00 -e 03:30:00 · 줄이 길었나"] --> B{"runq-sz 나 blocked 가 평소보다 컸나"}
    B -->|"아니다"| C["서버 안쪽은 한가했다 · 네트워크나 바깥을 본다"]
    B -->|"runq-sz 가 컸다"| D["sar -u 로 CPU 가 꽉 찼는지 본다"]
    B -->|"blocked 가 컸다"| E["sar -d -p 로 어느 디스크가 밀렸는지 본다"]
    E --> F["sar -W 로 스와핑이 원인이었는지 본다"]

첫 갈림에서 -q 를 먼저 여는 까닭은 CPU 와 디스크 가운데 어느 쪽에 줄이 섰는지를 한 장에서 가를 수 있기 때문입니다. runq-sz 는 CPU 를 기다린 줄입니다. blocked 는 디스크를 기다린 줄입니다. 「평소보다」를 판단하려면 비교할 시간대가 있어야 합니다. 전날 같은 시각의 파일을 -f 로 열면 됩니다.

디스크가 밀린 시간대에 스와핑도 함께 늘었다면, 원인은 디스크보다 메모리 쪽일 수 있습니다. 메모리가 모자라 스왑을 오가느라 디스크가 바빠진 것입니다.

여기까지 오면 무엇이 막혔는지는 압니다. 하지만 어느 프로세스가 그랬는지는 sar 기록에 없습니다. 그건 그 시각의 로그나 배치 작업 일정에서 찾아야 합니다.

iostat · vmstat · pidstat 과 나눠 맡는 일

sar 가 다른 진단 명령과 다른 점은 시간 축입니다. 같은 서버를 보는 명령들은 아래처럼 일을 나눕니다.

명령 알려 주는 것 지난 시각
sar CPU · 메모리 · 디스크 · 네트워크를 고루 볼 수 있다
iostat 디스크마다 요청 수 · 대기 시간(await) 못 본다
vmstat 메모리 · 스와핑 · 실행 큐 · CPU 를 한 줄에 못 본다
pidstat 프로세스마다 CPU · 디스크 사용량 못 본다

iostat 와 pidstat 는 sar 와 같은 sysstat 묶음에 들어 있습니다. sar 가 있는 서버에는 대개 둘도 있다는 뜻입니다. 지금 일어나는 일은 iostat · vmstat · pidstat 로 보고, 이미 지나간 일은 sar 로 봅니다.

관련 항목

sar 가 기록하는 자원

CPU · 코어 · 메모리 · 디스크 · 네트워크 인터페이스 · 스왑 · 블록 장치

sar 칸이 재는 지표

iowait · 입출력 대기 · 로드 애버리지 · 실행 큐 · 컨텍스트 스위치 · 페이지 폴트 · 스와핑 · 사용률 · 포화 · IOPS · 처리량

sar 기록을 쌓고 내보내는 부품

sysstat · sadc · sadf · cron · systemd · systemd 타이머 · procfs · 커널

sar 와 진단을 나눠 맡는 명령

iostat · vmstat · pidstat · mpstat · top · iotop · netstat · free

sar 기록을 해석하는 방법론

USE 방법 · 성능 · 병목 · 성능 분석 · 리틀의 법칙

sar 기록보다 촘촘하게 모으는 수단

모니터링 · 시계열 · Prometheus · 메트릭 · 경보

다른 이름: system activity report · sar 명령 · 사르