맥에서 colima VM 으로 도커를 사용하고 있다.
vmType: vz(Virtualization.framework)로 10 vCPU, 16GB 로 설정했다.
[문제]
그런데 com.apple.Virtualization.VirtualMachine 또는 Virtual Machine Service for limactl(요건 activity monitor 에선 요 이름으로 보인다.) 이름의 프로세스가 2~3초마다 cpu 사용율이 100~200% 스파이크가 발생한다.
[시도1]
1. colima 데몬이 파일 변경을 감지하면 stat, chmod(현재 권한 그대로, 하지만 vm 커널을 거친 변경이라 inotify 파일 변경 이벤트가 발생한다.)실행한다.
2. vm 내의 커널이 이벤트를 발생시킨다.
3. 컨테이너는 이벤트를 받고 파일이 바뀐걸 알아챈다.
다음과 같이 colima inotify 가 홈 디렉터리 전체를 감시하고 있었다.
~/.config/colima/default/colima.yaml
mountInotify: true
mounts: [] # 비어 있으면 기본값으로 $HOME 전체를 마운트
그래서 colima 데몬이 $HOME 아래 모든 파일 변경을 vm 으로 전달해 파일이 변경될 때마다 ssh 로 vm 접속해서 다음과 같은 명령을 실행한다.
참고로 lima 를 감싸 docker 등의 cli 제공하는게 colima 다.
limactl shell --instance colima stat ~/.claude/projects/.../xxx.jsonl
limactl shell --instance colima sudo /bin/chmod 600 ~/.claude/projects/.../xxx.jsonl
5초간 모니터링하면 이런 ssh 연결이 15개 정도 생긴다.
대부분 claude code 대화 기록(~/.claude/projects/*.jsonl)이다.
claude code 작업중이면 이 파일이 계속 변경돼 위 ssh limactl 를 실행해 vm cpu 를 사용하게 된다.
# 마운트된 파일 변경 알림 끄기
mountInotify: false
# 또는 mounts 에 필요한 디렉터리만 지정해 감시 범위 좁히기
mounts:
- location: ~/workspace/colima
# 재시작
colima restart
$HOME 이라도 클로드 사용할때 파일 몇개만 변경되는거라 cpu 사용율 저하에는 영향이 거의 없었다.
[시도2]
# vCPU 10 -> 4 로 줄이고 재시작(colima restart)
cpu: 4
어차피 스파이크고 200%(cpu 2)내라 cpu 사용율 저하에는 영향이 거의 없었다.
[시도3]
harbor, tekton 등을 하나씩 내려(삭제)봤지만 cpu 스파이크 발생한다.
[시도4]
# kube-system > metrics-serever pod 를 비활성화해 재시작(colima restart)
k3sArgs:
- --disable=metrics-server
어느정도 cpu 스파이크가 줄었지만 아직도 발생한다.
[시도5]
kubelet 에서 10초마다 다음과 같은 조회를 수행하는것으로 보인다.
이미지 전체 목록 (/images/json?all=1&shared-size=1)
컨테이너 목록 (getContainersJSON)
이미지 상세 (getImagesByName)
이미지들 중 컨테이너가 쓰는 건 20개 정도 뿐이고 80개는 사용되지 않는다.
exited 상태의 container 도 30개가 남아 있었다.
# dangling image, exited container 제거
docker system prune --all
이미지와 컨테이너수가 주니 cpu 스파이크가 줄었다.
colima 는 재시작할 때마다 exited 컨테이너가 생기고 이미지도 사용하다 보면 쌓이게 되니 주기적으로 잘 정리해야겠다.
#####
[참고]
현재 runtime: docker 설정에선
k3s(kubelet) -> cri-dockerd(k3s 에 내장) -> dockerd -> containerd -> runc
docker CLI -> dockerd -> containerd -> runc
kubelet 은 cri-dockerd 를 통해 dockerd 에 요청한다.
kubelet 이 매초 상태(metric 같은)를 확인할 때마다 이 단계를 거친다.
runtime: containerd 로 바꾸면
(k3s)kubelet -> containerd(k3s 에 내장) -> runc
nerdctl -> containerd -> runc
dockerd 와 cri-dockerd 단계가 빠진다.
하지만 docker cli 와 docker compose 를 사용하지 못하고 nerdctl(docker 호환 cli) 를 사용해야 한다.
# 설치
colima nerdctl install
