Trình chạy đa năng (Tính năng thử nghiệm)

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo sự cố Xem nguồn

Trang này mô tả nhiều worker, cách viết quy tắc tương thích với multiplex và giải pháp cho một số giới hạn.

MultiplexWorker cho phép Bazel xử lý nhiều yêu cầu bằng một quy trình worker. Đối với các trình xử lý đa luồng, Bazel có thể sử dụng ít tài nguyên hơn để đạt được hiệu suất tương tự hoặc hiệu suất tốt hơn. Ví dụ: thay vì có một quy trình của mỗi trình chạy cho mỗi trình chạy, Bazel có thể có 4 trình chạy đa năng tương tác với cùng một quy trình trình chạy, sau đó có thể xử lý các yêu cầu song song. Đối với các ngôn ngữ như Java và Scala, điều này giúp tiết kiệm thời gian khởi động JVM và thời gian biên dịch JIT, và nói chung, tính năng này cho phép sử dụng một bộ nhớ đệm dùng chung giữa tất cả các worker có cùng loại.

Tổng quan

Có hai lớp giữa máy chủ Bazel và quy trình worker. Đối với một số đối tượng có thể chạy song song các quy trình, Bazel sẽ nhận được WorkerProxy từ nhóm worker. WorkerProxy chuyển tiếp các yêu cầu đến quá trình của trình chạy theo tuần tự cùng với request_id, quá trình này sẽ xử lý yêu cầu và gửi phản hồi cho WorkerMultiplexer. Khi nhận được phản hồi, WorkerMultiplexer sẽ phân tích cú pháp request_id rồi chuyển tiếp các phản hồi đó trở lại WorkerProxy chính xác. Cũng như với các worker không phải đa thành phần, tất cả quá trình giao tiếp đều được thực hiện qua phương thức chuẩn vào/ra chuẩn, nhưng công cụ không thể chỉ sử dụng stderr cho đầu ra hiển thị cho người dùng (xem bên dưới).

Mỗi trình chạy ứng dụng đều có một khóa. Bazel sử dụng mã băm của khoá (được tạo thành từ các biến môi trường, gốc thực thi và bản ghi nhớ) để xác định WorkerMultiplexer nào sẽ sử dụng. WorkerProxy sẽ giao tiếp với cùng một WorkerMultiplexer nếu có cùng mã băm. Do đó, giả sử các biến môi trường và gốc thực thi giống nhau trong một lệnh gọi Bazel, mỗi lệnh ghi nhớ duy nhất chỉ có thể có một WorkerMultiplexer và một quy trình worker. Tổng số trình chạy (bao gồm cả trình chạy thường xuyên và WorkerProxy) vẫn bị giới hạn bởi --worker_max_instances.

Viết các quy tắc tương thích với multiplex

Quy trình xử lý quy tắc phải là đa luồng (multi-thread) để tận dụng nhân viên đa thành phần. Protobuf cho phép một bộ quy tắc phân tích cú pháp một yêu cầu mặc dù có thể có nhiều yêu cầu chồng lên luồng. Bất cứ khi nào trình xử lý phân tích cú pháp một yêu cầu từ luồng, quy trình đó sẽ xử lý yêu cầu đó trong một chuỗi mới. Vì có nhiều luồng có thể hoàn thành và ghi vào luồng cùng một lúc, quá trình worker cần đảm bảo các phản hồi được viết nguyên tử (các thông báo không trùng nhau). Phản hồi phải chứa request_id của yêu cầu mà chúng đang xử lý.

Xử lý đầu ra multiplex

Trình chạy Multiplex cần cẩn thận hơn khi xử lý kết quả đầu ra so với singleplex worker. Mọi dữ liệu được gửi đến stderr sẽ được đưa vào một tệp nhật ký được chia sẻ giữa tất cả các WorkerProxy cùng loại, được xen kẽ ngẫu nhiên giữa các yêu cầu đồng thời. Mặc dù việc chuyển hướng stdout vào stderr là một ý tưởng hay, đừng thu thập kết quả đó vào trường output của WorkResponse, vì điều này có thể hiển thị cho người dùng các đoạn đầu ra bị cắt bớt. Nếu công cụ của bạn chỉ gửi đầu ra do người dùng điều hướng đến stdout hoặc stderr, bạn cần thay đổi hành vi đó trước khi có thể bật worker nhiều nhân.

Cho phép multiplex worker

Trình chạy công cụ Multiplex không được bật theo mặc định. Một bộ quy tắc có thể bật tính năng multix cho nhân viên bằng cách sử dụng thẻ supports-multiplex-workers trong execution_requirements của một hành động (giống như thẻ supports-workers, cho phép nhân viên thông thường). Như trong trường hợp khi sử dụng trình chạy thông thường, bạn cần chỉ định chiến lược của trình chạy ở cấp quy tắc (ví dụ: --strategy=[some_mnemonic]=worker) hoặc nói chung ở cấp chiến lược (ví dụ: --dynamic_local_strategy=worker,standalone). Không có cờ bổ sung nào là cần thiết và supports-multiplex-workers sẽ được ưu tiên hơn supports-workers nếu cả hai đều được đặt. Bạn có thể tắt tính năng multiplex worker trên toàn cục bằng cách chuyển --noexperimental_worker_multiplex.

Một bộ quy tắc nên sử dụng nhiều worker nếu có thể, để giảm áp lực bộ nhớ và cải thiện hiệu suất. Tuy nhiên, trình thực hiện đa thành phần hiện không tương thích với tính năng thực thi động trừ khi chúng triển khai hộp cát nhiều giá trị. Thay vào đó, việc cố gắng chạy các trình chạy đa kênh không có hộp cát sẽ được thực thi động sẽ tự động sử dụng các trình chạy singleplex hộp cát.

Hộp cát Multiplex

Hộp cát cho trình chạy (worker) có thể hoạt động trong hộp cát bằng cách thêm tính năng hỗ trợ rõ ràng cho trình chạy đó trong cách triển khai trình chạy. Mặc dù có thể thực hiện hộp cát trình chạy singleplex bằng cách chạy từng quy trình trình chạy trong hộp cát riêng, nhưng nhiều trình thực thi công việc (worker) chia sẻ thư mục hoạt động của quy trình giữa các yêu cầu song song. Để cho phép thực hiện thao tác hộp cát của nhiều worker, trình chạy này phải hỗ trợ việc đọc và ghi vào thư mục con được chỉ định trong mỗi yêu cầu, thay vì trực tiếp trong thư mục hoạt động.

Để hỗ trợ hộp cát multiplex, trình chạy này phải sử dụng trường sandbox_dir từ WorkRequest và dùng trường đó làm tiền tố cho tất cả các lượt đọc và ghi của tệp. Mặc dù các trường argumentsinputs không thay đổi từ yêu cầu không có hộp cát, nhưng dữ liệu nhập thực tế có liên quan đến sandbox_dir. Trình chạy này phải dịch đường dẫn tệp có trong argumentsinputs để đọc từ đường dẫn được sửa đổi này, đồng thời phải ghi tất cả kết quả liên quan đến sandbox_dir. Điều này bao gồm các đường dẫn như "." cũng như các đường dẫn tìm thấy trong các tệp được chỉ định trong các đối số (chẳng hạn như các đối số "argfile").

Sau khi một trình chạy hỗ trợ hộp cát multix, bộ quy tắc có thể khai báo chức năng hỗ trợ này bằng cách thêm supports-multiplex-sandboxing vào execution_requirements của một hành động. Sau đó, Bazel sẽ sử dụng hộp cát multiplex nếu cờ --experimental_worker_multiplex_sandboxing được truyền hoặc nếu worker này được sử dụng với tính năng thực thi động.

Các tệp worker của một worker nhiều hộp cát vẫn tương ứng với thư mục hoạt động của quy trình worker. Do đó, nếu một tệp được dùng để chạy worker và làm đầu vào, thì tệp đó phải được chỉ định làm đầu vào trong đối số tệp cờ cũng như trong tools, executable hoặc runfiles.