QEMU 공유 파일시스템 virtiofs vs virtio-9p — 설정과 실측 비교

게스트에 소스를 올려 빌드하거나 호스트가 만든 산출물을 게스트에서 바로 읽으려면 디스크 이미지에 복사하는 것보다 호스트 디렉터리를 그대로 공유하는 쪽이 편하다. QEMU에는 이걸 하는 방법이 두 가지 있다. 오래된 virtio-9p(-virtfs)와, FUSE…

Continue ReadingQEMU 공유 파일시스템 virtiofs vs virtio-9p — 설정과 실측 비교

UBSan으로 C 미정의 동작 런타임에 잡기 — gcc·clang 실측 비교

정수 오버플로나 배열 범위 밖 접근처럼 C의 미정의 동작(undefined behavior)은 대개 크래시 없이 조용히 지나간다. 컴파일 경고로 잡히는 것은 상수로 접근하는 뻔한 경우뿐이고, 인덱스나 시프트 값이 런타임에 결정되면 경고가 나오지…

Continue ReadingUBSan으로 C 미정의 동작 런타임에 잡기 — gcc·clang 실측 비교

C언어 strict aliasing과 restrict — gcc/clang 최적화를 어셈블리로 확인하기

-O0에서 잘 돌던 코드가 -O2로 올리면 값이 달라진다. 디버거로 들여다보면 메모리에는 올바른 값이 들어 있는데 함수가 엉뚱한 값을 반환한다. 대개 범인은 두 가지다. 서로 다른 타입의 포인터로 같은 메모리를 건드리는…

Continue ReadingC언어 strict aliasing과 restrict — gcc/clang 최적화를 어셈블리로 확인하기

Bash 리다이렉션과 파일 디스크립터 직접 다루기 — exec, 프로세스 치환, coproc

빌드 스크립트를 돌리면 로그는 파일에 남겨야 하는데 진행 상황은 화면으로 봐야 하고, 두 명령의 출력을 비교하려면 임시 파일을 두 개 만들어야 하고, while read로 센 개수가 루프를 벗어나면 0으로 돌아와…

Continue ReadingBash 리다이렉션과 파일 디스크립터 직접 다루기 — exec, 프로세스 치환, coproc

머신러닝 입문 (7) — 과적합과 정규화

6편까지 1단계를 끝내면서 "파라미터를 더 주면 학습 손실은 계속 내려간다"는 것을 확인했다. 문제는 그렇게 줄인 손실이 새 데이터에서는 더 나빠질 수 있다는 점이다. 5편에서 은닉 뉴런을 늘렸을 때 평가 손실이…

Continue Reading머신러닝 입문 (7) — 과적합과 정규화

eBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

메모리 문제는 대부분 사후에 발견된다. OOM으로 프로세스가 죽은 뒤 dmesg 한 줄이 남고, 그 전까지 누가 얼마나 잡아먹고 있었는지는 알 수 없다. /proc/meminfo나 /proc/slabinfo는 지금 이 순간의 스냅샷이라 어떤 작업이…

Continue ReadingeBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

eBPF 실전 (5) — sched_ext로 커널 스케줄러 직접 구현하기

4편까지는 스케줄러가 하는 일을 밖에서 들여다보기만 했다. 스케줄링 정책 자체를 바꾸려면 kernel/sched/를 고쳐 커널을 다시 빌드하고 재부팅해야 했고, 정책 하나 시험하는 데 빌드 주기가 통째로 들어갔다. 커널 6.12에 정식 합류한…

Continue ReadingeBPF 실전 (5) — sched_ext로 커널 스케줄러 직접 구현하기

eBPF 실전 (4) — 런큐 지연과 컨텍스트 스위치 관측하기

CPU 사용률이 100%가 아닌데도 응답이 느린 서버가 있다. 태스크가 실행 가능(runnable) 상태로 런큐에서 기다린 시간, 즉 런큐 지연(run queue latency)이 원인인 경우가 많은데 top이나 vmstat에는 이 값이 나오지 않는다. /proc/PID/schedstat에…

Continue ReadingeBPF 실전 (4) — 런큐 지연과 컨텍스트 스위치 관측하기

eBPF 실전 (3) — kprobe·fentry·tracepoint·uprobe 훅 오버헤드 비교

같은 vfs_read()를 관측하더라도 BPF 프로그램을 붙일 수 있는 훅은 kprobe, fentry, tracepoint, raw tracepoint 등 여러 가지다. 훅마다 인자에 접근하는 방법, 커널 버전이 바뀔 때의 안정성, 이벤트당 비용이 다르다. 고빈도…

Continue ReadingeBPF 실전 (3) — kprobe·fentry·tracepoint·uprobe 훅 오버헤드 비교

eBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정

eBPF 프로그램은 이벤트 하나를 처리하고 끝나는 짧은 함수라서, 이벤트 사이에 상태를 유지하거나 결과를 유저 공간에 넘기려면 BPF 맵이 필요하다. 문제는 맵 종류가 30가지가 넘고, 잘못 고르면 카운트가 조용히 유실되거나 이벤트가…

Continue ReadingeBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정