sử dụng song song xargs


9

Tôi đang sử dụng xargsđể gọi một kịch bản python để xử lý khoảng 30 triệu tệp nhỏ. Tôi hy vọng sẽ sử dụng xargsđể song song hóa quá trình. Lệnh tôi đang sử dụng là:

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

Về cơ bản, Convert.pysẽ đọc trong một tệp json nhỏ (4kb), thực hiện một số xử lý và ghi vào một tệp 4kb khác. Tôi đang chạy trên một máy chủ với 40 lõi CPU. Và không có quá trình cường độ CPU nào khác đang chạy trên máy chủ này.

Bằng cách theo dõi htop (btw, có cách nào khác tốt để theo dõi hiệu suất CPU không?), Tôi thấy điều đó -P 40không nhanh như mong đợi. Đôi khi tất cả các lõi sẽ đóng băng và giảm gần như bằng 0 trong 3-4 giây, sau đó sẽ phục hồi đến 60-70%. Sau đó, tôi cố gắng giảm số lượng các quá trình song song xuống -P 20-30, nhưng nó vẫn không nhanh lắm. Các hành vi lý tưởng nên được tăng tốc tuyến tính. Bất kỳ đề xuất cho việc sử dụng song song của xargs?


6
Bạn rất có thể bị tấn công bởi I / O: Hệ thống không thể đọc các tệp đủ nhanh. Hãy thử bắt đầu hơn 40: Cách này sẽ ổn nếu một số quy trình phải chờ I / O.
Ole Tange

Kịch bản xử lý kiểu gì? Bất kỳ cơ sở dữ liệu / mạng / io liên quan? Nó chạy trong bao lâu?
Fox

1
Tôi thứ hai @OleTange. Đó là hành vi dự kiến ​​nếu bạn chạy nhiều tiến trình như bạn có lõi và nhiệm vụ của bạn bị ràng buộc IO. Đầu tiên, các lõi sẽ đợi IO cho nhiệm vụ của chúng (ngủ), sau đó chúng sẽ xử lý và sau đó lặp lại. Nếu bạn thêm nhiều quy trình, thì các quy trình bổ sung hiện không chạy trên lõi vật lý sẽ khởi động các hoạt động IO song song, khi kết thúc sẽ loại bỏ hoặc ít nhất là giảm thời gian ngủ trên lõi của bạn.
PSkocik

1- Bạn có bật siêu phân luồng không? 2- trong những gì bạn có trên đó, log.txt thực sự được ghi đè với mỗi lệnh gọi tới convert.py ... không chắc đây có phải là hành vi dự định hay không.
Bíchoy

xargs -P>đang mở ra cho các điều kiện chủng tộc vì vấn đề nửa dòng gnu.org/software/pool/ khuyên Sử dụng GNU Parallel thay vào đó sẽ không gặp phải vấn đề đó.
Ole Tange

Câu trả lời:


4

Tôi sẵn sàng đặt cược rằng vấn đề của bạn là trăn . Bạn không nói loại xử lý nào đang được thực hiện trên mỗi tệp, nhưng giả sử bạn chỉ đang xử lý dữ liệu trong bộ nhớ, thời gian chạy sẽ bị chi phối bằng cách khởi động 30 triệu máy ảo python (thông dịch viên).

Nếu bạn có thể cấu trúc lại chương trình python của mình để lấy danh sách các tệp, thay vì chỉ một tệp, bạn sẽ có một sự cải thiện lớn về hiệu suất. Sau đó, bạn vẫn có thể sử dụng xargs để cải thiện hiệu suất hơn nữa. Ví dụ: 40 quy trình, mỗi quy trình xử lý 1000 tệp:

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

Điều này không có nghĩa là python là một ngôn ngữ xấu / chậm; nó chỉ không được tối ưu hóa cho thời gian khởi động. Bạn sẽ thấy điều này với bất kỳ ngôn ngữ dựa trên máy ảo hoặc diễn giải. Java, ví dụ, sẽ còn tồi tệ hơn. Nếu chương trình của bạn được viết bằng C, vẫn sẽ có chi phí bắt đầu một quy trình hệ điều hành riêng để xử lý từng tệp, nhưng sẽ ít hơn nhiều.

Từ đó, bạn có thể -Ptìm hiểu xem liệu bạn có thể tăng tốc nhanh hơn một chút không, có lẽ bằng cách tăng số lượng quy trình để tận dụng các bộ xử lý nhàn rỗi trong khi dữ liệu đang được đọc / ghi.


1

Vì vậy, trước tiên, hãy xem xét các ràng buộc:

Các ràng buộc trên mỗi công việc là gì? Nếu đó là I / O, bạn có thể thoát khỏi nhiều công việc trên mỗi lõi CPU cho đến khi bạn đạt đến giới hạn của I / O, nhưng nếu CPU quá nặng, nó sẽ tệ hơn khi chạy nhiều công việc đồng thời hơn so với lõi CPU.

Sự hiểu biết của tôi về những điều này là GNU Parallel sẽ cho phép bạn kiểm soát tốt hơn hàng đợi công việc, v.v.

Xem GNU song song vs & (ý tôi là nền) so với xargs -P để được giải thích chi tiết hơn về cách hai cái khác nhau.


0

Như những người khác đã nói, hãy kiểm tra xem bạn có bị ràng buộc I / O không. Ngoài ra, trang man của xargs đề nghị sử dụng -nvới -P, bạn không đề cập đến số lượng Convert.pyquy trình bạn thấy chạy song song.

Theo đề xuất, nếu bạn bị ràng buộc I / O, bạn có thể thử sử dụng thiết bị chặn SSD hoặc thử xử lý trong một tmpfs (tất nhiên, trong trường hợp này, bạn nên kiểm tra đủ bộ nhớ, tránh trao đổi do tmpfs áp lực (tôi nghĩ) và chi phí sao chép dữ liệu vào vị trí đầu tiên).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.