Python multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

numpy 배열을 multiprocessing.Queue/Pipe로 주고받으면 매번 pickle 직렬화·역직렬화가 일어나 배열이 클수록 병목이 된다. Python 3.8부터 표준 라이브러리에 들어온 multiprocessing.shared_memory는 pickle 없이 OS의 진짜 공유 메모리(POSIX /dev/shm)를 이름으로 attach해 여러 프로세스가 같은…

Continue ReadingPython multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

리눅스 커널 DAMON으로 메모리 접근 패턴 모니터링하기

메모리 회수는 LRU 리스트로 hot/cold 페이지를 구분해야 하는데, page table의 accessed bit를 주기적으로 스캔하는 전통적 방식은 메모리가 커질수록 오버헤드가 커진다. DAMON(Data Access MONitor)은 리눅스 5.15부터 커널에 들어온 범용 데이터 접근…

Continue Reading리눅스 커널 DAMON으로 메모리 접근 패턴 모니터링하기

Ubuntu에서 커널을 직접 빌드해 DAMON 활성화하기

Ubuntu 24.04 generic 커널은 CONFIG_DAMON이 꺼져 있어 /sys/kernel/mm/damon/admin/이 없다. 실제로 쓰려면 커널을 직접 빌드해야 한다. 현재 설정 기반으로 DAMON 옵션만 추가해 빌드·설치·재부팅하고 동작까지 확인한 기록이다. 준비 $ sudo apt-get install…

Continue ReadingUbuntu에서 커널을 직접 빌드해 DAMON 활성화하기

strace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

strace nginx나 strace sh script.sh로 걸어보면 부모 프로세스의 fork/execve까지만 잡히고, 실제 작업을 하는 워커/자식 프로세스 내부는 안 보인다. -f(--follow-forks)가 이 문제를 해결한다. 이 글에서는 -f/-ff/-e trace=로 멀티프로세스·멀티스레드 프로그램을 추적하는 방법을…

Continue Readingstrace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

Ubuntu Netplan으로 네트워크 설정 관리하기

예전 /etc/network/interfaces는 배포판마다 문법이 다르고 cloud-init 같은 자동 구성 환경과 궁합이 안 좋았다. Ubuntu 17.10부터는 Netplan이 YAML로 원하는 상태만 선언하면 systemd-networkd/NetworkManager를 백엔드로 골라 실제 설정을 만들어준다. 이 글에서는 YAML 구조,…

Continue ReadingUbuntu Netplan으로 네트워크 설정 관리하기

리눅스 커널에서 scatter-gather DMA 이해하기

디바이스에 넘길 버퍼가 물리적으로 연속되어 있다는 보장은 없다. vmalloc으로 받은 큰 버퍼는 물리 페이지가 여기저기 흩어져 있고, 네트워크 패킷처럼 여러 조각(헤더+페이로드)을 한 번의 전송으로 묶어야 하는 경우도 흔하다. scatter-gather DMA는…

Continue Reading리눅스 커널에서 scatter-gather DMA 이해하기

라즈베리파이 부트로더 빌드 및 업데이트 방법

라즈베리파이 4/5 계열은 부트로더가 보드 위 EEPROM에 저장되어 있고, rpi-eeprom-update로 최신 버전으로 갱신할 수 있다. "부트로더를 빌드한다"는 말 때문에 소스를 내려받아 컴파일하는 과정을 떠올리기 쉬운데, 실제로는 다르다. rpi-eeprom 저장소에는 이미…

Continue Reading라즈베리파이 부트로더 빌드 및 업데이트 방법

ARM64 MTE(Memory Tagging Extension) — 하드웨어 메모리 태깅으로 KASAN을 대체하는 방법

KASAN이나 KFENCE 같은 소프트웨어 메모리 안전성 도구는 결국 소프트웨어다 — 섀도 메모리를 따로 관리하거나(KASAN), 확률적으로 일부 할당만 감시하거나(KFENCE), 어느 쪽이든 CPU 사이클을 써서 검사 로직을 흉내낸다. MTE(Memory Tagging Extension)는 이…

Continue ReadingARM64 MTE(Memory Tagging Extension) — 하드웨어 메모리 태깅으로 KASAN을 대체하는 방법

라즈베리파이 Device Tree Overlay 원리 — fragment/fixup을 dtc로 직접 확인하기

라즈베리파이에 센서나 디스플레이를 하나 새로 붙일 때마다 base device tree(.dtb) 전체를 다시 컴파일해서 부트 파티션에 올리는 건 번거롭고, 보드마다 다른 base tree를 관리해야 하는 상황과도 잘 안 맞는다. Device Tree…

Continue Reading라즈베리파이 Device Tree Overlay 원리 — fragment/fixup을 dtc로 직접 확인하기

pahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지

구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…

Continue Readingpahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지