서로 다른 CPU 코어에 서로 다른 화면이 있습니까?

서로 다른 CPU 코어에 서로 다른 화면이 있습니까?

여러 CPU가 있는 (osX) 서버에 연결하고 있습니다. 다양한 입력 파일에 대해 프로그램을 실행하고 싶습니다. 이제 하나씩 실행합니다.

for input in "${inputs[@]}"
do
    .<my-program.sh> --input $input
done

이것은 매우 느리고 전체 CPU 성능을 사용하지 않으므로 대신 병렬로 실행하고 싶습니다.

새로운 독립 화면을 열고 그 안에서 프로그램을 실행하고 싶습니다. 예를 들면 다음과 같습니다.

for input in "${inputs[@]}"
do
    screen -S test -X screen .<my-program.sh> --input $input
done

각 화면이 다른 CPU에서 작동합니까(사용 가능한 CPU 성능을 사용하고 싶습니까?) 명령이 정확합니까? 아니면 각 입력에 대해 새 셸을 열어야 합니까(다른 CPU에서 실행되어야 한다고 가정합니다)?

답변1

질문에 직접 대답하려면 CPU 고정을 사용하여 특정 프로세스를 특정 CPU에 수동으로 할당하지 않는 한 운영 체제는 일반적으로 당시에 처리할 수 있는 "최고의" CPU라고 생각하는 작업을 실행하도록 예약합니다. 기계가 동시에 수행하는 다른 작업에 따라 여러 CPU 코어 사이를 앞뒤로 이동할 수도 있는 작업입니다.

이에 대한 실질적인 결과는 프로그램의 인스턴스 5개를 실행하면가능한5개의 독립적인 CPU에서 실행되지만 보장되지는 않습니다.~ 할 것이다별도의 CPU에서 실행됩니다. 각 개별 프로세스가 CPU 용량의 20% 미만을 사용하는 경우 5개 프로세스가 모두 동일한 프로세서에서 실행될 수도 있습니다(가능성은 낮지만).

더 넓은 상황을 해결하기 위해 많은 파일을 처리하고 적은 양의 CPU 성능만 사용하는 프로그램이 있는 경우 병목 현상은 디스크 I/O 용량일 가능성이 높습니다. 이 경우 속도를 높이려면 더 빠른 디스크(또는 동일한 데이터를 반복적으로 읽는 경우 더 큰 디스크 캐시)가 필요하며 여러 프로세스와 CPU에 걸쳐 병렬화하는 것이 실제로 가능합니다.줄이다디스크가 첫 번째 인스턴스에 대한 입력 파일 읽기와 각 프로세스에 대한 추가 파일 읽기 사이를 전환하는 데 시간을 소비하도록 하여 성능을 향상시킵니다.

디스크 I/O로 인해 병목 현상이 발생하는지 테스트하는 빠르고 쉬운 방법은 cat file_1 file_2 file_3... >/dev/null( file_1여기서 매체는 프로그램에서 처리하는 모든 파일의 목록임) 파일을 읽는 데 걸리는 시간(처리를 수행하지 않고)과 시간을 비교하는 것입니다. 처리하는 데 시간이 걸립니다.

답변2

여러 프로세스를 실행할 때마다 해당 프로세스는 서로 다른 코어에서 실행될 수 있습니다. 단일 프로세스라도 초당 여러 번 한 코어에서 다른 코어로 마이그레이션할 수 있습니다. 이는 프로세스 내의 개별 스레드에도 적용됩니다. 커널은 항상 가능한 한 많은 스레드를 병렬로 실행하려고 시도합니다. 예를 들어 코어가 4개 있고 현재 CPU 시간이 필요한 스레드가 3개라면 3개의 코어가 사용 중입니다. 6개의 스레드에 CPU 시간이 필요한 경우 4개의 코어가 모두 사용 중이고 2개의 스레드가 차례를 기다립니다.

다른 쉘이나 다른 화면 창에서 프로그램을 시작해도 프로그램 예약 방법에는 영향을 미치지 않습니다. 두 번째 코드 조각에서 프로그램이 병렬로 실행되는 이유는 각 호출이 screen인스턴스를 시작 myprogram.sh하고 인스턴스가 종료될 때까지 기다리지 않기 때문입니다. 화면을 사용하지 않고도 동일한 작업을 수행할 수 있습니다. &쉘의 연산자를 사용하여 백그라운드에서 프로그램을 실행하면 됩니다. 즉, 프로그램을 시작하고 프로그램이 끝날 때까지 기다리지 않고 즉시 스크립트의 다음 명령으로 이동합니다.

for input in "${inputs[@]}"
do
  .<my-program.sh> --input "$input" &
done

모든 달리기를 동시에 시작하는 것이 반드시 가장 빠른 방법은 아닙니다. 프로그램이 사용하는 리소스에 따라 다릅니다. 프로그램이 CPU 시간을 사용하고 입출력을 많이 하지 않는 경우에는 코어 수만큼 인스턴스를 실행하여 최상의 결과를 얻을 수 있습니다. 프로그램이 많은 메모리를 사용하는 경우 메모리에 맞는 인스턴스만 실행하세요. 머신이 교체해야 하거나 디스크 캐시 공간이 충분하지 않으면 실행 속도가 훨씬 느려집니다. 프로그램이 I/O 집약적이라면 병목 현상을 일으키는 I/O 대역폭(네트워크, 디스크...)이 포화되지 않도록 하십시오.

특정 개수의 프로그램 인스턴스를 병렬로 실행하는 데 도움이 되는 도구가 있습니다. 당신은 그것을 사용할 수 있습니다xargs:

printf '%s\000' "${inputs[@]}" | xargs -0 -L 1 -P 4 myprogram.sh 

make프로그램을 병렬로 실행하는 것도 가능합니다. 다음 파일을 호출합니다 Makefile(줄 시작 부분의 8개 공백을 탭으로 바꿉니다).

all = $(patsubst %.in,%.out,$(wildcard *.in))
%.out: %.in
        myprogram.sh --input $< --output $@

Run은 모든 파일에 대해 실행되고 make -j4 all해당 파일을 생성하며 최대 4개의 인스턴스를 병렬로 실행합니다.myprogram.sh.in.out

더 복잡한 시나리오의 경우 설치해야 할 수도 있습니다.GNU 병렬.

관련 정보