BCC

커널 내부에서 어떤 프로세스가 어떤 파일을 열고, 어떤 시스템 콜을 얼마나 호출하는지 확인하고 싶을 때 strace는 대상 프로세스 하나에 붙어야 하고 오버헤드도 커서 운영 중인 서버에서 시스템 전체를 훑어보기엔 부담스럽다.…

Continue ReadingBCC

ss로 패킷 드롭·재전송 진단하기

애플리케이션 처리량이 갑자기 떨어졌는데 CPU/메모리는 멀쩡하다면 네트워크 재전송을 의심해봐야 한다. 그런데 netstat -s나 nstat은 시스템 전체 누적 카운터만 보여줘서 정작 어떤 연결이 문제인지는 짚어주지 못한다. 이 글에서는 ss -i로 개별…

Continue Readingss로 패킷 드롭·재전송 진단하기

메모리 단편화와 compaction — /proc/buddyinfo로 확인하기

메모리는 넉넉히 남아 있는데 huge page나 큰 DMA 버퍼 할당이 실패하는 경우가 있다. 총 여유 메모리량과 별개로, 그 여유분이 4KB 단위로 잘게 흩어져 있으면 연속된 큰 블록이 필요한 할당은 실패한다.…

Continue Reading메모리 단편화와 compaction — /proc/buddyinfo로 확인하기

페이지 회수(page reclaim)와 kswapd 동작 원리

메모리 사용량이 갑자기 늘면 시스템이 느려지는데 free -h로 봐도 buff/cache가 넉넉해 보여 원인을 못 짚을 때가 있다. 그 여유분을 실제로 회수해 할당 가능하게 만드는 과정이 kswapd의 페이지 회수(reclaim)인데, 회수 속도가…

Continue Reading페이지 회수(page reclaim)와 kswapd 동작 원리

리눅스 OOM Killer 동작 원리와 oom_score_adj 튜닝

메모리가 정말 바닥나면 커널은 프로세스 하나를 희생시켜서라도 시스템 전체가 멈추는 걸 막는다. 문제는 OOM Killer가 고르는 희생양이 항상 원하는 프로세스가 아니라는 점이다 — 메모리를 많이 쓴다는 이유만으로 DB가 먼저 죽고,…

Continue Reading리눅스 OOM Killer 동작 원리와 oom_score_adj 튜닝

cgroups v2 CPU 컨트롤러로 코어 리소스 제한하기

같은 서버에서 여러 서비스를 돌리다 보면 배치 작업 하나가 CPU를 독차지해 다른 서비스 응답 속도가 같이 떨어지는 경우가 생긴다. nice는 우선순위만 조정할 뿐 상한을 강제하지 못한다. cgroups v2의 cpu 컨트롤러는…

Continue Readingcgroups v2 CPU 컨트롤러로 코어 리소스 제한하기

taskset/cpuset으로 코어 바인딩하기

CPU 시간을 얼마나 쓸지(cpu.max/cpu.weight)와 어느 코어에서 실행될지는 별개 문제다. NUMA 지역성이 중요하거나 특정 코어를 인터럽트 처리용으로 비워둬야 한다면 사용량 제한이 아니라 실행 코어 자체를 고정해야 한다. 이 글에서는 프로세스 하나를…

Continue Readingtaskset/cpuset으로 코어 바인딩하기

irqbalance vs 수동 IRQ affinity 설정

이전 글에서는 smp_affinity로 IRQ를 특정 코어에 수동 고정해 쏠림을 해결했다. 그런데 코어가 수십 개고 트래픽 패턴이 계속 바뀌는 서버라면 매번 손으로 재배치하는 대신, 대부분의 배포판이 기본 설치해두는 irqbalance 데몬이 자동으로…

Continue Readingirqbalance vs 수동 IRQ affinity 설정