IT·리눅스/리눅스

/proc 파일시스템 탐험 - 리눅스 내부 상태 들여다보기

jmineekim 2026. 6. 12. 10:00

top이나 ps가 보여주는 정보가 대체 어디서 오는 걸까 궁금하지 않으셨나요? 답은 /proc 파일시스템입니다. 거의 모든 모니터링 도구가 결국 여기서 정보를 긁어다 보여주는 거예요. 그래서 도구가 막혔거나 정보가 부족할 때, /proc을 직접 cat하면 가장 원시적이고 가장 정확한 정보가 나옵니다. 오늘은 이 가상 파일시스템을 한번 탐험해 보겠습니다.

개념 / 원리

/proc가상 파일시스템(virtual filesystem) 입니다. 디스크 어딘가에 실제 파일로 존재하는 게 아니라, 커널이 메모리에서 실시간으로 만들어서 보여주는 인터페이스예요. mount로 보면 마운트는 되어 있지만 디스크 용량은 차지하지 않습니다.

mount | grep ^proc
# proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

크게 두 종류로 나눠서 봅니다.

  • /proc/<숫자>/프로세스별 정보. 디렉토리 이름이 PID예요.
  • /proc/<이름>시스템 전체 정보. cpuinfo, meminfo, loadavg 같은 것들.

비유하자면 /proc은 커널의 상황판을 그대로 노출한 게시판입니다. 우리는 cat으로 게시물을 읽고, 일부 항목은 echo로 다시 적어 넣을 수도 있습니다(/proc/sys 하위).

실전 예제

시스템 전반

자주 보는 시스템 정보들입니다.

# CPU 정보 (모델명, 코어 수, 캐시 등)
cat /proc/cpuinfo | head -30

# 메모리 통계
cat /proc/meminfo | head -10

# 부팅 시간(초), 누적 idle 시간(초)
cat /proc/uptime

# 1, 5, 15분 평균 부하
cat /proc/loadavg

# 마운트된 파일시스템
cat /proc/mounts

/proc/meminfo에서 MemAvailable이 새 프로세스가 실제로 쓸 수 있는 메모리고, MemFree는 단순 미사용 메모리라 캐시까지 계산에 안 들어갑니다. 메모리 부족 판단은 MemAvailable로 합니다.

특정 프로세스 정보

PID가 12345인 프로세스를 살펴본다고 합시다.

# 상태 요약 (메모리, 상태, 우선순위)
cat /proc/12345/status | head -20

# 실행 명령어
cat /proc/12345/cmdline | tr '\0' ' '; echo

# 실행 파일 경로
readlink /proc/12345/exe

# 현재 작업 디렉토리
readlink /proc/12345/cwd

# 열린 파일 디스크립터 목록
ls -l /proc/12345/fd

# 메모리 매핑 (어떤 라이브러리가 올라왔는지)
cat /proc/12345/maps | head -20

# 사용 자원 limit
cat /proc/12345/limits

fd 디렉토리는 정말 강력합니다. 어느 파일이 열려 있는지, 소켓이 몇 개인지 다 보여서 파일 디스크립터 누수 추적에 자주 씁니다.

네트워크 정보

ssnetstat이 없는 환경에서도 직접 볼 수 있습니다.

# TCP 소켓 정보 (16진수 출력)
cat /proc/net/tcp | head -5

# 라우팅 테이블
cat /proc/net/route

커널 파라미터 변경

/proc/sys/ 하위는 쓰기가 가능합니다.

# 임시로 ip_forward 켜기
echo 1 > /proc/sys/net/ipv4/ip_forward

# 더 안전한 방법 (sysctl 사용)
sysctl -w net.ipv4.ip_forward=1

주의할 점

/proc을 쓸 때 신경 써야 할 포인트들입니다.

첫째, /proc/sys 쓰기는 휘발성입니다. 재부팅하면 다 사라집니다. 영구 적용하려면 /etc/sysctl.conf/etc/sysctl.d/*.conf에 기록하고 sysctl -p로 반영하세요.

둘째, 커널 파라미터는 함부로 바꾸면 위험합니다. vm.swappiness, net.core.somaxconn 같은 건 자주 만지지만, vm.overcommit_memory 같은 건 잘못 건드리면 프로세스가 뜬금없이 죽기 시작합니다. 변경 전 현재값을 메모해 두세요.

셋째, PID가 사라지면 디렉토리도 사라집니다. 잠깐 떴다 죽는 프로세스는 cat을 치기도 전에 디렉토리가 증발해서 "No such file or directory"가 뜹니다. 짧게 떠 있는 프로세스 추적은 /proc보다 auditdeBPF 도구가 낫습니다.

넷째, /proc/<PID>/oom_score 는 OOM Killer가 누구를 죽일지 평가하는 점수입니다. OOM이 자주 터지는 서버에서 어떤 프로세스가 위험한지 미리 확인할 수 있어요. 값이 높을수록 먼저 죽습니다.

저는 예전에 디스크가 가득 찼는데 du로 어디가 차지하는지 안 보여서 한참 헤맸던 적이 있는데, 알고 보니 삭제된 파일을 어떤 프로세스가 계속 열고 있어서였습니다. lsof | grep deleted/proc/<PID>/fd에서 (deleted)로 보이는 파일을 찾아서 해당 프로세스를 재시작하면 디스크가 풀립니다. /proc을 알고 있으니 가능했던 진단이었어요.

마무리

정리하면 세 줄입니다.

  • /proc은 디스크에 없는 가상 파일시스템, 커널이 실시간 만들어 보여줌.
  • /proc/<PID>/ 안에 그 프로세스의 모든 것(메모리, 열린 fd, 매핑, 명령어)이 있음.
  • /proc/sys/ 쓰기는 휘발성, 영구 적용은 /etc/sysctl.conf에.
반응형