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

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

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

Ubuntu 커맨드라인 기초 명령어 정리

처음 터미널 창을 마주하면 깜빡이는 커서 앞에서 뭘 입력해야 할지부터 막막하다. 온라인 가이드마다 "터미널을 열고 이 명령을 입력하세요"라고 나오는데, 정작 경로가 뭔지, 파이프(|)가 뭔지, sudo를 왜 조심해야 하는지는 설명 없이…

Continue ReadingUbuntu 커맨드라인 기초 명령어 정리

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

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

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

Ubuntu 26.04 LTS Server 설치 가이드

서버는 GUI 없이 최소한의 리소스로 안정적으로 돌아가야 하는데, Ubuntu Server 설치 프로그램(subiquity)은 텍스트 기반(TUI)으로 동작해 Desktop 설치보다 화면 구성이 단순하면서도 네트워크·스토리지·SSH 설정 같은 서버 운영에 필요한 옵션을 설치 단계에서 함께…

Continue ReadingUbuntu 26.04 LTS Server 설치 가이드

리눅스 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 설정

softirq/NAPI와 RPS/RSS 패킷 분산

NIC가 패킷을 받을 때마다 매번 하드웨어 인터럽트를 걸면, 트래픽이 조금만 몰려도 CPU가 인터럽트 처리에만 매달리는 인터럽트 폭풍이 발생한다. 리눅스 네트워크 스택은 NAPI(poll 기반 수신)로 이 문제를 완화하는데, NAPI만으로는 NIC 큐가…

Continue Readingsoftirq/NAPI와 RPS/RSS 패킷 분산