Linux Internals 모두가 *꼭* 이해해야 하는
Source: Dev.to
번역을 진행하려면 번역하고자 하는 전체 텍스트(코드 블록 및 URL 제외)를 제공해 주시겠어요? 텍스트를 받는 대로 원본 형식과 마크다운을 유지하면서 한국어로 번역해 드리겠습니다.
“I know Linux”를 넘어
DevOps를 주장한다면, Linux는 단순한 OS가 아니라 런타임, 디버거, 방화벽, 스케줄러, 그리고 부검 보고서입니다. 커널이 노출하는 파일 시스템과 프로세스 동작을 이해하는 것이 프로덕션 신뢰성을 위해 필수적입니다.
/proc & /sys – 커널의 가상 파일시스템
Linux는 내부 상태를 파일 형태로 노출합니다. 두 파일시스템 모두 부팅 시 생성되는 가상 파일시스템(디스크 I/O 없음)이며 현재 커널 상태를 반영합니다.
주요 /proc 경로
| Path | Description |
|---|---|
/proc/cpuinfo | CPU 아키텍처, 코어 |
/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, 드라이버, 컨테이너에서 하드웨어 및 커널 상호작용을 제어하기 위해 사용됩니다.
| Path | Example Use |
|---|---|
/sys/class/net/eth0/speed | 네트워크 인터페이스 속도 조회 |
/sys/block/sda/queue/scheduler | I/O 스케줄러 보기 또는 설정 |
핵심 요점
/proc= 현재 일어나는 일/sys= 하드웨어와 커널이 연결되는 방식
Process Lifecycle: 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
Interview gold line: “좀비는 메모리를 차지하지 않지만 PID 공간을 소진합니다.”
Load Average
uptime
# output: 1.2, 0.9, 0.7
세 개의 숫자는 지난 1분, 5분, 15분 동안 실행 가능하거나 대기 중인 프로세스의 평균 개수를 나타냅니다.
| Load | Interpretation (on 4‑core system) |
|---|---|
| 4 | Healthy (≈1 per core) → 건강함 (코어당 약 1개) |
| 10 | Overloaded → 과부하 |
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
특징:
- 내장 워치독
- CGroup 자원 제한
- 결정론적 시작 순서
면접관은 “/proc을 설명해라”라고 묻지 않을 수도 있습니다; 대신 “로드는 높은데 CPU는 유휴 상태인 이유는?” 혹은 “앱이 재시작됐지만 포트가 아직 사용 중인 이유는?”와 같은 질문을 할 것입니다. 이러한 내부 구조를 숙달하면 자연스럽게 답변할 수 있습니다.
결론
Linux은:
- 당신의 가시성 플랫폼
- 당신의 런타임 보안 레이어
- 당신의 진실 소스
기본 원칙은 천천히 변하지만, 이를 마스터하면 영원히 복리 효과를 얻을 수 있습니다.