메모리가 작은 시스템을 위한 커널 경량화 (6) — 종합 비교와 메모리 한계 실증

다섯 편에 걸쳐 Kconfig 옵션, 컴파일러 최적화, initramfs, VM 서브시스템을 하나씩 만졌다. 이번 편에서는 그 모든 변경을 한 커널에 합쳐 defconfig 베이스라인과 최종 비교를 하고, 시리즈 제목이기도 한 “메모리가 작은 시스템”을 실제로 시험한다 — QEMU 메모리를 128MB부터 48MB까지 낮춰가며 베이스라인과 최종 버전 중 어느 쪽이 어디까지 뜨는지 직접 확인했다.

이 시리즈의 다른 글

최종 빌드 구성

지금까지 효과가 있었던 것만 골라 하나로 합쳤다. (4)편의 ThinLTO는 오히려 이미지를 키웠으므로 최종 구성에서 뺐다.

출처적용한 변경
(3)편GPU/사운드/무선/USB/NFS/netfilter 등 Kconfig 옵션 트림
(4)편CONFIG_CC_OPTIMIZE_FOR_SIZE(-Os), 안 쓰는 VIRTIO_NET module化
(5)편CONFIG_EXPERTSLUB_DEBUG/DEBUG_MEMORY_INIT 제거, zram 스왑, MGLRU
제외ThinLTO((4)편에서 역효과 확인)

누적 절감 종합표

단계bzImage베이스라인 대비
(1) defconfig 베이스라인14.83 MB
(3) Kconfig 옵션 트림10.27 MB-30.8%
(4) + -Os8.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 MB11 MB-15%
Slab 총합6.7 MB5.9 MB-12%
MemTotal (커널 정적 예약 반영)969 MB983 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가 아니라 실제 임베디드 보드에도 그대로 적용할 수 있다 — 다음에 라즈베리파이 같은 실기기로 같은 실험을 재현해보는 것도 좋은 후속 주제가 될 것 같다.

참고

답글 남기기