правильне xargs паралельне використання


9

Я використовую xargsдля виклику сценарію python для обробки близько 30 мільйонів невеликих файлів. Я сподіваюся використовувати xargsдля паралелізації процесу. Я використовую команду:

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

В основному, Convert.pyбуде читати у невеликому файлі json (4kb), виконати деяку обробку та записати в інший 4kb файл. Я працюю на сервері з 40 ядрами процесора. І жоден інший інтенсивний процесорний процес не працює на цьому сервері.

Відслідковуючи htop (btw, чи є якийсь хороший спосіб контролювати продуктивність процесора?), Я вважаю, що -P 40це не так швидко, як очікувалося. Іноді всі ядра замерзнуть і зменшаться майже до нуля протягом 3-4 секунд, тоді відновиться до 60-70%. Потім я намагаюся зменшити кількість паралельних процесів до -P 20-30, але це все ще не дуже швидко. Ідеальна поведінка повинна бути лінійним прискоренням. Будь-які пропозиції щодо паралельного використання xargs?


6
Вас, швидше за все, потрапив ввід / вивід: система не може прочитати файли досить швидко. Спробуйте почати більше 40: Таким чином, це буде добре, якщо для деяких процесів доведеться чекати вводу-виводу.
Оле Танге

Яку обробку виконує сценарій? Будь-яка база даних / мережа / іо бере участь? Як довго він працює?
Фокс

1
Я другий @OleTange. Така очікувана поведінка, якщо ви запускаєте стільки процесів, скільки у вас є ядер, і ваші завдання пов'язані з IO. Спочатку сердечники будуть чекати на IO свого завдання (сну), потім вони оброблять, а потім повторюють. Якщо ви додасте більше процесів, то додаткові процеси, які зараз не працюють на фізичному ядрі, розпочали паралельні операції вводу-виводу, які, по закінченні, усунуть або принаймні скоротять періоди сну на ваших ядрах.
PSkocik

1- У вас увімкнена гіпертренінг? 2- у тому, що у вас там, log.txt насправді перезаписується при кожному виклику convert.py ... не впевнений, це призначена поведінка чи ні.
Бічо

xargs -Pі >відкривається для перегонових умов через напівлінійну проблему gnu.org/software/parallel/… Використання GNU Parallel замість цього не матиме такої проблеми.
Оле Танге

Відповіді:


4

Я б хотів зробити ставку, що ваша проблема - пітон . Ви не сказали, яка обробка робиться для кожного файлу, але припускаючи, що ви просто займаєтеся обробкою даних в пам'яті, час роботи буде домінувати, запустивши 30 мільйонів віртуальних машин python (інтерпретаторів).

Якщо ви зможете реструктурувати свою програму python, щоб взяти список файлів, а не лише один, ви отримаєте величезне покращення продуктивності. Потім ви можете використовувати xargs для подальшого підвищення продуктивності. Наприклад, 40 процесів, кожен обробляє 1000 файлів:

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

Це не означає, що python - це погана / повільна мова; він просто не оптимізований під час запуску. Ви побачите це на будь-якій віртуальній машинній або інтерпретованій мові. Ява, наприклад, був би ще гіршим. Якби ваша програма була написана на мові C, для запуску окремого процесу в операційній системі для обробки кожного файлу все ж були б кошти, але це було б набагато менше.

Звідти ви можете поспілкуватися, -Pщоб побачити, чи зможете вичавити трохи більше швидкості, можливо, збільшивши кількість процесів, щоб скористатися непрацездатними процесорами під час читання / запису даних.


1

Отже, по-перше, врахуйте обмеження:

Яке обмеження для кожної роботи? Якщо це введення / виведення, ви, ймовірно, можете піти з декількох завдань на ядро ​​центрального процесора до тих пір, поки ви не досягнете межі вводу / виводу, але якщо це буде процесор інтенсивним, його буде гірше, ніж безглуздо виконувати більше завдань одночасно, ніж у вас ядра CPU.

Я розумію ці речі, що GNU Parallel дасть вам кращий контроль над чергою робочих місць тощо.

Дивіться паралель GNU vs & (я маю на увазі фон) та xargs -P для більш детального пояснення того, як вони відрізняються.


0

Як говорили інші, перевірте, чи пов'язані ви вводу / виводу. Крім того, довідкова сторінка xargs пропонує використовувати -nз -P, ви не згадуєте кількість Convert.pyпроцесів, які ви бачите паралельно.

Як пропозиція, якщо ви пов'язані вводу / виводу, ви можете спробувати використовувати блок блоку SSD або спробувати виконати обробку в tmpfs (звичайно, у цьому випадку ви повинні перевірити достатню кількість пам'яті, уникаючи заміни через tmpfs тиск (я думаю) і накладні витрати на копіювання даних до нього в першу чергу).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.