
리눅스 서버가 이상하다 싶으면 SSH로 들어가서 몇 개 명령어부터 쳐봅니다. 전부 기본 설치돼 있어서 준비 작업은 필요 없습니다. 이 글에서는 실무에서 자주 쓰는 8개(uname, ip, top, free, vmstat, iostat, ss, df)를 용도별로 정리했습니다.
uname으로 커널과 시스템 정보를 확인합니다. -a 옵션이 전체 정보를 한 번에 보여줍니다.

출력 필드:
6.8.0-45-generic 같은 형태)x86_64, ARM 서버는 aarch64)자주 쓰는 옵션:
$ uname --helpa, --all: 전체 출력s, --kernel-name: 커널 명n, --nodename: 호스트 명r, --kernel-release: 커널 릴리즈v, --kernel-version: 커널 버전m, --machine: 머신 하드웨어 이름p, --processor: 프로세서 종류 또는 ‘unknown’i, --hardware-platform: 하드웨어 플랫폼 또는 ‘unknown’o, --operating-system: 운영체제배포판 정보까지 보려면 cat /etc/os-release 또는 lsb_release -a가 편합니다.
네트워크 인터페이스 상태 확인은 ip(iproute2) 명령어가 표준입니다. 과거 ifconfig가 하던 역할인데, Ubuntu 18.04부터 net-tools가 deprecated 처리돼 최신 배포판에는 기본 설치되지 않는 경우가 많습니다.
레거시 서버에서 ifconfig를 써야 한다면 글 끝의 “부록: 레거시 명령어 참고”를 보세요.
자주 쓰는 형태:
$ ip addr show # 전체 인터페이스 + IP (줄여서 ip a)
$ ip addr show eth0 # 특정 인터페이스만
$ ip link # 링크 상태
$ ip -s link # 송수신 통계 포함
$ ip route # 라우팅 테이블출력 필드:
eth0 대신 ens3, enp0s3 같은 “예측 가능한 이름(Predictable Network Interface Names)”을 씁니다.127.0.0.1). IP 주소는 서버가 아니라 인터페이스에 할당되므로, 인터페이스마다 다른 IP를 가질 수 있습니다.UNKNOWN으로 표시되기도 합니다.bare-metal 서버나 일부 VPS처럼 공인 IP가 인터페이스에 직접 바인딩된 환경이라면 ip addr 출력에 그대로 공인 IP가 보입니다. 반면 AWS EC2, 가정 공유기 뒤의 PC처럼 NAT 환경에서는 인터페이스에는 사설 IP만 할당되고 외부에서 보이는 공인 IP는 따로 확인해야 합니다.
$ curl ifconfig.me
$ curl -s https://ipinfo.io/ip
윈도우 작업 관리자의 리눅스 버전입니다. CPU, 메모리 사용률과 프로세스 목록을 실시간으로 보여줍니다.

첫 줄에 시스템 요약이 나옵니다.
vmstat의 r/b 컬럼이나 iostat을 함께 봐야 판별됩니다.현재 프로세스 상태 요약입니다.
us가 높으면 애플리케이션 코드가 CPU를 태우는 중, sy가 높으면 커널/시스템 호출이 많다는 뜻입니다. id가 계속 0이면 100% 사용 상태이므로 원인 프로세스를 찾아야 합니다. 클라우드 VM에서는 st도 눈여겨봐야 합니다. 호스트가 바빠서 내 VM이 CPU를 뺏기고 있다는 신호입니다.
top 실행 중 Shift + 영문자로 정렬 기준을 바꿉니다.
htop, btop 같은 개선판도 있지만 기본 설치돼 있는 건 top뿐입니다. 기본기부터 익히는 게 안전합니다.
메모리 상태를 확인합니다. -h 옵션은 GiB/MiB 단위로 보기 좋게 출력하고, -t 옵션은 메모리와 스왑 합계를 보여줍니다.

tmpfs). 실제 여유 메모리 판단에는 크게 영향을 주지 않습니다.여유 메모리를 볼 때는 available을 보면 됩니다. 예전에는 used - (buffers + cached) 식으로 수동 계산했는데, 최신 free의 available은 페이지 캐시와 회수 가능한 slab 영역까지 반영한 “스왑 없이 새 프로세스를 시작할 수 있는 추정치”입니다. 수동 계산보다 정확해서 used가 커 보여도 available이 충분하면 여유가 있다고 봐도 됩니다.
단위 옵션:
free -b: 바이트free -k: KBfree -m: MBfree -g: GBfree -h: 자동 단위free -s 2: 2초 간격 반복
프로세스, 메모리, 스왑, 블록 I/O, CPU 상태를 한 화면에 요약해서 보여줍니다.

so가 지속적으로 0보다 크면 물리 메모리가 부족하다는 뜻입니다. 메모리 증설이나 프로세스 최적화가 필요합니다. 순간적으로 튀는 건 괜찮습니다.
bi, bo가 지속적으로 높다면 디스크 I/O가 많다는 뜻입니다. 어느 장치가 그 부하를 받는지는 iostat에서 확인합니다.
s 옵션은 메모리 통계를 요약해서 보여줍니다.
vmstat [delay [count]]로 실시간 추적:
$ vmstat 3 5 # 3초 간격으로 5번
$ vmstat 1 # 1초 간격 (Ctrl+C로 중지)더 세밀한 I/O 분석은 iostat, 커널 이벤트 추적은 perf나 bpftrace로 넘어갑니다.
CPU 사용률과 디스크 I/O 세부 내용을 확인합니다. sysstat 패키지에 있어서 별도 설치가 필요할 수 있습니다 (sudo apt install sysstat).

시스템 전체 CPU 사용률 요약입니다. top의 %Cpu(s)와 같은 의미를 가지며, 디스크 I/O와 나란히 보기 위해 함께 출력됩니다.
x 옵션을 붙이면 훨씬 상세한 지표를 볼 수 있습니다. 작업 종류별(read/write/discard/flush)로 컬럼이 분리되어 나옵니다.
실시간 관찰:
$ iostat 3 5 # 3초 간격으로 5번
$ iostat -x 1 # 확장 정보를 1초 간격NVMe/SSD가 일반화되면서 %util 하나만으로 병목을 단정하긴 어려워졌습니다. 장치가 순차 요청 하나를 계속 처리하는 동안에도 %util은 100%에 가까워질 수 있지만, 내부적으로 처리할 여력은 남아 있을 수 있기 때문입니다. %util은 출발점으로만 보고, 실제 병목 여부는 await(평균 응답 시간), aqu-sz(평균 큐 길이), 처리량(kB/s)을 함께 놓고 판단하는 것이 안전합니다.
소켓 정보를 확인하는 표준 도구입니다. 과거에는 netstat을 썼지만, ss는 커널의 netlink 인터페이스를 직접 사용해서 빠릅니다. 연결이 많은 서버에서는 netstat보다 10배 이상 빠른 경우도 있습니다. 기본 단일 문자 플래그(-t, -u, -n, -l, -p 등)는 netstat과 호환되어 적응이 쉽지만, 상태·주소 필터 같은 고급 문법은 ss 고유입니다.
레거시 서버에서 netstat을 써야 한다면 글 끝의 “부록: 레거시 명령어 참고”를 보세요.
0.0.0.0:*로 표시)p 옵션 필요, root 권한)자주 쓰는 옵션:
t: TCP만u: UDP만n: 호스트명/포트명 조회 생략 (빠름)l: LISTEN 상태만p: 소켓을 쓰는 프로세스 표시 (root 필요)a: 모든 상태s: 프로토콜별 요약m: 소켓 메모리 사용량자주 쓰는 조합:
$ ss -tunlp # TCP/UDP LISTEN 소켓 + 프로세스
$ ss -s # 프로토콜별 요약
$ ss -nat # 모든 TCP 소켓
$ ss -nap '( sport = :80 or dport = :80 )' # 80포트 관련 연결 (양방향)
$ ss -ntp state established '( dport = :443 or sport = :443 )' # HTTPS 활성 연결
디스크 전체 용량과 남은 용량을 보여줍니다. 파일 시스템 타입은 환경에 따라 다릅니다. 일반 서버에서는 ext4, xfs가 흔하고, 컨테이너에서는 overlay가, RAM에 직접 마운트되는 영역에는 tmpfs가 보입니다. 아래 예시는 컨테이너 환경에서 실행한 결과입니다.

옵션:
h: 읽기 좋은 단위(KB/MB/GB)T: 파일 시스템 종류(ext4, xfs, btrfs) 함께 표시i: inode 사용량 (용량은 남는데 파일이 안 만들어지면 inode 고갈일 확률이 높음)디렉토리별로 누가 용량을 먹는지 보려면 du -sh *, 더 편하게는 ncdu를 씁니다. 컨테이너 환경에서는 df -h /var/lib/docker처럼 경로를 콕 찍어서 보는 게 디버깅에 유리합니다.
소개한 명령어들은 “지금 이 서버에서 뭐가 돌아가는지”를 확인하는 데는 빠르고 정확합니다. 다만 대상이 서버 한 대에서 수십 대로 늘어나거나, 조사해야 할 시점이 과거로 가거나, 담당자 없을 때 알림이 필요해지는 순간 금방 한계가 옵니다.
이때부터 서버 모니터링 도구의 영역입니다. 와탭 서버 모니터링은 이런 운영 상황을 전제로 만들어져, 원격에서 과거 지표까지 조회하고 이상 상황에는 자동으로 알림을 보냅니다. 일단 명령어로 기본기를 잡아두고, 운영 규모가 커질 때 도구를 얹는 쪽이 현실적입니다.
ifconfig, netstat은 공식적으로 deprecated이지만 기존 서버, 오래된 스크립트, 옛날 매뉴얼에는 계속 등장합니다. 여기서는 이걸 마주쳤을 때 참고할 수 있도록 원문 그대로 정리했습니다. 신규 시스템이라면 본문의 ip, ss 섹션만 봐도 됩니다.
두 명령어 다 net-tools 패키지에 들어있고, 최신 배포판에는 기본 설치돼 있지 않습니다.
$ sudo apt install net-tools # Debian/Ubuntu
$ sudo dnf install net-tools # RHEL/Fedora
시스템 네트워크 인터페이스의 상태를 확인하거나 변경합니다.

주요 필드:
eth0 대신 ens3, enp0s3 같은 예측 가능한 이름을 씁니다.127.0.0.1). 자기 자신과 통신하는 가상 장치입니다. IP는 서버가 아니라 인터페이스에 할당되기 때문에, 인터페이스마다 다른 IP를 갖습니다.net-tools 2.x 버전부터 출력 포맷이 바뀌어서 필드 이름이 일부 달라졌습니다 (HWaddr → ether, inet addr: → inet, Mask: → netmask). 의미는 같습니다.
NAT 환경(클라우드 EC2, 공유기 뒤 PC 등)에서는 인터페이스에 사설 IP만 할당되어 있어, 외부에서 보이는 공인 IP는 ifconfig 출력에 나타나지 않습니다. 이런 경우 외부 서비스에 질의하면 됩니다. (bare-metal 서버처럼 공인 IP가 인터페이스에 직접 바인딩된 환경에서는 그대로 보입니다.)
$ curl ifconfig.me
연결된 네트워크 상태, 라우팅 테이블, 인터페이스 상태를 확인합니다.
.png)
출력은 두 영역으로 나뉩니다.
Internet connections 영역의 컬럼:
UNIX domain sockets 영역의 컬럼:
unix[ ]로 비어 있음)STREAM, DGRAM, SEQPACKET 등)CONNECTED, LISTENING 등)/var/run/...)n: 호스트명/포트명 lookup 생략, IP/포트 번호로 표시a: 모든 상태t: TCP만u: UDP만p: 해당 포트를 쓰는 프로그램과 PIDr: 라우팅 테이블s: 프로토콜별(IP, ICMP, TCP, UDP 등) 통계c: 연속 출력l: LISTEN 소켓만$ netstat -r # 라우팅 테이블
$ netstat -na # TCP/UDP 세션 목록
$ netstat -na | grep ESTABLISHED | wc -l # 활성 세션 수
$ netstat -nap | grep :80 | grep ESTABLISHED | wc -l # 80포트 동시 접속자
$ netstat -nltp # LISTEN 포트 + 프로세스
와탭 서버 모니터링은 멀티테넌트로 팀원 누구나 원격에서 지표와 알림을 받을 수 있습니다. → 와탭 무료로 시작하기