동일한 프로세스가 다른 "CPU"에서 앞뒤로 바운스되는 이유는 무엇입니까?

동일한 프로세스가 다른 "CPU"에서 앞뒤로 바운스되는 이유는 무엇입니까?

전체 CPU 코어를 사용하지만 단일 스레드인 프로세스를 시작하는 일부 장기 실행 작업에 대한 성능 문제 해결을 수행하고 있습니다. 나는 이러한 프로세스가 계속해서 다른 CPU로 점프하는 것을 관찰했습니다. 동일한 프로세스가 다른 CPU로 이동되는 이유는 무엇입니까? 커널 스케줄러가 실행 중인 프로세스를 너무 자주 이동하거나 전혀 이동하지 않는 것은 정상적이지 않은 것 같습니다. 그러나 다양한 프로세스에서 이러한 동작을 볼 수 있습니다. 프로세스가 더 활성화될수록 여러 CPU에서 더 많이 변경되는 것 같습니다.

나는 이 행동을 관찰합니다 top. 해당 열을 추가합니다 Last Used Cpu. 그런 다음 프로세스 ID가 동일하게 유지됨에도 불구하고 다른 CPU로 계속 변경되는 흥미로운 프로세스를 관찰했습니다.

오버레이 작업이 균형 있게 실행되는 동안 여러 CPU에서 프로세스가 유지되어야 함에도 불구하고 프로세스가 동일한 CPU에서 일시적으로 서로 충돌하는 경우가 많기 때문에 일부 작업에서는 성능이 일관되지 않을 정도로 다양합니다. 이러한 작업이 실행되는 동안 서버는 이러한 프로세스를 제외하고 대부분의 시간 동안 유휴 상태입니다. 따라서 작업 1이 한 CPU 세트에서 프로세스를 시작하고 작업 2가 최종적으로 다른 CPU 세트에서 시작되어 그대로 유지되기를 원합니다.

EC2의 Amazon Linux 2 커널 4.14.x

답변1

Linux 스케줄러는 자연스러운 CPU 선호도를 사용합니다. 즉, 성능상의 이유로 스케줄러는 가능한 한 오랫동안 동일한 CPU에 프로세스를 유지하려고 합니다. 일반 Linux 시스템에서 사용할 수 있습니다 taskset.

그러나 내가 이해한 바로는 전용 인스턴스가 없으면 EC2에서 많은 CPU 공유가 발생합니다. 프로세스를 vCPU에 연결할 수도 있지만 이는 단지 외관상일 뿐입니다.

답변2

top을 사용하여 이 현상을 관찰하는 방법을 작성합니다. Man Top이 인정한 것처럼 이것이 귀하의 분석에 적합한 도구인지 확신할 수 없습니다.

  1. P - 마지막으로 사용된 CPU(SMP) 마지막으로 사용된 프로세서를 나타내는 숫자입니다. 실제 SMP 환경에서는 커널이 의도적으로 약한 친화력을 사용하기 때문에 이는 자주 변경될 수 있습니다. 또한, top 실행 자체가 이러한 약한 친화력을 깨고 더 많은 프로세스가 CPU를 더 자주 교체하게 만들 수 있습니다(CPU 시간에 대한 추가 요구로 인해).

나는 개인적으로 /proc/interrupts에 보고된 재예약된 인터럽트 수에 의존하는 것을 선호합니다.

답변3

겹치는 작업이 실행되는 경우에도 서로 다른 CPU 간에 균형을 유지해야 합니다.

아니요, 그러면 안됩니다. 어떤 스케줄러를 사용하고 있는지는 밝히지 않았지만 제가 아는 한 현재 모든 주류 배포판은 기본적으로 완전히 공정한 스케줄러를 사용합니다. 사용 가능한 CPU를 기준으로 CPU에 작업을 할당합니다. 프로세스에서 사용한 마지막 CPU는 다음과 같습니다.첫번째 선택대상, 동일한 하이퍼스레딩 그룹의 다음 CPU, 동일한 소켓의 CPU(동일한 L2 캐시 IIRC 공유?) - 그리고 NUMA를 처리할 때 상황이 복잡해지기 시작합니다. 인터넷에 찾아보시면 다 기록되어 있습니다.

행복한 머신에서는 프로세스가 CPU에서 실행되는 데 사용 가능한 최대 시간 슬롯에 도달하지 않습니다. 작업은 무언가를 수행할 것입니다. 즉, 어떤 일이 발생할 때까지 기다려야 하므로 그 자리를 양보해야 한다는 의미입니다. 평균 로드가 CPU 수에 가까워지면 CPU 리소스에 대한 경합이 발생하고 스케줄러는 작업이 준비되기 전에(선점됨) CPU에서 작업을 시작하기 시작합니다. 일반적으로 이는 시스템 처리량을 약간 감소시킵니다.

CPU 선호도 알고리즘에 가중치를 부여하는 데 사용되는 일부 계수를 조정할 수 있습니다. sysctl -A | grep "sched" | grep -v "domain"매개변수를 보려면 실행하세요 . 그러나 커널은 런타임에 CFS를 어느 정도 조정합니다.

이러한 작업이 실행되는 동안 서버는 이러한 프로세스를 제외하고 대부분 유휴 상태입니다.

정말? 이러한 프로세스는 네트워크 또는 스토리지 I/O를 수행하지 않습니다.

관련 정보