Thực thi động

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

Thực thi động là một tính năng trong Bazel kể từ phiên bản 0.21, trong đó quá trình thực thi cục bộ và từ xa của cùng một hành động được bắt đầu song song, sử dụng đầu ra của nhánh đầu tiên kết thúc, huỷ nhánh khác. Công cụ này kết hợp sức mạnh thực thi và/hoặc bộ nhớ đệm dùng chung lớn của một hệ thống xây dựng từ xa với độ trễ thấp của quá trình thực thi cục bộ, mang lại những tính năng ưu việt nhất của cả hai loại để tạo các bản dựng sạch và tăng dần.

Trang này mô tả cách bật, điều chỉnh và gỡ lỗi thực thi động. Nếu bạn đã thiết lập cả thực thi cục bộ và từ xa và cố gắng điều chỉnh chế độ cài đặt Bazel để đạt hiệu suất tốt hơn, thì trang này là dành cho bạn. Nếu bạn chưa thiết lập tính năng thực thi từ xa, trước tiên, hãy chuyển đến phần Tổng quan về việc thực thi từ xa của Bazel.

Bật tính năng thực thi động?

Mô-đun thực thi động là một phần của Bazel, nhưng để sử dụng tính năng thực thi động, bạn phải có khả năng biên dịch cục bộ và từ xa từ cùng một cách thiết lập Bazel.

Để bật mô-đun thực thi động, hãy truyền cờ --internal_spawn_scheduler cho Bazel. Thao tác này sẽ thêm một chiến lược thực thi mới có tên là dynamic. Bây giờ, bạn có thể sử dụng phần này làm chiến lược cho các cấu trúc phần mềm bạn muốn chạy động, chẳng hạn như --strategy=Javac=dynamic. Hãy xem phần tiếp theo để biết cách chọn nội dung nào để bật tính năng thực thi động.

Đối với mọi ghi nhớ bằng cách sử dụng chiến lược động, các chiến lược thực thi từ xa sẽ được lấy từ cờ --dynamic_remote_strategy và các chiến lược cục bộ từ cờ --dynamic_local_strategy. Việc truyền --dynamic_local_strategy=worker,sandboxed sẽ đặt giá trị mặc định cho nhánh thực thi động cục bộ để thử với các worker hoặc thực thi trong hộp cát theo thứ tự đó. Việc truyền --dynamic_local_strategy=Javac=worker sẽ chỉ ghi đè giá trị mặc định cho phương thức ghi nhớ Java. Phiên bản từ xa cũng hoạt động theo cách tương tự. Bạn có thể chỉ định cả hai cờ nhiều lần. Nếu không thể thực thi một thao tác cục bộ, thì thao tác đó sẽ được thực thi từ xa như bình thường và ngược lại.

Nếu hệ thống từ xa của bạn có bộ nhớ đệm, cờ --dynamic_local_execution_delay sẽ thêm độ trễ tính bằng mili giây vào quá trình thực thi cục bộ sau khi hệ thống từ xa cho biết đã xảy ra lượt truy cập vào bộ nhớ đệm. Điều này giúp tránh việc chạy quá trình thực thi cục bộ khi có thể xảy ra thêm nhiều lượt truy cập vào bộ nhớ đệm. Giá trị mặc định là 1000 mili giây, nhưng bạn nên điều chỉnh sao cho dài hơn một chút so với thời gian thông thường các lượt truy cập vào bộ nhớ đệm. Thời gian thực tế phụ thuộc vào cả hệ thống từ xa và thời gian trọn vòng. Thông thường, giá trị giống nhau cho tất cả người dùng hệ thống từ xa nhất định, trừ khi một số người dùng đủ xa để thêm độ trễ trọn vòng. Bạn có thể sử dụng các tính năng phân tích hiệu suất củaazel để xem thời lượng thông thường của các lượt truy cập vào bộ nhớ đệm.

Bạn có thể sử dụng tính năng thực thi động với chiến lược hộp cát cục bộ cũng như với các trình chạy cố định. Trình chạy ổn định sẽ tự động chạy với hộp cát khi được sử dụng với quá trình thực thi động và không thể sử dụng Worker đa nhân. Trên hệ thống Darwin và Windows, chiến lược hộp cát có thể bị chậm; bạn có thể chuyển --reuse_sandbox_directories để giảm chi phí tạo hộp cát trên các hệ thống này.

Tính năng thực thi động cũng có thể chạy với chiến lược standalone, mặc dù chiến lược standalone phải lấy khoá đầu ra khi bắt đầu thực thi, nên chiến lược này sẽ chặn hoàn toàn chiến lược từ xa trước. Cờ --experimental_local_lockfree_output kích hoạt sự cố này bằng cách cho phép quá trình thực thi cục bộ ghi trực tiếp vào kết quả, nhưng bị huỷ thực thi từ xa nếu hoàn tất trước.

Nếu một trong các nhánh thực thi động kết thúc trước nhưng không thành công, thì toàn bộ hành động sẽ không thành công. Đây là một lựa chọn có chủ đích để ngăn sự khác biệt giữa quá trình thực thi cục bộ và quá trình thực thi từ xa.

Để biết thêm thông tin về cách thức hoạt động của tính năng thực thi động và khoá, hãy xem các bài đăng trên blog tuyệt vời của Julio

Khi nào tôi nên sử dụng tính năng thực thi động?

Thực thi động yêu cầu một số hình thức của hệ thống thực thi từ xa. Hiện tại, bạn không thể sử dụng hệ thống từ xa chỉ có bộ nhớ đệm, vì thiếu một bộ nhớ đệm sẽ bị coi là một hành động không thành công.

Không phải tất cả các loại thao tác đều phù hợp để thực thi từ xa. Đề xuất phù hợp nhất là những quá trình vốn đã nhanh hơn cục bộ, chẳng hạn như thông qua việc sử dụng worker kéo dài, hoặc các worker chạy đủ nhanh để mức hao tổn của quá trình thực thi từ xa chiếm ưu thế hơn thời gian thực thi. Vì mỗi hành động được thực thi cục bộ sẽ khoá một số tài nguyên CPU và bộ nhớ, nên việc thực hiện những hành động không thuộc các danh mục đó sẽ chỉ trì hoãn việc thực thi cho những danh mục đó.

Kể từ bản phát hành 5.0.0-pre.20210708.4, tính năng lập hồ sơ hiệu suất chứa dữ liệu về quá trình thực thi worker, bao gồm cả thời gian dành cho việc hoàn thành một yêu cầu công việc sau khi thua trong một cuộc đua thực thi linh động. Nếu thấy các luồng trình thực thi động (worker thread) dành nhiều thời gian để thu nạp tài nguyên hoặc có nhiều thời gian trong async-worker-finish, thì có thể bạn sẽ có một số thao tác cục bộ bị chậm.

Lập hồ sơ dữ liệu với hiệu suất thực thi động kém

Trong hồ sơ trên, sử dụng 8 trình thực thi Java, chúng ta thấy nhiều trình chạy Java đã thua các cuộc đua và hoàn thành công việc trên các luồng async-worker-finish. Việc này là do một bộ nhớ không phải trình chạy dịch vụ (workermemonic) lấy đủ tài nguyên để trì hoãn các worker.

Lập hồ sơ dữ liệu với hiệu suất thực thi động tốt hơn

Khi chỉ chạy Javac với tính năng thực thi động, chỉ khoảng một nửa số trình chạy bắt đầu kết thúc cuộc đua sau khi bắt đầu công việc.

Cờ --experimental_spawn_scheduler được đề xuất trước đó không được dùng nữa. Trình này sẽ bật tính năng thực thi động và đặt dynamic làm chiến lược mặc định cho tất cả các đối tượng giao hưởng, thường dẫn đến những vấn đề này.

Khắc phục sự cố

Các vấn đề với việc thực thi động có thể phức tạp và khó gỡ lỗi, vì các vấn đề này chỉ có thể xuất hiện trong một số tổ hợp cụ thể khi thực thi cục bộ và từ xa. --debug_spawn_scheduler sẽ thêm đầu ra bổ sung từ hệ thống thực thi động, có thể giúp gỡ lỗi những vấn đề này. Bạn cũng có thể điều chỉnh cờ --dynamic_local_execution_delay và số lượng công việc từ xa so với công việc địa phương để dễ dàng tái hiện các vấn đề.

Nếu bạn gặp sự cố với quá trình thực thi động bằng cách sử dụng chiến lược standalone, hãy thử chạy mà không cần --experimental_local_lockfree_output hoặc chạy các thao tác cục bộ trong hộp cát. Thao tác này có thể làm chậm bản dựng một chút (xem ở trên nếu bạn đang sử dụng Mac hoặc Windows), nhưng xóa một số nguyên nhân có thể gây ra lỗi.