ARMv8.1 LSE 원자적 연산: LL/SC와 실제 컴파일 결과 비교

ARMv8.0의 원자적 연산은 LL/SC(Load-Linked/Store-Conditional) 방식이다 — ldxr로 값을 읽고 연산한 뒤 stxr로 조건부 저장하는데, 그사이 다른 코어가 같은 주소를 건드리면 저장이 실패해 처음부터 재시도한다. 코어 수가 많아질수록 이 재시도가 잦아져…

Continue ReadingARMv8.1 LSE 원자적 연산: LL/SC와 실제 컴파일 결과 비교

리눅스 스케줄러 자료구조로 보는 CFS/EEVDF: sched_entity와 cfs_rq

리눅스 6.6부터 CFS를 대체한 EEVDF 스케줄러의 vruntime/eligible time/deadline 같은 개념은 이 블로그의 이전 글에서 다뤘다. 이 글은 그 개념이 실제로 어떤 구조체와 함수로 구현되어 있는지, kernel/sched/fair.c(6.18 기준) 소스를 직접 따라가며…

Continue Reading리눅스 스케줄러 자료구조로 보는 CFS/EEVDF: sched_entity와 cfs_rq

Python signal 모듈로 SIGTERM 핸들링과 graceful shutdown 구현하기

systemd나 Docker, Kubernetes는 프로세스를 종료할 때 먼저 SIGTERM을 보내고, 일정 시간(기본 10초 안팎) 안에 종료하지 않으면 SIGKILL로 강제 종료한다. 이 시간 안에 진행 중인 요청을 마무리하거나 파일 핸들을 정리하지 못하면…

Continue ReadingPython signal 모듈로 SIGTERM 핸들링과 graceful shutdown 구현하기

Ubuntu Pro 무료 등록과 확장 보안 유지보수(ESM) 활용법

Ubuntu LTS의 표준 보안 패치는 Main/Restricted 저장소(커널, 핵심 시스템 패키지)에만 5년간 제공되고, 그 이후나 Universe/Multiverse 저장소(커뮤니티가 유지보수하는 패키지 대부분)는 애초에 Canonical의 공식 보안 패치 대상이 아니다. 실서비스에 쓰는 서버가 이…

Continue ReadingUbuntu Pro 무료 등록과 확장 보안 유지보수(ESM) 활용법

set -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…

Continue Readingset -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 배열과 getopts로 커맨드라인 인자 제대로 다루기

쉘 스크립트에서 $1, $2를 순서대로 읽는 방식은 옵션이 두세 개만 넘어가도 순서를 착각하기 쉽고, 필수 옵션 누락 같은 실수를 걸러낼 방법이 없다. 공백으로 이어붙인 문자열을 IFS로 잘라 쓰는 방식도 값…

Continue ReadingBash 배열과 getopts로 커맨드라인 인자 제대로 다루기

Ubuntu unattended-upgrades로 보안 패치 자동 적용하기

보안 패치는 CVE가 뜬 순간이 아니라 담당자가 apt를 돌리는 순간에야 적용된다. 서버가 몇 대만 넘어가도 관리가 안 되고, 휴가나 주말 사이에 터진 취약점은 며칠씩 방치되기 쉽다. Ubuntu는 매일 자동으로 보안…

Continue ReadingUbuntu unattended-upgrades로 보안 패치 자동 적용하기

QEMU/KVM에서 virtio-net으로 네트워크 성능 끌어올리기

QEMU/KVM 게스트의 기본 에뮬레이트 NIC(e1000, rtl8139 등)은 물리 NIC 레지스터를 소프트웨어로 그대로 흉내 내, 패킷 하나마다 MMIO/PIO 접근이 VM Exit로 호스트에 트랩된다. 이 트랩 비용 때문에 처리량이 물리 NIC 대비…

Continue ReadingQEMU/KVM에서 virtio-net으로 네트워크 성능 끌어올리기

Python mmap으로 파일을 메모리처럼 다루기

파일 크기가 물리 메모리를 넘어서면 open().read()로 통째로 읽는 순간 프로세스 메모리가 그만큼 늘어나 OOM killer에 걸릴 수 있다. Python 표준 라이브러리 mmap은 파일을 프로세스의 가상 주소 공간에 매핑해서, 실제로 접근한…

Continue ReadingPython mmap으로 파일을 메모리처럼 다루기