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, 유실, 맵 고정

eBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

커널 동작을 들여다보려면 예전에는 커널 모듈을 만들거나 커널을 다시 빌드해야 했다. 모듈 버그 하나가 곧 커널 패닉이고, 커널 버전이 바뀔 때마다 다시 컴파일해야 한다. eBPF는 검증된 작은 프로그램을 실행 중인…

Continue ReadingeBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

Ubuntu needrestart로 업데이트 후 재시작이 필요한 서비스와 커널 찾기

apt upgrade로 libc6나 openssl 보안 업데이트를 받았다고 해서 이미 떠 있는 데몬까지 패치되는 것은 아니다. 실행 중인 프로세스는 교체되기 전의 라이브러리를 메모리에 그대로 매핑하고 있어서, 재시작하기 전까지는 취약한 코드가 계속…

Continue ReadingUbuntu needrestart로 업데이트 후 재시작이 필요한 서비스와 커널 찾기

머신러닝 입문 (6) — 자동미분(autograd) 직접 만들기

5편에서는 은닉층 하나짜리 신경망의 기울기를 손으로 유도했는데, 활성함수를 바꾸거나 층을 하나 더 얹으면 유도를 처음부터 다시 해야 한다. 프레임워크는 이 일을 자동미분(automatic differentiation)으로 대신한다. 이 글에서는 스칼라 autograd 엔진을 100줄…

Continue Reading머신러닝 입문 (6) — 자동미분(autograd) 직접 만들기

머신러닝 입문 (5) — 역전파를 손으로 계산하고 코드로 검증하기

4편까지의 모델은 층이 하나라 기울기를 종이에 한 줄로 적을 수 있었지만, 층을 쌓으면 손실이 합성함수가 되어 기울기를 연쇄법칙으로 뒤에서 앞으로 전달해야 한다. 이것이 역전파(backpropagation)다. 이 글에서는 은닉층 하나짜리 신경망의 역전파를…

Continue Reading머신러닝 입문 (5) — 역전파를 손으로 계산하고 코드로 검증하기