티스토리 뷰
기타
특정 코어를 특정 프로세스에 할당하여 처리하는 방법 CPU Affinity: taskset과 start /affinity
developer0hye 2026. 3. 23. 10:48아직 안 써봄. Claude랑 대화하다가 말해줘서 나중에 써먹을 일 있을 거 같아서 정리해놓음
CPU Affinity란?
프로세스가 실행될 CPU 코어를 지정하는 기능이다. 기본적으로 OS 스케줄러는 프로세스를 여러 코어에 자유롭게 옮겨가며 실행하는데, CPU Affinity를 설정하면 특정 코어에서만 실행되도록 고정할 수 있다.
왜 필요한가?
1. 캐시 친화성 (Cache Affinity)
CPU 코어마다 L1/L2 캐시를 별도로 갖고 있다. 프로세스가 코어 0에서 실행되다가 코어 3으로 옮겨지면, 코어 0의 캐시에 쌓아둔 데이터를 코어 3에서 다시 로드해야 한다 (cold cache). 코어를 고정하면 캐시가 warm 상태로 유지되어 성능이 안정적이다.
2. NUMA 최적화
멀티소켓 서버에서는 각 CPU 소켓이 자기 근처의 메모리에 빠르게 접근할 수 있지만, 다른 소켓의 메모리에 접근하면 2~3배 느리다 (원격 메모리 접근). CPU Affinity로 프로세스를 특정 소켓의 코어에 고정하면 항상 로컬 메모리만 접근하게 할 수 있다.
3. Jitter 감소
코어 간 마이그레이션에는 비용이 든다. 실시간 처리나 벤치마크처럼 일관된 응답 시간이 중요한 상황에서 코어를 고정하면 레이턴시 변동(jitter)을 줄일 수 있다.
Linux: taskset
기본 사용법
# 프로세스를 코어 2에서 실행
taskset -c 2 ./my_program
# 코어 0, 1, 2에서 실행
taskset -c 0-2 ./my_program
# 코어 0과 4에서 실행
taskset -c 0,4 ./my_program
실행 중인 프로세스에 적용
# PID 확인
pidof my_program
# 해당 프로세스를 코어 3에 고정
taskset -pc 3 <PID>
# 현재 affinity 확인
taskset -pc <PID>
CPU 마스크 방식
-c 옵션 대신 비트마스크로 지정할 수도 있다.
# 0x1 = 0001 = 코어 0
taskset 0x1 ./my_program
# 0x5 = 0101 = 코어 0, 2
taskset 0x5 ./my_program
# 0xF = 1111 = 코어 0, 1, 2, 3
taskset 0xF ./my_program
벤치마크 예시
# turbo boost 비활성화 (클럭 변동 제거)
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
# CPU governor를 performance로 고정
sudo cpupower frequency-set -g performance
# 코어 2에 고정하여 벤치마크 실행
taskset -c 2 cargo bench
Windows: start /affinity
기본 사용법
start /affinity <hex_mask> <program> 형식으로 사용한다. 마스크는 16진수 비트마스크다.
# 코어 0 (0x1 = 0001)
start /affinity 0x1 my_program.exe
# 코어 1 (0x2 = 0010)
start /affinity 0x2 my_program.exe
# 코어 0, 1 (0x3 = 0011)
start /affinity 0x3 my_program.exe
# 코어 0, 2 (0x5 = 0101)
start /affinity 0x5 my_program.exe
비트마스크 빠른 참조표
| 마스크 | 이진수 | 사용 코어 |
|---|---|---|
| 0x1 | 0001 | 코어 0 |
| 0x2 | 0010 | 코어 1 |
| 0x4 | 0100 | 코어 2 |
| 0x3 | 0011 | 코어 0, 1 |
| 0x5 | 0101 | 코어 0, 2 |
| 0xF | 1111 | 코어 0~3 |
| 0xFF | 11111111 | 코어 0~7 |
PowerShell에서 실행 중인 프로세스에 적용
# 프로세스의 affinity를 코어 0, 1로 변경
$proc = Get-Process -Name "my_program"
$proc.ProcessorAffinity = 0x3
실제 서비스에서의 활용 사례
NGINX
# nginx.conf
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# worker 0 → 코어 0, worker 1 → 코어 1, ...
Redis
Redis는 싱글스레드 기반이라 하나의 코어에 고정하면 효과적이다.
taskset -c 0 redis-server /etc/redis/redis.conf
systemd 서비스
# /etc/systemd/system/my_service.service
[Service]
ExecStart=/usr/bin/my_program
CPUAffinity=0 1 2 3
주의사항
- 무조건 좋은 건 아니다. OS 스케줄러는 대부분의 상황에서 충분히 잘 동작한다. CPU Affinity는 레이턴시에 극도로 민감한 서비스(실시간 처리, 금융 트레이딩, 고성능 네트워크)에서 진가를 발휘한다.
- 코어 배분을 잘못하면 역효과. 특정 코어만 과부하 걸리고 나머지 코어는 놀게 될 수 있다.
- 하이퍼스레딩 주의. 물리 코어와 논리 코어를 구분해야 한다. 같은 물리 코어의 두 논리 코어에 고정하면 리소스를 나눠 쓰게 되어 기대만큼 성능이 안 나올 수 있다.
lscpu로 토폴로지를 확인하자.
'기타' 카테고리의 다른 글
| 마크다운을 정보 유출 걱정 없이 PDF로 변환하는 가장 쉬운 방법 (무료, 설치 없음, 서버 파일 업로드 없음) (0) | 2026.03.21 |
|---|---|
| claude code 쓰다가 영 정신 못 차리는 거 같을때 (0) | 2026.03.21 |
| 20260320 클로드 코드 사용하며 느낀점 (0) | 2026.03.20 |
| nvdec 활용 다채널 비디오 동시 디코딩 기능 구현 완료 (2) | 2026.03.18 |
| Claude Code CLI에서 ! 붙이면 bash 명령어를 바로 실행할 수 있다 (0) | 2026.03.17 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- MOT
- 백준 11437
- FairMOT
- Lowest Common Ancestor
- LCA
- 백준
- 백준 1766
- 백준 11053
- 조합
- 백트래킹
- 단축키
- 순열
- 인공지능을 위한 선형대수
- cosine
- PyCharm
- 자료구조
- 가장 긴 증가하는 부분 수열
- C++ Deploy
- ㅂ
- 위상 정렬 알고리즘
- 문제집
- 파이참
- 이분탐색
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
글 보관함
