ARM PMU를 활용한 시스템 성능 모니터링
시스템이 느려졌을 때 "CPU가 바쁜지" "메모리가 병목인지"를 구분하는 건 생각보다 어렵다. top의 CPU 사용률은 코어가 뭔가는 하고 있다는 것만 보여줄 뿐, 그 사이클이 실제 연산에 쓰였는지 메모리 응답을 기다리며 멈춰…
시스템이 느려졌을 때 "CPU가 바쁜지" "메모리가 병목인지"를 구분하는 건 생각보다 어렵다. top의 CPU 사용률은 코어가 뭔가는 하고 있다는 것만 보여줄 뿐, 그 사이클이 실제 연산에 쓰였는지 메모리 응답을 기다리며 멈춰…
코드가 느린 게 캐시 미스 때문인지, 분기 예측 실패 때문인지, 아니면 그냥 명령어 수가 많아서인지는 로그나 타이머만으로는 알기 어렵다. wall clock 시간은 "얼마나 걸렸는지"만 알려줄 뿐, "왜 걸렸는지"는 알려주지 않는다.…
Vundle로 플러그인 매니저 자체는 갖췄어도, .vimrc에 아무것도 선언하지 않은 vim은 여전히 텍스트 편집기 수준을 벗어나지 못한다. 파일 탐색, git 상태 확인, 코드 자동완성, 린팅처럼 IDE에서는 당연하게 여기는 기능들은 결국 플러그인을…
vim에서 플러그인을 쓰려면 원래는 ~/.vim/plugin, ~/.vim/autoload 같은 디렉터리 구조를 직접 이해하고, 저장소를 하나씩 git clone한 뒤 runtimepath까지 손으로 맞춰야 했다. 플러그인이 두세 개만 넘어가도 버전 관리, 업데이트, 제거 작업이 금방…
라즈베리파이OS 기본 커널은 일반 목적 스케줄러를 쓰기 때문에, 인터럽트가 몰리거나 시스템 부하가 커지면 특정 태스크의 응답 시간이 수 밀리초에서 수십 밀리초까지 튈 수 있다. 로봇 제어, 모터 구동, 오디오 프로세싱처럼…
퍼블릭 클라우드에서 VM 인스턴스 하나를 빌리는 일은 호스트 커널이나 같은 물리 서버 위에서 도는 다른 테넌트의 VM에는 손댈 수 없다는 전제 위에 서 있습니다. KVM(Kernel-based Virtual Machine)의 섀도 페이징(shadow paging)…
특정 디렉터리에 새 파일이 생기거나 로그 파일이 갱신될 때마다 즉시 반응해야 하는 스크립트를 짤 때, 가장 손쉬운 방법은 os.listdir()이나 파일의 mtime을 주기적으로 비교하는 폴링(polling)이다. 하지만 폴링 주기를 짧게 잡으면 CPU를…
Ubuntu 서버를 운영하다 보면 apt upgrade 알림이나 MOTD에서 "N개의 보안 업데이트가 있습니다" 같은 문구를 자주 보게 된다. 그런데 막상 그 N개가 어떤 취약점(CVE)을 고치는 건지, 커널 패치라 재부팅이 꼭 필요한지,…
CPU 사용률은 낮은데 프로세스가 유독 느리게 느껴질 때가 있다. top이나 ps는 프로세스가 CPU를 얼마나 썼는지는 보여주지만, 그 프로세스가 CPU를 기다리느라 얼마나 시간을 날렸는지, 디스크 I/O나 스왑·메모리 회수 때문에 얼마나 블로킹됐는지는…
AOSP(Android Open Source Project)처럼 수백 개의 Git 저장소로 쪼개진 대형 프로젝트를 다뤄본 적이 있다면, 저장소 하나하나를 git clone하고 브랜치를 맞추고 동시에 pull하는 일이 얼마나 번거로운지 알 것이다. 저장소마다 리비전이 어긋나거나,…