Linux Internals: 모두가 반드시 이해해야 하는

발행: (2026년 1월 19일 오전 04:29 GMT+9)
6 분 소요
원문: Dev.to

I’m ready to translate the article for you, but I don’t have the article’s content. Could you please paste the text you’d like translated (excluding the source line you already provided)? Once I have the full content, I’ll translate it into Korean while preserving the original formatting, markdown, and any code blocks or URLs.

Beyond “I know Linux”

DevOps를 주장한다면, Linux는 단순한 OS가 아니라 런타임, 디버거, 방화벽, 스케줄러, 그리고 부검 보고서이다. 커널‑노출 파일시스템과 프로세스 동작을 이해하는 것은 프로덕션 신뢰성을 위해 필수적이다.

/proc & /sys – 커널의 가상 파일시스템

Linux는 내부 상태를 파일로 노출합니다. 두 파일시스템 모두 부팅 시 생성되는 가상 파일시스템(디스크 I/O 없음)이며 현재 커널 상태를 반영합니다.

주요 /proc 경로

PathDescription
/proc/cpuinfoCPU 아키텍처, 코어 수
/proc/meminfo메모리 통계
/proc/loadavg부하 평균 (1, 5, 15 분)
/proc/<pid>/fd프로세스의 열린 파일 디스크립터
/proc/<pid>/maps프로세스의 메모리 매핑

운영 인사이트

ls -l /proc/<pid>/fd | wc -l   # count open file descriptors

디스크립터 누수를 즉시 감지합니다.

주요 /sys 경로

udev, 드라이버 및 컨테이너에서 하드웨어와 커널 상호작용을 제어하기 위해 사용됩니다.

PathExample Use
/sys/class/net/eth0/speed네트워크 인터페이스 속도 조회
/sys/block/sda/queue/schedulerI/O 스케줄러 확인 또는 설정

핵심 요점

  • /proc = 현재 무슨 일이 일어나고 있는가
  • /sys = 하드웨어와 커널이 어떻게 연결되어 있는가

프로세스 라이프사이클: fork → exec → zombie

프로세스 생성 및 종료에 대한 이해는 주니어와 시니어 엔지니어를 구분합니다.

fork();                // child process created
exec("/bin/java");     // replace child with new program
wait();                // parent collects exit status

부모가 wait()를 수행하지 않으면 자식은 좀비가 됩니다:

ps aux | grep Z   # shows zombie processes

인터뷰 골드 라인: “좀비 프로세스는 메모리를 차지하지 않지만 PID 공간을 고갈시킵니다.”

Load Average

uptime
# output: 1.2, 0.9, 0.7

세 숫자는 최근 1분, 5분, 15분 동안 실행 가능하거나 대기 중인 프로세스의 평균 개수를 나타냅니다.

LoadInterpretation (on 4‑core system)
4정상 (코어당 약 1)
10과부하

CPU 사용률이 낮은 상태에서 높은 부하가 나타나는 경우는 보통 I/O 병목을 의미합니다.

메모리 메트릭

free -m

available 열에 집중하고 “free”는 무시하세요. Linux는 캐시용으로 자유 메모리를 적극적으로 사용하므로 사용량이 높아 보이는 것이 정상입니다.

유용한 도구:

vmstat 1
iostat -x
top
htop

이 도구들은 CPU 대기 시간, 디스크 지연 시간, 그리고 런‑큐 길이를 서로 연관시켜 보여줍니다.

소켓 – IP + 포트 + 프로토콜

ss -tulnp

예시 출력

LISTEN 0 128 0.0.0.0:8080 java
상태의미
LISTEN연결 대기 중
ESTABLISHED활성 연결
TIME_WAIT정상 종료
CLOSE_WAIT애플리케이션 버그 (연결 누수)

CLOSE_WAIT 상태에 머무르는 소켓은 애플리케이션이 연결을 올바르게 종료하지 못하고 있음을 나타냅니다.

SELinux – 강제 접근 제어

파일 권한만으로는 충분하지 않습니다. SELinux 모드를 확인하세요:

getenforce
# Enforcing | Permissive | Disabled

일반적인 운영 환경 실패 사례: Unix 권한은 올바르지만 SELinux 컨텍스트가 잘못된 경우.

문제 해결 단계

ausearch -m avc -ts recent          # find recent denials
semanage fcontext -a -t <type> <path>
restorecon -v <path>

수석 규칙: 운영 환경에서 SELinux를 절대 비활성화하지 말고, 정책을 수정하세요.

systemd – 서비스 감독

systemd는 프로세스 감독, 로깅, 의존성 관리 및 자동 재시작을 처리합니다.

예시 유닛 파일

[Service]
ExecStart=/app/start.sh
Restart=always
MemoryMax=2G

최근 실패 확인:

journalctl -u myapp --since today

기능:

  • 내장 watchdog
  • CGroup 리소스 제한
  • 결정적인 시작 순서

면접관은 “/proc를 설명해라”라고 묻지 않을 수도 있습니다; 대신 “로드는 높은데 CPU는 유휴 상태인 이유는?” 혹은 “앱이 재시작됐지만 포트가 아직 사용 중인 이유는?”와 같은 질문을 할 것입니다. 이러한 내부 구조를 숙달하면 자연스럽게 답변할 수 있습니다.

요약

Linux는:

  • 당신의 관측성 플랫폼
  • 당신의 런타임 보안 레이어
  • 당신의 진실 소스

기본 원칙은 천천히 변하지만, 이를 마스터하면 영원히 복리 효과가 누적됩니다.

Back to Blog

관련 글

더 보기 »