[2026] Linux 완전 가이드 — 커널 내부(CFS·페이지 캐시·VFS·시스템콜)와 프로덕션 패턴
이 글의 핵심
리눅스는 사용자 공간 애플리케이션과 커널이 시스템 콜로 만나고, 스케줄러(CFS)·가상 메모리(페이지 캐시·스왑)·VFS·cgroups가 한데 얽힌 운영체제입니다. 이 글은 내부 동작을 개념적으로 정확히 짚고, 프로덕션에서 쓰는 한계·관측·장애 패턴까지 연결합니다.
들어가며
Linux는 서버·클라우드·임베디드까지 포괄하는 범용 커널입니다. 운영자와 백엔드 엔지니어가 “왜 이런 증상이 나오지?”를 설명하려면, 사용자 공간의 프로세스·스레드가 시스템 콜로 커널에 진입하고, 커널이 CPU 시간을 나눠 주며(CFS), 파일을 페이지 단위로 캐시하고, 필요 시 스왑으로 압력을 흘리며, 모든 파일 시스템을 VFS 아래에서 일관되게 다룬다는 그림을 머릿속에 두어야 합니다.
이 글은 치트시트가 아니라 내부 개념을 정확히 맞추고 운영으로 연결하는 것을 목표로 합니다. 디스크·inode 이슈는 Linux 디스크 full vs inode와 함께 보시고, 사용자 공간에서의 시스템 콜 관점은 C++ 리눅스 시스템 프로그래밍과 연결하면 이해가 빨라집니다.
이 글에서 다루는 범위
- 프로세스 스케줄링: CFS의 직관, 런큐·vruntime, 우선순위(nice)·cgroup과의 관계
- 메모리 관리: 페이지 캐시, 스왑, reclaim(회수), OOM 흐름
- 파일 시스템 아키텍처: VFS, dentry/inode 캐시, 블록 계층과의 연결
- 시스템 콜 인터페이스: 진입 경로,
strace/eBPF 관찰, 컨테이너·seccomp 맥락 - 프로덕션 패턴: cgroups v2, 리소스 한계, 관측·알람, 장애 시 체크리스트
사전 지식과 용어
- 사용자 공간(user space): 애플리케이션과 라이브러리가 동작하는 주소 공간. 직접 하드웨어에 접근하지 않습니다.
- 커널 공간(kernel space): 특권 모드에서 동작하며 CPU·메모리·블록 디바이스·네트워크 등을 관리합니다.
- 시스템 콜(syscall): 사용자 공간이 커널 서비스를 요청하는 공식 경로입니다.
- 태스크(task): 스케줄링 단위로 흔히 스레드에 대응합니다(프로세스는 스레드 그룹으로 볼 수 있음).
CPU와 멀티태스킹: 왜 스케줄러가 핵심인가
한 CPU 코어는 한 시점에 하나의 스레드만 실행하지만, OS는 시간 분할(time slicing)으로 여러 태스크가 동시에 돌아가는 것처럼 보이게 합니다. 스케줄러는 어떤 태스크를 얼마나 오래 실행할지를 결정하고, 선점(preemption)·런큐(runqueue)·우선순위·cgroup 한도와 맞물립니다.
CFS(Completely Fair Scheduler)의 직관
리눅스의 기본 스케줄링 클래스인 CFS는 “완전 공정”이라는 이름처럼, 가상 실행 시간(vruntime)을 기준으로 공정성을 근사합니다. 각 태스크는 CPU를 사용할수록 vruntime이 증가하고, 스케줄러는 가장 vruntime이 작은 태스크를 골라 실행합니다. 이렇게 하면 장기적으로 CPU 시간이 태스크 간에 균형을 이루려는 동작이 됩니다.
실제 커널에서는 가중치(우선순위·nice·cgroup weight)가 vruntime 증가 속도에 영향을 줍니다. nice 값이 낮을수록(우선순위가 높을수록) 같은 CPU 시간을 써도 vruntime이 덜 늘어나, 더 자주 선택될 경향이 있습니다. 다만 이는 “지연 보장”이 아니라 통계적 공정성에 가깝습니다.
CFS 내부를 한 단계 더: cfs_rq와 시간 슬라이스
CPU마다 CFS용 런큐 cfs_rq가 있고, 여기에 태스크들의 vruntime이 레드-블랙 트리로 정렬되어 있습니다(구현 디테일은 커널 버전마다 다르지만 “vruntime 순서를 빠르게 찾는다”는 직관은 동일합니다). 스케줄러는 “다음 후보”를 고를 때 이 트리의 최소 vruntime 쪽을 택합니다.
CFS는 고정 시간 슬라이스만 반복하는 방식이 아니라, sched_latency_ns(목표 스케줄링 지연)와 sched_min_granularity_ns(한 태스크가 너무 짧게만 돌지 않게 하는 하한) 같은 파라미터로 “한 주기에 태스크를 얼마나 번갈아 줄 것인가”를 조정합니다. 태스크 수가 매우 많아지면 이론상 한 태스크에 배정되는 시간이 min_granularity 아래로 눌릴 수 있어, 스케줄링 오버헤드가 커질 수 있습니다. 이는 “CPU 사용률은 낮은데 컨텍스트 스위치만 많다”는 패턴으로 나타납니다.
계층적 CPU: cgroup과 CFS
컨테이너·systemd 서비스는 보통 CPU cgroup 아래에 묶입니다. hierarchical하게 cpu.weight·cpu.max가 적용되면, 상위 cgroup에서 이미 CPU 시간이 제한된 상태에서 하위 프로세스가 CFS “공정성”을 기대해도 상위 한도를 넘을 수 없습니다. 따라서 “프로세스 top은 멀쩡한데 느리다”는 증상을 볼 때 프로세스 트리 + cgroup 트리를 같이 펼쳐 보는 것이 중요합니다.
런큐, 그룹 스케줄링, 하이퍼스레딩
CPU마다 per-CPU runqueue가 있고, CFS 태스크는 RB 트리 등으로 vruntime 순서를 유지합니다. 멀티소켓·NUMA 환경에서는 태스크를 다른 CPU로 옮기는 migration 비용이 있어, 스케줄링 지연과 캐시 지역성(locality) 트레이드오프가 생깁니다.
cgroup의 cpu.weight·cpu.max는 CFS가 태스크에 부여하는 CPU 비율·상한과 연결됩니다. 컨테이너·systemd 단위로 CPU를 나눌 때, “프로세스 한도”만 볼 것이 아니라 cgroup 트리를 함께 봐야 합니다.
실시간·데드라인 클래스와의 차이
SCHED_FIFO/SCHED_RR 등은 우선순위 기반 규칙이 달라, 잘못 사용하면 일반 태스크가 CPU를 거의 못 받는 기아가 납니다. 데드라인 스케줄링(SCHED_DEADLINE)은 주기·런타임·데드라인 파라미터로 지연 보장을 노리지만 설정이 까다롭습니다. 웹·API 서버의 일반 워크로드는 대부분 CFS 위에서 동작한다고 이해하면 됩니다.
운영에서의 함정
- 문맥 전환(context switch) 폭증: 락 경합·과도한 스레드·불필요한
poll루프는 CPU를 태우면서도 실제 일은 못 합니다.perf로 스케줄 이벤트를 보면 원인이 드러납니다. - CPU throttling: cgroup
cpu.max에 걸리면 커널이 강제로 idle을 삽입해 태스크가 느려집니다. “애플리케이션은 멀쩡한데 느리다”는 증상과 연결됩니다.
메모리: 페이지 캐시·스왑·OOM
리눅스는 가상 메모리를 페이지(보통 4KiB 등) 단위로 관리합니다. 익명 메모리(힙·스택)와 파일 기반 매핑은 다르게 회수되며, 페이지 캐시는 파일 I/O 성능의 중심입니다.
페이지 캐시(page cache)
파일을 읽고 쓸 때 데이터는 디스크에 바로 가지 않고 페이지 캐시에 올라갑니다. 같은 파일 영역을 다시 읽으면 디스크 대신 캐시를 탑니다. 쓰기 경로에서는 더티 페이지(dirty page)가 생기고, pdflush/per-CPU flusher 스레드가 백그라운드에 기록합니다.
왜 중요한가: “메모리가 찼다”는 알람이 뜰 때, 실제로는 재사용 가능한 캐시가 많아서 정상인 경우가 많습니다. MemAvailable은 이런 회수 가능 메모리를 추정해 줍니다. 반면 캐시 미스가 잦으면 I/O 지연이 커지므로, 성능 이슈는 iostat, vmstat, 파일 접근 패턴과 함께 봐야 합니다.
LRU 방향의 회수와 kswapd
커널은 페이지를 active/inactive 리스트 등으로 관리하며(세부 알고리즘은 버전마다 발전), “최근에 쓰인 페이지”를 우선 남기려 합니다. 백그라운드에서는 kswapd가 워터마크(watermark)를 보며 직접 회수(direct reclaim)가 과도하게 일어나지 않게 조율합니다. 직접 회수는 사용자 요청 경로에서 동기적으로 페이지를 찾아 지연 스파이크를 만들 수 있어, 운영에서 “갑자기 느려짐”의 한 원인이 됩니다.
더티 비율과 writeback
/proc/sys/vm/dirty_ratio·dirty_background_ratio(또는 바이트 기반 파라미터)는 메모리 중 더티 페이지 비율이 어느 정도면 백그라운드/동기 플러시를 유도할지를 정합니다. I/O가 버스트하는 배치·로그 워크로드는 이 값과 디스크 대역폭이 맞물려 쓰기 스톨(stall)을 유발할 수 있습니다.
스왑(swap)과 압력
물리 RAM이 부족하면 커널은 페이지 회수(reclaim)를 시도합니다. 파일 페이지는 “깨끗한(clean)” 페이지부터 버리기 쉽고, 익명 페이지는 스왑 영역으로 내보낼 수 있습니다. 스왑이 과도하게 쓰이면 디스크 I/O가 병목이 되어 지연 폭증·thrashing으로 이어집니다.
vm.swappiness는 “파일 캐시 vs 익명 페이지” 선호를 조정하는 휴리스틱에 영향을 줍니다. 데이터베이스처럼 자체 캐시가 큰 워크로드는 스왑이 튀는 순간 체감 지연이 크므로, 메모리 한도·알람·스왑 사용량을 함께 모니터링합니다.
OOM Killer
회수로도 메모리를 마련하지 못하면 OOM killer가 프로세스를 종료합니다. 어떤 프로세스가 선택되는지는 oom_score·cgroup 한도·태스크 특성 등이 섞입니다. 컨테이너 환경에서는 호스트와 다른 cgroup에서 OOM이 나 보이기도 합니다.
운영 패턴
drop_caches: 디버깅·벤치마크에서 캐시를 비울 수 있으나, 서비스 지연을 유발할 수 있어 상시 사용 금지에 가깝습니다.min_free_kbytes/watermark: 급격한 할당 실패를 줄이려는 튜닝이지만, 잘못 건드리면 조기 reclaim이나 반대로 메모리 압박이 악화될 수 있습니다.
파일 시스템 스택과 VFS
애플리케이션의 open/read/write는 먼저 VFS(가상 파일시스템) 계층으로 들어갑니다. VFS는 ext4, XFS, NFS, overlayfs 등 구체 파일 시스템 위에 공통 인터페이스를 제공합니다.
dentry와 inode 캐시
- inode: 파일 메타데이터와 데이터 블록 위치(익스텐트 등)를 담는 객체입니다.
- dentry(directory entry): 경로 컴포넌트(
usr,bin, …)를 연결해 경로 해석을 캐시합니다.
자주 접근하는 경로는 dentry 캐시에 뜨고, 반복 stat/open 비용이 줄어듭니다. 반대로 수백만 개의 작은 파일이 흩어져 있으면 dentry·inode 압박이 커지고, inode 고갈과 맞물립니다.
VFS 객체: struct file, file_operations
open()이 성공하면 프로세스 FD 테이블에 struct file이 올라가고, 여기에는 현재 파일 오프셋, 플래그(O_APPEND, O_NONBLOCK 등), 그리고 inode에 대한 연결과 파일시스템별 연산 테이블(f_op)이 붙습니다. read/write/mmap은 이 f_op를 통해 ext4·XFS·tmpfs 등 실제 구현으로 디스패치됩니다. 따라서 같은 read(2)라도 백엔드가 블록 장치인지, 네트워크 FS인지, 파이프인지에 따라 커널 내부 경로가 달라집니다.
path_lookup와 RCU
경로 이름을 inode까지 풀어내는 과정은 walk라고 부르는데, dentry 캐시 히트가 나면 빠르고, 미스 나면 구체 파일시스템이 디렉터리 블록을 읽어야 합니다. 최신 커널은 dentry·inode 조회에 RCU 등을 사용해 읽기 경로를 최적화하지만, 메타데이터 폭증 워크로드에서는 여전히 CPU·I/O가 커질 수 있습니다.
페이지 캐시와 블록 계층
파일 시스템은 논리 블록을 블록 계층을 통해 스토리지 드라이버로 넘깁니다. 플러시·fsync는 “디스크에 확실히”와 연결되며, 데이터베이스·분산 스토리지는 여기서 일관성·내구성 요구사항이 갈립니다.
네트워크 파일 시스템과 컨테이너
NFS·Ceph FUSE 등은 VFS 아래에서 추가 지연·캐시 일관성 이슈를 만듭니다. overlayfs 기반 컨테이너는 복사·화이트아웃 비용으로 메타데이터 I/O가 튈 수 있습니다. “로컬에선 빠른데 컨테이너에서만 느리다”는 증상은 이 스택을 의심합니다.
시스템 콜 인터페이스
시스템 콜은 사용자 공간 ↔ 커널의 계약입니다. x86-64에서는 syscall 명령·레지스터 규약으로 번호와 인자를 넘기고, 커널은 시스템 콜 테이블로 디스패치합니다. 일부는 vdso로 사용자 공간에 최적화된 코드가 제공되어 gettimeofday 같은 호출 비용을 줄입니다.
진입·복귀와 추적 지점
사용자 공간에서 libc 래퍼가 실행되면 CPU는 특권 레벨 전환과 함께 커널의 syscall 진입 코드로 들어가고, 커널은 시스템 콜 번호에 맞는 핸들러로 분기합니다. 복귀 시에는 레지스터에 결과·errno 정보를 맞춰 돌려줍니다. 이 경로에는 tracepoint(sys_enter_*/sys_exit_*)가 있어 perf·eBPF가 내부를 관찰하기 좋습니다.
구형 방식의 int 0x80(IA-32)나 vsyscall 페이지는 역사적 잔재가 있고, 최신 x86-64 사용자 공간은 syscall 명령 경로가 중심입니다. vdso는 일부 “시스템 콜처럼 보이는” 연산을 사용자 공간에서 처리해 문맥 전환 비용을 줄입니다.
관찰과 디버깅
strace -c -p PID: 어떤 콜이 많은지, 에러(-1+ errno)가 무엇인지 빠르게 볼 수 있습니다.perf trace: 스케줄 오버헤드와 함께 syscall 스트림을 볼 때 유용합니다.- eBPF:
execve/connect/openat등을 훅으로 정책·관측을 심을 수 있습니다.
seccomp·컨테이너
컨테이너 런타임은 seccomp 프로파일로 허용 syscall 집합을 줄여 공격면을 낮춥니다. 애플리케이션이 예상 밖 콜을 하면 시그킬이 나므로, 배포 파이프라인에서 프로파일을 검증해야 합니다.
프로덕션 Linux 패턴
cgroups와 systemd
cgroups v2는 CPU·메모리·I/O·PID 등 컨트롤러를 트리로 묶습니다. systemd는 서비스 단위로 cgroup을 만들고, OOM·리스타트 정책과 연결됩니다. “프로세스는 살아 있는데 느리다”는 CPU throttling, “갑자기 죽는다”는 메모리 한도·OOM을 먼저 의심합니다.
메모리: memory.max vs memory.high
memory.max는 하드 리밋에 가깝고, 초과 시 cgroup이 강하게 제한됩니다. memory.high는 소프트 압박으로, 임계를 넘으면 커널이 스로틀링·회수를 더 적극적으로 걸어 워크로드를 눌러 메모리 사용을 유도합니다. Kubernetes에서는 Burstable/Guaranteed QoS 클래스와 limits가 이와 맞물려, “노드는 멀쩡한데 파드만 OOM” 같은 패턴이 나올 수 있습니다.
PID·pids.max
컨테이너 안에서 포크 폭탄이나 누수 스레드가 나면 pids 컨트롤러 한도에 걸립니다. 메모리·CPU와 별개로 프로세스 수 자체가 자원이며, 이 한도는 장애 메시지가 직관적이지 않을 수 있습니다.
리소스 한계와 설정
ulimit -n: 파일 디스크립터. 역프록시·DB 커넥션 풀에서 자주 부딪힙니다./proc/sys/fs/file-max: 시스템 전체 열린 파일 상한.somaxconn,tcp_tw_reuse(주의: 커널 버전별 의미 차이): 네트워크 성능 튜닝은 측정 없이 복붙 금지.
관측 스택
- 메트릭: CPU 사용률 vs saturation(대기), 메모리 available, 디스크 util%, 네트워크 재전송.
- 로그: 구조화 로그 + 저널(
journalctl)에서 부팅·크래시·OOM 타임라인을 잡습니다. - 프로파일링:
perf, async-profiler, eBPF로 커널·유저 스택을 함께 봅니다.
장애 대응 체크리스트(요약)
- 증상 분리: CPU·메모리·디스크·네트워크 중 어디가 병목인가?
- 한도 확인: cgroup,
ulimit, 클라우드 인스턴스 크레딧, 쿠버네티스 limit/request. - 커널 메시지:
dmesg에서 OOM, NIC reset, 파일시스템 에러. - 스케줄·syscall:
perf sched/strace로 비정상 루프·과도한 콜 확인. - 변경 이벤트: 배포, 커널 업데이트, 네트워크 경로 변경.
트러블슈팅 매핑
| 증상 | 살펴볼 내부 지점 | 시작 명령 |
|---|---|---|
| 전체적인 느림, “steal” 시간 | CPU 스케줄·가상화 스틸 | vmstat 1, 호스트 측 크레딧 |
| 메모리는 남는데 앱이 느림 | 페이지 캐시·I/O 대기 | iostat -xz, 파일 접근 패턴 |
| 스왑 사용 증가 | reclaim·스왑 압력 | vmstat, sar -W |
| 파일 열기·stat 폭주 | dentry/inode 캐시·메타데이터 | strace, 백업·크롤러 점검 |
| 컨테이너만 OOM | cgroup memory.max | systemd-cgtop, kube limits |
내부 동작과 핵심 메커니즘
이 글의 주제는 「[2026] Linux 완전 가이드 — 커널 내부(CFS·페이지 캐시·VFS·시스템콜)와 프로덕션 패턴」입니다. 앞선 튜토리얼을 구현·런타임 관점에서 다시 압축합니다. 시스템·런타임 경계(스케줄링, I/O, 메모리, 동시성)를 기준으로 “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)·동시성이 어디서 터지는가”를 한 장면으로 그리면 장애 분석이 빨라집니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
경계에서의 지연·실패(시퀀스 관점)
sequenceDiagram participant C as 클라이언트/호출자 participant B as 경계(프로세스·런타임·게이트웨이) participant D as 의존성(외부 API·DB·큐) C->>B: 요청/이벤트 B->>D: 조회·쓰기·RPC D-->>B: 지연·부분 실패·재시도 가능 B-->>C: 응답 또는 오류(코드·상관 ID)
알고리즘·프로토콜·리소스 관점 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(버퍼 경계, 프로토콜 상태, 트랜잭션 격리, 파일 디스크립터 상한)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수 층과, 시간·네트워크·스레드 스케줄에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합, GC·할당, 캐시 미스처럼 누적 비용을 의심 목록에 넣습니다.
- 백프레셔: 생산자가 소비자보다 빠를 때(소켓 버퍼, 큐 깊이, 스트림) 어디서 어떤 신호로 속도를 줄일지 정의합니다.
프로덕션 운영 패턴
실서비스에서는 기능과 함께 관측·배포·보안·비용·규제가 동시에 요구됩니다.
| 영역 | 운영 관점 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수(p95/p99), 의존성 타임아웃·재시도가 대시보드에 보이는가 |
| 안전성 | 입력 검증·권한·비밀·감사 로그가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등 연산에만 적용되는가, 서킷 브레이커·백오프·DLQ가 있는가 |
| 성능 | 캐시 계층·배치 크기·커넥션 풀·인덱스·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리/블루그린, 마이그레이션 호환성·플래그가 문서화되어 있는가 |
| 용량 | 피크 트래픽·디스크·파일 디스크립터·스레드 풀 상한을 주기적으로 검증하는가 |
스테이징은 데이터 양·네트워크 RTT·동시성을 가능한 한 프로덕션에 가깝게 맞추는 것이 재현율을 높입니다.
확장 예시: 엔드투엔드 미니 시나리오
「[2026] Linux 완전 가이드 — 커널 내부(CFS·페이지 캐시·VFS·시스템콜)와 프로덕션 패턴」을 실제 배포·운영 흐름으로 옮긴 체크리스트형 시나리오입니다. 도메인에 맞게 단계 이름만 바꿔 적용할 수 있습니다.
- 입력 계약 고정: 스키마·버전·최대 페이로드·타임아웃·에러 코드 표를 API 또는 이벤트 경계에 둔다.
- 핵심 경로 계측: 요청 ID, 단계별 지연, 외부 호출 결과 코드를 한 화면(로그+메트릭+트레이스)에서 추적한다.
- 실패 주입: 의존성 타임아웃·5xx·부분 데이터·락 대기를 스테이징에서 재현한다.
- 호환·롤백: 설정/마이그레이션/클라이언트 버전을 되돌릴 수 있는지(또는 피처 플래그) 확인한다.
- 부하 후 검증: 피크 대비 p95/p99, 에러율, 리소스 상한, 알림 임계값이 기대 범위인지 본다.
의사코드 스케치(프레임워크 무관)
handle(request):
ctx = newCorrelationId()
validated = validateSchema(request) // 경계에서 거절
authorize(validated, ctx) // 권한·테넌트
result = domainCore(validated) // 순수에 가까운 규칙
persistOrEmit(result, idempotentKey) // I/O: 멱등·재시도 정책
recordMetrics(ctx, latency, outcome)
return result
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스, 타임아웃, 외부 의존성 불안정, DNS | 최소 재현 스크립트, 분산 트레이스·로그 상관관계, 재시도·서킷 설정 점검 |
| 성능 저하 | N+1, 동기 I/O, 락 경합, 과도한 직렬화, 캐시 미스 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 구독/리스너 누수, 대용량 버퍼, 커넥션 미반납 | 상한·TTL·힙/FD 스냅샷 비교 |
| 빌드·배포만 실패 | 환경 변수, 권한, 플랫폼 차이, lockfile | CI 로그와 로컬 diff, 런타임·이미지 버전 핀 |
| 설정이 로컬과 다름 | 프로필·시크릿·기본값, 지역 리전 | 단일 소스(예: 스키마 검증된 설정)와 배포 매트릭스 표준화 |
| 데이터 불일치 | 비멱등 재시도, 부분 쓰기, 캐시 무효화 누락 | 멱등 키·아웃박스·트랜잭션 경계 재검토 |
권장 순서: (1) 최소 재현 (2) 최근 변경 범위 축소 (3) 환경·의존성 차이 (4) 관측으로 가설 검증 (5) 수정 후 회귀·부하 테스트.
정리
Linux는 시스템 콜을 경계로 사용자 공간과 커널이 만나고, CFS가 CPU 시간을 분배하며, 페이지 캐시·스왑·OOM이 메모리 압력을 처리하고, VFS가 다양한 파일 시스템을 같은 인터페이스로 묶습니다. 프로덕션에서는 cgroups·ulimit·관측이 이 내부 구조와 직접 맞닿아 있으므로, “표면 증상”만이 아니라 어느 서브시스템이 한계인지를 구분하는 습관이 장애 시간을 줄입니다.
보안 하드닝·SSH·방화벽 관점은 Linux 서버 보안 강화(영문)와 함께 참고하면 운영 체계를 넓힐 수 있습니다.