Saya menggunakan xargs
untuk memanggil skrip python untuk memproses sekitar 30 juta file kecil. Saya berharap dapat digunakan xargs
untuk 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.py
akan 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 40
tidak 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?
sumber
xargs -P
dan>
terbuka untuk kondisi balapan karena masalah setengah-line gnu.org/software/parallel/… Menggunakan GNU Parallel sebagai gantinya tidak akan memiliki masalah itu.Jawaban:
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:
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
-P
untuk 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.sumber
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.
sumber
Seperti yang dikatakan orang lain, periksa apakah Anda terikat I / O. Juga, halaman manual xargs menyarankan penggunaan
-n
dengan-P
, Anda tidak menyebutkan jumlahConvert.py
proses 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).
sumber