1. 시스템 정보 확인

uname - 커널/OS 정보

# 전체 정보
uname -a
# Linux hostname 5.15.0-91-generic #101-Ubuntu SMP x86_64 GNU/Linux
 
# 커널 릴리즈 버전
uname -r
# 5.15.0-91-generic
 
# 커널 이름
uname -s    # Linux
 
# 머신 아키텍처
uname -m    # x86_64
 
# OS 이름
uname -o    # GNU/Linux

hostnamectl - 호스트 정보 (systemd 기반)

hostnamectl
# Static hostname: myserver
# Icon name: computer-vm
# Machine ID: ...
# Boot ID: ...
# Operating System: Ubuntu 22.04.3 LTS
# Kernel: Linux 5.15.0-91-generic
# Architecture: x86-64
 
# 호스트네임 변경
sudo hostnamectl set-hostname new-hostname

하드웨어 정보 도구

# CPU 정보
lscpu
# Architecture:           x86_64
# CPU(s):                 4
# Model name:             Intel(R) Core(TM) i7-...
# Thread(s) per core:     2
# Core(s) per socket:     2
# CPU MHz:                2400.000
 
# 메모리 정보
lsmem
# 또는
cat /proc/meminfo
 
# PCI 장치 (그래픽카드, 네트워크카드 등)
lspci
lspci -v         # 상세
lspci -nn        # 벤더/디바이스 ID 포함
 
# USB 장치
lsusb
lsusb -v         # 상세
 
# 상세 하드웨어 정보 (BIOS, 메인보드, 메모리 슬롯 등)
sudo dmidecode
sudo dmidecode -t memory     # 메모리 슬롯 정보
sudo dmidecode -t bios       # BIOS 정보
sudo dmidecode -t processor  # CPU 상세 정보

2. CPU/메모리 모니터링

top - 실시간 프로세스/시스템 모니터링

top

top 화면 구성:

top - 14:30:01 up 5 days, 3:22,  2 users,  load average: 0.52, 0.48, 0.45
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.2 us,  2.1 sy,  0.0 ni, 91.8 id,  0.3 wa,  0.0 hi,  0.6 si,  0.0 st
MiB Mem :   7953.5 total,   1234.2 free,   3456.7 used,   3262.6 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4123.8 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 root      20   0  567892 123456  45678 S  12.5   1.5   5:30.22 java

CPU 행 해석:

  • us - 사용자 프로세스 CPU (user space)
  • sy - 커널 프로세스 CPU (system/kernel)
  • ni - nice 값이 변경된 프로세스 CPU
  • id - 유휴 (idle) - 높을수록 여유
  • wa - I/O 대기 - 높으면 디스크 병목
  • hi - 하드웨어 인터럽트
  • si - 소프트웨어 인터럽트
  • st - 가상화 환경에서 하이퍼바이저에 빼앗긴 시간 (steal)

인터랙티브 명령어:

동작
k프로세스 kill (PID 입력 - 시그널 입력)
M메모리 사용량 기준 정렬
PCPU 사용량 기준 정렬
1개별 CPU 코어별 사용률 표시 토글
c전체 명령어 경로 표시 토글
f표시할 필드 선택
H스레드 표시 토글
q종료
d업데이트 간격 변경
W설정 저장 (~/.toprc)
# 특정 사용자의 프로세스만 표시
top -u www-data
 
# 배치 모드 (스크립트용, 1회 출력)
top -b -n 1 > top_output.txt

htop - 향상된 top

htop
 
# 장점:
# - 컬러 표시, CPU/메모리 바 그래프
# - 마우스 클릭 지원
# - 트리 뷰 (F5), 검색 (F3), 필터 (F4)
# - 직관적인 프로세스 kill (F9)
# - 수평/수직 스크롤

free - 메모리 사용량

free -h
#                total    used    free  shared  buff/cache  available
# Mem:           7.8Gi   3.4Gi   1.2Gi   125Mi       3.2Gi      4.0Gi
# Swap:          2.0Gi      0B   2.0Gi
 
# 핵심 해석:
# - used: 실제 프로세스가 사용 중인 메모리
# - buff/cache: 커널이 디스크 캐시로 사용 (필요 시 해제 가능)
# - available: 실제 사용 가능한 메모리 (free + 해제 가능한 cache)
# → "available"이 진짜 남은 메모리
 
# 주기적 모니터링 (2초 간격)
free -h -s 2
 
# MB 단위
free -m

vmstat - 가상 메모리 통계

# 1초 간격으로 출력
vmstat 1
 
# procs -----memory----- ---swap-- -----io---- -system-- ------cpu-----
#  r  b  swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
#  1  0     0 1234000 56000 3200000    0    0    12    25  400  800  5  2 92  1  0
 
# 주요 컬럼:
# r   - 실행 대기 프로세스 수 (CPU 코어 수보다 크면 과부하)
# b   - 인터럽트 불가능 상태(I/O 대기 등)의 프로세스 수
# si  - swap in (디스크→메모리)  → 0이 아니면 메모리 부족
# so  - swap out (메모리→디스크) → 0이 아니면 메모리 부족
# wa  - I/O 대기 CPU %
 
# 초 단위, N회 반복
vmstat 2 10    # 2초 간격, 10회

mpstat - CPU별 상세 통계

# 모든 CPU 코어별 통계
mpstat -P ALL 1
 
# 특정 코어
mpstat -P 0,1 1    # CPU 0, 1번만

3. 프로세스 모니터링

ps - 프로세스 스냅샷

# 가장 많이 쓰는 형태
ps aux
 
# 컬럼 설명:
# USER  PID %CPU %MEM    VSZ   RSS TTY  STAT START   TIME COMMAND
# root    1  0.0  0.1 169580 13200 ?    Ss   Mar15   0:05 /sbin/init
 
# STAT 코드:
# S - Sleep (대기), R - Running, D - Disk sleep (I/O 대기)
# T - Stopped, Z - Zombie
# s - 세션 리더, + - 포그라운드, l - 멀티스레드, < - 높은 우선순위
 
# 트리 형태 출력
ps auxf
 
# 특정 프로세스 검색
ps aux | grep nginx
 
# 메모리 사용량 기준 상위 10개
ps aux --sort=-%mem | head -11
 
# CPU 사용량 기준 상위 10개
ps aux --sort=-%cpu | head -11
 
# 커스텀 포맷
ps -eo pid,ppid,user,%cpu,%mem,vsz,rss,comm --sort=-%mem | head -20

pidstat - 프로세스별 상세 리소스 통계

# CPU 사용률 (1초 간격)
pidstat 1
 
# 메모리 통계
pidstat -r 1
 
# I/O 통계
pidstat -d 1
 
# 특정 PID만
pidstat -p 1234 1
 
# 스레드별 통계
pidstat -t 1

4. I/O 모니터링

iostat

# 디바이스별 확장 통계 (1초 간격)
iostat -dx 1
 
# MB 단위 표시
iostat -dxm 1
 
# CPU 통계도 함께 표시
iostat -xm 1

iotop

# I/O 발생 프로세스만 표시
sudo iotop -o
 
# 누적 통계 모드
sudo iotop -a

dstat - 통합 시스템 통계

# 기본 출력 (CPU, 디스크, 네트워크, 페이징, 시스템)
dstat
 
# 상세 옵션
dstat -cdnm 1    # CPU, Disk, Net, Memory (1초 간격)
 
# 상위 프로세스 표시
dstat --top-cpu --top-mem --top-io
 
# CSV 출력 (분석용)
dstat -cdnm --output stats.csv 1 60

5. 네트워크 모니터링

iftop - 인터페이스별 트래픽 (top 스타일)

# 기본 실행
sudo iftop
 
# 특정 인터페이스
sudo iftop -i eth0
 
# 포트 번호 표시
sudo iftop -P
 
# DNS 해석 비활성화 (속도 향상)
sudo iftop -n

nload - 대역폭 실시간 그래프

nload eth0
# 인/아웃바운드 트래픽을 실시간 그래프로 표시

nethogs - 프로세스별 네트워크 사용량

# 어떤 프로세스가 네트워크를 많이 쓰는지 확인
sudo nethogs
sudo nethogs eth0

bmon - 대역폭 모니터링

bmon
# 인터페이스별 트래픽 통계 및 그래프

6. 시스템 부하

uptime과 Load Average

uptime
# 14:30:01 up 5 days, 3:22,  2 users,  load average: 0.52, 0.48, 0.45
#                                                       1분   5분   15분

Load Average 해석:

  • 실행 중(R) + 실행 대기(R) + I/O 대기(D) 상태의 프로세스 평균 수
  • CPU 코어 수와 비교하여 판단
CPU 4코어 기준:
  Load 0.5  → 여유 (12.5% 활용)
  Load 4.0  → 포화 (100% 활용, 대기 없음)
  Load 8.0  → 과부하 (4개 프로세스가 대기)
  Load 12.0 → 심각 (8개 프로세스가 대기)

경험칙: Load / CPU 코어 수
  < 0.7  → 정상
  0.7~1.0 → 주의
  > 1.0  → 과부하

추세 분석:

  • 1분 > 5분 > 15분 - 부하 증가 중
  • 1분 < 5분 < 15분 - 부하 감소 중
  • 세 값이 비슷 - 안정적
# 상세 정보
cat /proc/loadavg
# 0.52 0.48 0.45 1/215 12345
#                  실행중/전체 마지막PID

7. 로그 시스템

로그 아키텍처

/var/log/ 디렉토리 주요 파일

파일설명
/var/log/syslog (Debian계)일반 시스템 로그 전체
/var/log/messages (RHEL계)일반 시스템 로그 전체
/var/log/auth.log (Debian계)인증 관련 (로그인, sudo, SSH)
/var/log/secure (RHEL계)인증 관련
/var/log/kern.log커널 메시지
/var/log/dmesg부팅 시 커널 메시지 (하드웨어 감지 등)
/var/log/boot.log서비스 시작 로그
/var/log/croncron 작업 로그
/var/log/apt/패키지 관리자 로그 (Debian계)
/var/log/yum.log패키지 관리자 로그 (RHEL계)
/var/log/nginx/Nginx 로그 (access.log, error.log)
/var/log/lastlog마지막 로그인 정보 (바이너리, lastlog 명령으로 조회)
/var/log/wtmp로그인 이력 (바이너리, last 명령으로 조회)
/var/log/btmp실패한 로그인 (바이너리, lastb 명령으로 조회)

rsyslog 설정

# 주 설정 파일
cat /etc/rsyslog.conf
 
# 추가 설정
ls /etc/rsyslog.d/
 
# 시설(facility).우선순위(priority) 형식
# 예시 룰:
# auth,authpriv.*          /var/log/auth.log
# *.*;auth,authpriv.none   /var/log/syslog
# kern.*                   /var/log/kern.log
 
# 시설(facility): auth, cron, daemon, kern, local0~7, mail, user 등
# 우선순위(priority): emerg > alert > crit > err > warning > notice > info > debug

Syslog 우선순위 (높음 - 낮음):

레벨키워드설명
0emerg시스템 사용 불가
1alert즉시 조치 필요
2crit치명적 상태
3err오류
4warning경고
5notice정상이지만 주목할 상태
6info정보 메시지
7debug디버그 메시지

8. journald와 journalctl

systemd의 로깅 시스템. 바이너리 형식으로 저장하며 강력한 필터링을 지원한다.

기본 사용법

# 전체 로그 조회 (페이저로 표시)
journalctl
 
# 최신 로그부터 역순 표시
journalctl -r
 
# 마지막 N줄
journalctl -n 50
 
# 실시간 추적 (tail -f와 유사)
journalctl -f

서비스별 필터링

# 특정 유닛(서비스) 로그
journalctl -u nginx.service
journalctl -u sshd.service
 
# 실시간 추적 + 서비스 필터
journalctl -u nginx.service -f
 
# 여러 서비스
journalctl -u nginx.service -u php-fpm.service

우선순위 필터링

# 에러 이상만 표시
journalctl -p err
 
# 경고 이상
journalctl -p warning
 
# 범위 지정
journalctl -p err..crit

시간 범위 필터링

# 오늘 로그만
journalctl --since today
 
# 특정 시간부터
journalctl --since "2024-01-15 10:00:00"
 
# 시간 범위
journalctl --since "2024-01-15" --until "2024-01-16"
 
# 상대 시간
journalctl --since "1 hour ago"
journalctl --since "30 min ago"

부트별 필터링

# 현재 부트 로그
journalctl -b
 
# 이전 부트 로그
journalctl -b -1
 
# 2번 전 부트 로그
journalctl -b -2
 
# 부트 목록 확인
journalctl --list-boots

기타 유용한 옵션

# 커널 메시지만 (dmesg 대체)
journalctl -k
 
# 특정 PID
journalctl _PID=1234
 
# 특정 사용자
journalctl _UID=1000
 
# 특정 실행파일
journalctl /usr/sbin/sshd
 
# JSON 출력
journalctl -o json-pretty
 
# 디스크 사용량 확인
journalctl --disk-usage
 
# 오래된 로그 삭제 (500MB 이하로 유지)
sudo journalctl --vacuum-size=500M
 
# 2주 이전 로그 삭제
sudo journalctl --vacuum-time=2weeks

journald 설정

# 설정 파일: /etc/systemd/journald.conf
# 주요 설정:
# Storage=persistent     # 영구 저장 (auto/volatile/persistent/none)
# SystemMaxUse=500M      # 최대 디스크 사용량
# SystemMaxFileSize=50M  # 개별 저널 파일 최대 크기
# MaxRetentionSec=1month # 최대 보관 기간
# Compress=yes           # 압축 여부
 
# 설정 변경 후 적용
sudo systemctl restart systemd-journald

9. dmesg - 커널 메시지

# 커널 메시지 조회
dmesg
 
# 사람이 읽기 쉬운 타임스탬프
dmesg -T
 
# 실시간 추적
dmesg -w
 
# 레벨별 필터링
dmesg -l err           # 에러만
dmesg -l err,warn      # 에러 + 경고
 
# 시설별 필터링
dmesg -f kern          # 커널만
 
# 컬러 출력
dmesg --color=always | less -R
 
# 실전: 하드웨어 문제 진단
dmesg -T | grep -i error
dmesg -T | grep -i "usb"        # USB 장치 인식 확인
dmesg -T | grep -i "ata"        # 디스크 오류 확인
dmesg -T | grep -i "oom"        # OOM (Out of Memory) 확인
dmesg -T | grep -i "segfault"   # 세그폴트 확인

10. logrotate - 로그 순환 관리

로그 파일이 무한히 커지는 것을 방지하며, 주기적으로 로그를 순환(rotate)한다.

설정 구조

# 전역 설정
/etc/logrotate.conf
 
# 서비스별 개별 설정
/etc/logrotate.d/
├── nginx
├── syslog
├── apt
└── ...

설정 예시

# /etc/logrotate.d/nginx 예시
/var/log/nginx/*.log {
    daily               # 순환 주기: daily, weekly, monthly, yearly
    missingok           # 로그 파일이 없어도 에러 안 냄
    rotate 14           # 최대 14개 파일 보관
    compress            # gzip으로 압축
    delaycompress       # 직전 파일은 압축하지 않음 (다음 순환 시 압축)
    notifempty          # 빈 파일은 순환하지 않음
    create 0640 www-data adm   # 새 파일 생성 (퍼미션 소유자 그룹)
    sharedscripts       # 스크립트를 한 번만 실행 (와일드카드 매칭 시)
    postrotate          # 순환 후 실행할 명령
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

logrotate 관리

# 수동 실행 (테스트)
sudo logrotate -d /etc/logrotate.d/nginx    # 드라이런(실행 안 함)
sudo logrotate -f /etc/logrotate.d/nginx    # 강제 실행
 
# logrotate 상태 파일
cat /var/lib/logrotate/status
 
# cron에 의해 자동 실행
# /etc/cron.daily/logrotate

11. sar (System Activity Reporter)

시스템 활동 이력을 기록하고 분석하는 도구. sysstat 패키지에 포함.

# 설치
sudo apt install sysstat    # Debian/Ubuntu
sudo yum install sysstat    # RHEL/CentOS
 
# sysstat 수집 활성화
# /etc/default/sysstat에서 ENABLED="true" 설정 (Debian)
sudo systemctl enable --now sysstat

sar 사용법

# CPU 사용률 (1초 간격, 5회)
sar -u 1 5
 
# 메모리 사용량
sar -r 1 5
 
# 스왑 사용량
sar -S 1 5
 
# 디스크 I/O
sar -d 1 5
 
# 네트워크 인터페이스 통계
sar -n DEV 1 5
 
# 네트워크 에러
sar -n EDEV 1 5
 
# 로드 에버리지와 실행 큐
sar -q 1 5
 
# 과거 데이터 조회 (특정 날짜)
sar -u -f /var/log/sysstat/sa15    # 15일 데이터
 
# 시간 범위 지정
sar -u -s 10:00:00 -e 12:00:00
 
# 데이터 파일 위치
ls /var/log/sysstat/    # sa01, sa02, ... (일별)
# 또는
ls /var/log/sa/

12. watch - 주기적 명령 실행

# 2초마다 명령 반복 실행 (기본)
watch df -h
 
# 간격 변경 (0.5초)
watch -n 0.5 'ps aux | head -20'
 
# 변경된 부분 하이라이트
watch -d free -h
 
# 차이가 없으면 종료 않고 계속
watch -d=cumulative 'cat /proc/loadavg'
 
# 명령이 실패하면 종료
watch -e 'some-command'
 
# 실전 활용 예시
watch -n 1 'ss -tuln'                              # 포트 변화 감시
watch -n 5 'tail -5 /var/log/syslog'                # 로그 감시
watch -d -n 1 'cat /proc/net/dev'                   # 네트워크 패킷 변화
watch -n 2 'docker ps --format "table {{.Names}}\t{{.Status}}"'  # 컨테이너 상태

실전 정리: 시스템 문제 진단 체크리스트

# 1. 시스템 전체 상태 빠르게 파악
uptime                      # 부하 확인
free -h                     # 메모리 확인
df -h                       # 디스크 확인
 
# 2. CPU 문제 의심
top                         # CPU 사용률 높은 프로세스 확인 (P로 정렬)
mpstat -P ALL 1             # 코어별 사용률 (특정 코어만 100%인지)
pidstat 1                   # 프로세스별 CPU 상세
 
# 3. 메모리 문제 의심
free -h                     # available 확인
vmstat 1                    # si/so가 0이 아니면 swap 발생 (메모리 부족)
ps aux --sort=-%mem | head  # 메모리 많이 쓰는 프로세스
dmesg -T | grep -i oom      # OOM killer 확인
 
# 4. 디스크 문제 의심
iostat -dx 1                # %util, await 확인
iotop -o                    # I/O 발생 프로세스
df -h && df -i              # 용량 + inode 확인
 
# 5. 로그 확인
journalctl -p err -b        # 현재 부트의 에러 로그
journalctl -u <service> -n 100   # 문제 서비스 로그
dmesg -T | tail -50         # 최근 커널 메시지