memperbaiki penggunaan paralel xargs

9

Saya menggunakan xargsuntuk memanggil skrip python untuk memproses sekitar 30 juta file kecil. Saya berharap dapat digunakan xargsuntuk memparalelkan proses. Perintah yang saya gunakan adalah:

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

Pada dasarnya, Convert.pyakan membaca dalam file json kecil (4kb), melakukan pemrosesan dan menulis ke file 4kb lain. Saya menjalankan server dengan 40 core CPU. Dan tidak ada proses intensif CPU lainnya yang berjalan di server ini.

Dengan memantau htop (btw, apakah ada cara lain yang baik untuk memantau kinerja CPU?), Saya menemukan itu -P 40tidak secepat yang diharapkan. Terkadang semua core akan membeku dan berkurang hampir nol selama 3-4 detik, kemudian akan pulih hingga 60-70%. Lalu saya mencoba untuk mengurangi jumlah proses paralel -P 20-30, tetapi masih belum terlalu cepat. Tingkah laku yang ideal harus linear-speed. Adakah saran untuk penggunaan paralel xargs?

Yan Zhu
sumber
6
Anda kemungkinan besar terkena I / O: Sistem tidak dapat membaca file dengan cukup cepat. Coba mulai lebih dari 40: Dengan cara ini akan baik-baik saja jika beberapa proses harus menunggu untuk I / O.
Ole Tange
Jenis pemrosesan apa yang dilakukan skrip? Adakah basis data / jaringan / io yang terlibat? Berapa lama itu berjalan?
Fox
1
Saya kedua @OleTange. Itu adalah perilaku yang diharapkan jika Anda menjalankan proses sebanyak yang Anda miliki core dan tugas Anda terikat IO. Pertama core akan menunggu di IO untuk tugas mereka (tidur), kemudian mereka akan memproses, dan kemudian ulangi. Jika Anda menambahkan lebih banyak proses, maka proses tambahan yang saat ini tidak berjalan pada inti fisik akan memulai operasi IO paralel, yang akan, ketika selesai, menghilangkan atau setidaknya mengurangi periode tidur pada inti Anda.
PSkocik
1- Apakah Anda telah mengaktifkan hipertensi? 2- dalam apa yang Anda miliki di sana, log.txt sebenarnya ditimpa dengan setiap panggilan untuk convert.py ... tidak yakin apakah ini perilaku yang dimaksudkan atau tidak.
Bichoy
xargs -Pdan >terbuka untuk kondisi balapan karena masalah setengah-line gnu.org/software/parallel/… Menggunakan GNU Parallel sebagai gantinya tidak akan memiliki masalah itu.
Ole Tange

Jawaban:

4

Saya berani bertaruh bahwa masalah Anda adalah python . Anda tidak mengatakan jenis pemrosesan apa yang sedang dilakukan pada setiap file, tetapi dengan asumsi Anda hanya melakukan pemrosesan dalam memori data, waktu yang berjalan akan didominasi oleh memulai 30 juta mesin virtual python (juru bahasa).

Jika Anda dapat merestrukturisasi program python Anda untuk mengambil daftar file, bukan hanya satu, Anda akan mendapatkan peningkatan besar dalam kinerja. Anda masih dapat menggunakan xargs untuk lebih meningkatkan kinerja. Misalnya, 40 proses, masing-masing memproses 1000 file:

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

Ini bukan untuk mengatakan bahwa python adalah bahasa yang buruk / lambat; hanya saja tidak dioptimalkan untuk waktu startup. Anda akan melihat ini dengan bahasa berbasis mesin virtual atau ditafsirkan. Java, misalnya, akan lebih buruk lagi. Jika program Anda ditulis dalam C, masih ada biaya untuk memulai proses sistem operasi terpisah untuk menangani setiap file, tetapi itu akan jauh lebih sedikit.

Dari sana Anda dapat bermain-main -Puntuk melihat apakah Anda dapat memeras sedikit lebih banyak kecepatan, mungkin dengan meningkatkan jumlah proses untuk mengambil keuntungan dari prosesor idle saat data sedang dibaca / ditulis.

James Scriven
sumber
1

Jadi pertama-tama, pertimbangkan kendala:

Apa kendala pada setiap pekerjaan? Jika I / O Anda mungkin bisa lolos dengan beberapa pekerjaan per inti CPU sampai Anda mencapai batas I / O, tetapi jika itu CPU intensif, itu akan lebih buruk daripada sia-sia menjalankan lebih banyak pekerjaan secara bersamaan daripada Anda memiliki core CPU.

Pemahaman saya tentang hal-hal ini adalah bahwa GNU Parallel akan memberi Anda kontrol yang lebih baik atas antrian pekerjaan, dll.

Lihat GNU parallel vs & (maksud saya latar belakang) vs xargs -P untuk penjelasan lebih rinci tentang bagaimana keduanya berbeda.

Stephen
sumber
0

Seperti yang dikatakan orang lain, periksa apakah Anda terikat I / O. Juga, halaman manual xargs menyarankan penggunaan -ndengan -P, Anda tidak menyebutkan jumlah Convert.pyproses yang Anda lihat berjalan secara paralel.

Sebagai saran, jika Anda terikat I / O, Anda dapat mencoba menggunakan perangkat blok SSD, atau mencoba melakukan pemrosesan dalam tmpfs (tentu saja, dalam hal ini Anda harus memeriksa memori yang cukup, menghindari pertukaran karena tmpfs tekanan (saya pikir), dan overhead menyalin data itu di tempat pertama).

spuk
sumber