CPU pinning과 taskset

기술/리눅스 2018. 8. 27. 22:49 Posted by 아는 개발자


Big/Little로 이루어진 멀티코어 하드웨어 환경에서는 소프트웨어의 성능을 높이기 위해 하드웨어적인 트릭을 사용하는데 이중 가장 대표적인 것이 프로세스를 처리할 수 있는 CPU 종류를 설정하는 CPU pinning 방법이다. CPU affinity라고도 부른다.


기본적으로 스케줄러는 큐에 대기중인 프로세스를 하드웨어상에서 idle 상태에 있는 CPU에 최우선적으로 작업을 할당한다. 그런데 idle 상태에 있는 CPU가 Little라면 처리하는 속도가 Big Core에 비해서 확연히 차이가 날 수 있다. 칩에 따라서 다르지만 일반적으로 Big Core와 Little Core의 성능은 1.5배정도 차이가 난다. 만약 오래 걸리는 작업이라면 Little Core에 할당하는 것보다 Big Core가 idle이 되길 기다렸다가 여기서 처리하도록 하는 것이 성능적으로 우수 할 수 있다.


물론 시스템 내에 존재하는 모든 프로세스가 Big Core에서만 동작하려고 한다면 성능의 효과를 보지 못한다. CPU pinning은 시스템 전반의 효율화를 위해 만들어진 스케줄러의 빈틈을 노리는 것이기 때문에 다른 프로세스들은 모든 코어에서 정상적으로 돌고 있는 환경에서 효과를 극대화 할 수 있다. 그래서 일반적인 소프트웨어에서는 사용하지 않고 여러 개의 Virtual Machine이 동작하는 환경에서 VM의 성능을 조정할 때 주로 이용된다.



taskset은 Linux 환경에서 CPU pinning을 지원하는 커맨드다. 현재 프로세스에 pinning된 CPU 정보를 볼 수 있고 역으로 설정 할 수도 있다. 사용방법은 아래의 코드로만 봐도 될 정도로 간단하다.

// taskset -pc {pid} : pinning 정보 보기
// taskset -pc {Masking ex) 0-3 or 1,2,3,4} {pid} : pinning 설정하기
kwony@kwony:/proc/4007/task/4007$ taskset -pc 4007
pid 4007's current affinity list: 0-3
kwony@kwony:/proc/4007/task/4007$ taskset -pc 1,2,3 4007
pid 4007's current affinity list: 0-3
pid 4007's new affinity list: 1-3


728x90

'기술 > 리눅스' 카테고리의 다른 글

RCU (Read-Copy Update)  (0) 2018.10.30
Cgroup (Control Group)  (0) 2018.09.15
CPU pinning과 taskset  (0) 2018.08.27
스핀락  (0) 2018.07.23
eventfd  (0) 2018.07.18
workqueue 사용법  (0) 2018.07.16