Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

테스트성능

지연에 민감한 프로세스는 CPU 몫 제한 대신 코어를 못박는다

--cpus 몫 제한은 할당량이 차면 프로세스를 0.1초씩 통째로 멈춘다. 틱 루프 같은 프로세스는 --cpuset-cpus로 코어를 고정하고 taskset으로 자리를 나눈다.

게임 틱 루프처럼 일정한 간격으로 돌아야 하는 프로세스가 컨테이너 안에서 이따금 통째로 멈칫한다. 평균 CPU 사용량은 한도 아래인데도 그렇다.

원인은 cgroup의 CPU 몫 제한(--cpus)이다. 이 제한은 주기(기본 100ms)마다 쓸 수 있는 할당량을 주고, 할당량을 다 쓰면 다음 주기가 올 때까지 프로세스를 멈춘다. 평균은 낮아도 순간적으로 몰리면 최대 0.1초씩 끊기니, 틱 루프에는 치명적이다.

몫으로 나누지 말고 코어로 나눈다. 컨테이너는 --cpuset-cpus로 쓸 코어를 못박고, 그 안에서 지연에 민감한 프로세스는 taskset으로 첫 코어에, 서버·브라우저처럼 나머지 일은 남은 코어에 둔다.

docker run --cpuset-cpus=4-7 app-e2e sh -c '
  taskset -c 4 python -m engine &
  exec taskset -c 5-7 npm run e2e
'

코어 나누기는 러너가 한 번만 정해 환경변수로 아래에 물려준다. 작업자 프로세스가 설정을 다시 읽어 또 나누면 자리가 겹친다.

한 기계를 여러 사람이나 여러 빌드가 나눠 쓴다면, 로컬에서는 바꾼 부분의 시험만 돌리고 전체 시험은 CI에 맡긴다. 전체를 로컬에서 동시에 돌리면 서로의 코어를 빼앗아 시간 측정이 모두 흔들린다.

문의 →