다섯 편에 걸쳐 Kconfig 옵션, 컴파일러 최적화, initramfs, VM 서브시스템을 하나씩 만졌다. 이번 편에서는 그 모든 변경을 한 커널에 합쳐 defconfig 베이스라인과 최종 비교를 하고, 시리즈 제목이기도 한 “메모리가 작은 시스템”을 실제로 시험한다 — QEMU 메모리를 128MB부터 48MB까지 낮춰가며 베이스라인과 최종 버전 중 어느 쪽이 어디까지 뜨는지 직접 확인했다.
이 시리즈의 다른 글
- 메모리가 작은 시스템을 위한 커널 경량화 (1) — 측정 방법론과 베이스라인
- 메모리가 작은 시스템을 위한 커널 경량화 (2) — initrd 사용에 따른 영향
- 메모리가 작은 시스템을 위한 커널 경량화 (3) — Kconfig 옵션으로 커널 이미지 줄이기
- 메모리가 작은 시스템을 위한 커널 경량화 (4) — 빌드 최적화와 initramfs 축소
- 메모리가 작은 시스템을 위한 커널 경량화 (5) — 커널 메모리 관리 옵션 검토
최종 빌드 구성
지금까지 효과가 있었던 것만 골라 하나로 합쳤다. (4)편의 ThinLTO는 오히려 이미지를 키웠으므로 최종 구성에서 뺐다.
| 출처 | 적용한 변경 |
|---|---|
| (3)편 | GPU/사운드/무선/USB/NFS/netfilter 등 Kconfig 옵션 트림 |
| (4)편 | CONFIG_CC_OPTIMIZE_FOR_SIZE(-Os), 안 쓰는 VIRTIO_NET module化 |
| (5)편 | CONFIG_EXPERT로 SLUB_DEBUG/DEBUG_MEMORY_INIT 제거, zram 스왑, MGLRU |
| 제외 | ThinLTO((4)편에서 역효과 확인) |
누적 절감 종합표
| 단계 | bzImage | 베이스라인 대비 |
|---|---|---|
| (1) defconfig 베이스라인 | 14.83 MB | – |
| (3) Kconfig 옵션 트림 | 10.27 MB | -30.8% |
| (4) + -Os | 8.99 MB | -39.4% |
| (4) + VIRTIO_NET module化 | 8.95 MB | -39.7% |
| (5) + 디버그 옵션 제거/zram/MGLRU (최종) | 8.93 MB | -39.8% |
여기에 (4)편의 initramfs 최소화(busybox 9개 애플릿만 남기기, -42.5%)는 별도 축이라 이 표에 포함하지 않았다 — bzImage와 initramfs를 둘 다 적용하면 부팅 페이로드 총합은 표의 수치보다 더 줄어든다.
런타임 비교
| 항목 | (1)편 베이스라인 | 최종 | 변화 |
|---|---|---|---|
| 부팅 직후 used (QEMU -m 1024M) | 13 MB | 11 MB | -15% |
| Slab 총합 | 6.7 MB | 5.9 MB | -12% |
| MemTotal (커널 정적 예약 반영) | 969 MB | 983 MB | +14 MB 여유 |
메모리 한계 실증: 48MB에서 갈린다
시리즈 내내 1GB로 테스트했으니, 마지막으로 QEMU -m을 낮춰가며 베이스라인과 최종 버전을 직접 붙여봤다. TCG 소프트웨어 에뮬레이션이라 (4)(5)편에서 확인한 IO-APIC + timer doesn't work 패닉이 무작위로 섞이므로, 그 패턴이 뜨면 재시도하고 그 외의 실패만 “진짜 부팅 실패”로 집계했다.
| QEMU -m | 베이스라인 | 최종 |
|---|---|---|
| 128M / 96M / 80M / 64M | 정상 부팅 | 정상 부팅 |
| 48M | 부팅 실패 (6/6) | 정상 부팅 (4/10, 나머지는 타이머 노이즈) |
48MB에서 베이스라인은 SeaBIOS의 “Booting from ROM..” 이후 커널 메시지가 단 한 줄도 안 찍힌 채 멈췄다 — 타이머 패닉과는 완전히 다른, 매번 똑같은 패턴이다.
SeaBIOS (version 1.16.3-debian-1.16.3-2)
iPXE (https://ipxe.org) 00:03.0 ...
Booting from ROM..
(이후 아무 출력 없이 멈춤 — 6/6 재현)
defconfig의 14.83MB짜리 압축 이미지를 48MB짜리 머신에서 풀려면 압축 해제용 스크래치 공간까지 필요해서 사실상 여유가 없다. 최종 버전은 압축 이미지가 8.93MB라 같은 조건에서도 풀어낼 공간이 남는다 — 시리즈 내내 만졌던 “이미지 크기”가 단순히 디스크/네트워크 절약이 아니라 부팅 자체가 가능한 최소 메모리 하한선과 직결된다는 걸 실측으로 확인한 셈이다.
주의사항
- 이 테스트 호스트는 KVM 가속이 없는 TCG 환경이라 부팅 시간·부팅 성공률에 노이즈가 있다는 걸 (4)(5)편에서 확인했다. 48M 결과의 신뢰도를 위해 베이스라인은 6회, 최종 버전은 총 10회 반복해 “타이머 패닉으로 인한 재시도”와 “진짜 실패”를 구분했다 — 실기기(KVM 가속 있는 환경)에서는 이 노이즈 자체가 없을 가능성이 높다.
- 이 최종 구성은 “QEMU virtio 콘솔 전용 헤드리스 서버”라는 특정 타깃에 맞춰 고른 옵션들이다. 그래픽/오디오/무선이 필요한 실제 보드에 그대로 옮기면 안 된다 — 시리즈 내내 강조했듯 매 옵션의 근거를 자기 타깃 기준으로 다시 확인해야 한다.
- 48MB는 이 커널 소스 버전(7.2.0-rc3)과 이 Kconfig 조합 기준의 경계값이다. 커널 버전이나 옵션 조합이 달라지면 경계 자체가 이동한다.
마무리
Kconfig 정리, 컴파일러 옵션, module化, VM 서브시스템 튜닝을 거쳐 bzImage를 39.8% 줄였고, 그 차이가 48MB급 초저사양에서 “아예 못 뜨는 커널”과 “그래도 뜨는 커널”을 가르는 걸 직접 확인했다. 이 시리즈에서 쓴 방법(측정 → 옵션 변경 → 재빌드 → 재측정 → 비교)은 QEMU가 아니라 실제 임베디드 보드에도 그대로 적용할 수 있다 — 다음에 라즈베리파이 같은 실기기로 같은 실험을 재현해보는 것도 좋은 후속 주제가 될 것 같다.