올바른 xargs 병렬 사용법


9

xargs약 3 천만 개의 작은 파일을 처리하기 위해 파이썬 스크립트를 호출하는 데 사용 하고 있습니다. xargs프로세스를 병렬화하는 데 사용 하고 싶습니다 . 내가 사용하는 명령은 다음과 같습니다

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

기본적으로 Convert.py작은 json 파일 (4kb) 을 읽고 처리하고 다른 4kb 파일에 씁니다. CPU 코어가 40 개인 서버에서 실행 중입니다. 그리고이 서버에서 다른 CPU 집약적 프로세스가 실행되고 있지 않습니다.

htop (btw, CPU 성능을 모니터링하는 다른 좋은 방법이 있습니까?)을 모니터링하면 -P 40예상만큼 빠르지 않습니다. 때로는 모든 코어가 3-4 초 동안 얼고 거의 0으로 감소한 다음 60-70 %로 복구됩니다. 그런 다음 병렬 프로세스 수를로 줄이려고 시도 -P 20-30했지만 여전히 빠르지는 않습니다. 이상적인 동작은 선형 속도 향상이어야합니다. xargs의 병렬 사용에 대한 제안?


6
I / O가 가장 많이 발생했습니다. 시스템이 파일을 충분히 빨리 읽을 수 없습니다. 40 개 이상을 시작해보십시오. 이렇게하면 일부 프로세스가 I / O를 기다려야하는 경우에 좋습니다.
Ole Tange

스크립트는 어떤 종류의 처리를합니까? 관련된 데이터베이스 / 네트워크 / IO? 얼마나 오래 걸립니까?
Fox

1
나는 두 번째 @OleTange. 코어 수만큼 프로세스를 실행하고 작업이 IO 바인딩 된 경우 예상되는 동작입니다. 먼저 코어는 작업을 위해 IO를 기다린 후 (슬립) 처리 한 다음 반복합니다. 더 많은 프로세스를 추가하면 현재 물리적 코어에서 실행되고 있지 않은 추가 프로세스가 병렬 IO 작업을 시작하여 완료되면 코어의 절전 기간을 제거하거나 최소한 줄일 수 있습니다.
PSkocik

1- 하이퍼 스레딩이 활성화되어 있습니까? 2- 당신이 거기에있는 것에서, log.txt는 실제로 convert.py에 대한 각 호출로 덮어 쓰여집니다 ... 이것이 의도 된 동작인지 아닌지 확실하지 않습니다.
Bichoy

xargs -P하고 >있기 때문에 하프 라인 문제의 경쟁 조건에 대한 개방되어 gnu.org/software/parallel/... GNU는 그런 문제가되지 않습니다 대신 병렬 사용.
Ole Tange

답변:


4

나는 당신의 문제가 파이썬 이라고 기꺼이 내기 것입니다 . 각 파일에 대해 어떤 종류의 처리가 수행되고 있는지 말하지 않았지만 메모리의 데이터 처리 만 수행한다고 가정하면 실행 시간은 3 천만 개의 파이썬 가상 머신 (통역사)을 시작하여 지배적입니다.

파이썬 프로그램을 재구성하여 하나의 파일 대신 파일 목록을 가져 오면 성능이 크게 향상됩니다. 그런 다음 여전히 xargs를 사용하여 성능을 더욱 향상시킬 수 있습니다. 예를 들어, 각각 1000 개의 파일을 처리하는 40 개의 프로세스 :

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

파이썬이 나쁜 / 느린 언어라는 말은 아닙니다. 시작 시간에 최적화되지 않았습니다. 가상 머신 기반 또는 해석 언어로이를 볼 수 있습니다. 예를 들어 자바는 더 나빠질 것이다. 프로그램이 C로 작성된 경우에도 각 파일을 처리하기 위해 별도의 운영 체제 프로세스를 시작하는 비용이 있지만 훨씬 적습니다.

거기에서 -P데이터를 읽거나 쓰는 동안 유휴 프로세서를 활용하기 위해 프로세스 수를 늘림으로써 속도를 조금 더 높일 수 있는지 확인하기 위해 바이올린 을 사용할 수 있습니다.


1

먼저 제약 조건을 고려하십시오.

각 직업에 대한 제약은 무엇입니까? 그것이 내가이 있다면 / O 작업을 수행 할 수 있습니다 아마 당신은 I / O의 한계를 칠 때까지 CPU 코어까지 당 여러 작업으로 도망 만의 CPU를 많이하는 경우, 그 동시에 사용하면 CPU 코어가보다 의미가 실행 더 많은 일자리보다 더 될 것이다.

이 점에 대한 나의 이해는 GNU Parallel 이 작업 대기열 등을보다 잘 제어 할 수 있다는 것입니다 .

참조 xargs를가 -P 대 및 (I 평균 배경) 대 GNU 평행을 두 다른 방법에 대한 자세한 설명.


0

다른 사람들이 말했듯이 I / O 바인딩인지 확인하십시오. 또한 xargs의 man 페이지는 -nwith 사용 을 제안 하며 병렬로 실행되는 프로세스 -P수는 언급하지 않습니다 Convert.py.

제안으로, I / O 바인딩 인 경우 SSD 블록 장치를 사용하거나 tmpfs에서 처리를 시도 할 수 있습니다 (물론 tmpfs로 인한 스왑을 피하면서 충분한 메모리를 확인해야합니다) 압력 (제 생각에)과 데이터를 처음으로 복사하는 오버 헤드).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.