Linux 네트워크 응용 프로그램의 대기 시간을 줄이려고합니다. 특정 CPU 코어에 프로그램을 “바인딩”하는 두 가지 도구 인 taskset과 cpuset이 있다는 것을 배웠습니다.
- 어느 것을 선호해야합니까? 그것들은 낮은 수준에서 동등합니까?
- (처분) 내 응용 프로그램에는 단일 스레드가 있으며 대기 시간이 가장 짧은 고속 LAN 네트워크를 통해 단일 TCP 연결 (재 연결 없음)을 처리해야합니다. 내가 올바른 길에 있습니까?
답변
작업 세트 는 하나 이상의 CPU에 프로세스를 바인딩하기위한 것입니다. 기본적으로 초기 실행 또는 실행 중에 실행할 수 있는 위치를 지정 합니다. 최신 서버 장비에서 RHEL / CentOS를 사용하는 경우 numactl
권장됩니다 taskset
.
Cpuset / cset 은 CPU 차폐 용이며 Linux cgroup을 중심으로 구축 된 프레임 워크입니다. 프로세스 관리에 사용할 수있는 다른 도구가 있기 때문에 CHEL은 RHEL과 같은 특정 배포에서 인기가 없었습니다.
아래의 첫 번째 명령은 운영 체제의 작업을 CPU 코어 0 및 8로 제한하는 보호막을 생성합니다. 두 번째 명령은 현재 쉘 세션을 지정된 CPU 보호기로 이동하여 시스템 및 사용자 프로세스를 격리시킵니다.
# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user
CPU에 바인딩 프로세스의 경로를 내려 가기 전에 확인하고 조정해야 할 다른 사항이 있습니다. 인터럽트 ( irqbalance
일부 비활성화), 절전 설정, 시스템 스케줄러, I / O 엘리베이터, 실시간 정책 ( chrt
).
Ubuntu의 낮은 대기 시간 TCP 설정을 참조하십시오.
여기 (의 선상 다음과 ./your_program 실행되며, 그 선택 랩퍼 어플리케이션 코어의) 예 irqbalance 정지 선택된 코어 및 그 블랙리스트 시작 SCHED_FIFO 선택된 코어와 우선 순위 (99).
Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program