Python resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…

Continue ReadingPython resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

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

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

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

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

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

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

라즈베리파이에서 I2C 센서 데이터 읽기 — python-smbus2 실전

센서마다 GPIO 핀을 하나씩 배정하는 방식은 핀 개수 제한과 배선 복잡도 때문에 금방 한계에 부딪힌다. I2C는 SDA/SCL 두 핀만으로 여러 센서를 동시에 연결하는 버스 프로토콜이고, BME280 같은 저가형 온습도/기압 센서는…

Continue Reading라즈베리파이에서 I2C 센서 데이터 읽기 — python-smbus2 실전

Python multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

numpy 배열을 multiprocessing.Queue/Pipe로 주고받으면 매번 pickle 직렬화·역직렬화가 일어나 배열이 클수록 병목이 된다. Python 3.8부터 표준 라이브러리에 들어온 multiprocessing.shared_memory는 pickle 없이 OS의 진짜 공유 메모리(POSIX /dev/shm)를 이름으로 attach해 여러 프로세스가 같은…

Continue ReadingPython multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

Python os.eventfd()로 이벤트 알림 다루기 — 카운터 누적부터 poll 이벤트 루프 깨우기까지

스레드 간, 또는 프로세스 간에 "무슨 일이 일어났다"는 신호 하나만 가볍게 보내고 싶을 때 파이프나 소켓은 다소 과하다. eventfd는 커널이 관리하는 64비트 정수 카운터 하나를 파일 디스크립터로 노출해서, select/poll/epoll 같은…

Continue ReadingPython os.eventfd()로 이벤트 알림 다루기 — 카운터 누적부터 poll 이벤트 루프 깨우기까지

Python os.pidfd_open()으로 PID 재사용 레이스 없이 프로세스 관리하기

PID 기반 프로세스 관리(os.kill(pid, sig), os.waitpid(pid, ...))에는 근본적인 문제가 있다. PID는 재사용된다. 어떤 프로세스가 죽고 그 PID가 회수되면, 커널은 그 번호를 완전히 다른 새 프로세스에 다시 배정할 수 있다. 자식…

Continue ReadingPython os.pidfd_open()으로 PID 재사용 레이스 없이 프로세스 관리하기

Python inotify로 파일시스템 이벤트 감시하기

특정 디렉터리에 새 파일이 생기거나 로그 파일이 갱신될 때마다 즉시 반응해야 하는 스크립트를 짤 때, 가장 손쉬운 방법은 os.listdir()이나 파일의 mtime을 주기적으로 비교하는 폴링(polling)이다. 하지만 폴링 주기를 짧게 잡으면 CPU를…

Continue ReadingPython inotify로 파일시스템 이벤트 감시하기

Python asyncio로 비동기 시스템 모니터링 구현하기

서버 여러 대의 상태를 순차적으로 점검하는 스크립트를 짜본 적이 있다면 익숙한 문제가 있다. 호스트 10대를 ping으로 확인하는 데 각각 1초가 걸린다면, for 루프로 하나씩 처리할 경우 전체 실행 시간은 10초에…

Continue ReadingPython asyncio로 비동기 시스템 모니터링 구현하기