lockstat 사용법 — /proc/lock_stat으로 커널 락 경합 지점 찾기

멀티코어에서 처리량이 코어 수만큼 늘지 않고 어느 지점부터 오히려 떨어질 때, 원인이 락 경합(lock contention)인 경우가 많다. perf lock은 배포판 커널 그대로도 쓸 수 있어 편하지만 트레이스포인트를 기록하는 방식이라 "측정하는…

Continue Readinglockstat 사용법 — /proc/lock_stat으로 커널 락 경합 지점 찾기

Rust 커널 프로그래밍 가이드 (5) — platform 드라이버로 배우는 모듈의 표준 구조: probe/remove와 디바이스 트리 바인딩

앞선 편들에서 module! 매크로로 init/exit을 가진 모듈을 만들고 misc device까지 붙여봤다. 그런데 실제 하드웨어를 다루는 드라이버는 insmod 시점에 일을 시작하지 않는다. 모듈은 "이런 하드웨어를 담당할 수 있다"고 등록만 해두고, 그…

Continue ReadingRust 커널 프로그래밍 가이드 (5) — platform 드라이버로 배우는 모듈의 표준 구조: probe/remove와 디바이스 트리 바인딩

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

다섯 편에 걸쳐 Kconfig 옵션, 컴파일러 최적화, initramfs, VM 서브시스템을 하나씩 만졌다. 이번 편에서는 그 모든 변경을 한 커널에 합쳐 defconfig 베이스라인과 최종 비교를 하고, 시리즈 제목이기도 한 "메모리가 작은…

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

메모리가 작은 시스템을 위한 커널 경량화 (2) — initrd 사용에 따른 영향

지난 편에서는 initrd 없이 root=/dev/vda로 직접 부팅하는 구성으로 defconfig 커널의 베이스라인을 측정했다. 하지만 실제 임베디드/컨테이너 이미지에서는 initrd(정확히는 initramfs)를 쓰는 구성도 흔하다 — 루트 파일시스템 드라이버를 모듈로 빼두고 initramfs에서 필요한 것만…

Continue Reading메모리가 작은 시스템을 위한 커널 경량화 (2) — initrd 사용에 따른 영향

메모리가 작은 시스템을 위한 커널 경량화 (1) — 측정 방법론과 베이스라인

컨테이너나 저사양 임베디드 보드처럼 메모리가 1GB 이하로 제한된 환경에서는 배포판 defconfig 커널조차 여유 공간을 상당히 잡아먹는다. 배포판 커널은 다양한 하드웨어를 지원하기 위해 수많은 드라이버와 서브시스템을 켜둔 상태라, 실제 타깃 환경에서는…

Continue Reading메모리가 작은 시스템을 위한 커널 경량화 (1) — 측정 방법론과 베이스라인

GIC v3 초기화 in ATF

멀티코어 ARM SoC가 부팅할 때 인터럽트 컨트롤러(GIC)는 커널이 넘겨받기 한참 전, EL3(Secure Monitor)에서부터 설정돼 있어야 한다. 초기화가 빠지거나 순서가 틀리면 커널 입장에서는 GIC가 있는데도 인터럽트가 아예 안 들어오거나 특정 코어만…

Continue ReadingGIC v3 초기화 in ATF

QEMU/KVM 라이브 마이그레이션 원리와 실습

하이퍼바이저 호스트를 재부팅해야 할 때, VM을 끄고 다른 호스트에서 다시 켜는 cold migration은 서비스가 몇 분씩 죽는다. QEMU/KVM의 live migration은 VM을 실행 상태 그대로 유지하며 메모리/디바이스 상태를 다른 호스트로 옮기고…

Continue ReadingQEMU/KVM 라이브 마이그레이션 원리와 실습