Tối ưu hoá tốc độ lặp lại

Trang này mô tả cách tối ưu hoá hiệu suất bản dựng của Bazel khi chạy Bazel nhiều lần.

Trạng thái thời gian chạy của Bazel

Một lệnh gọi Bazel bao gồm nhiều phần tương tác.

  • Giao diện dòng lệnh (CLI) bazel là công cụ giao diện người dùng và nhận lệnh từ người dùng.

  • Công cụ CLI khởi động máy chủ Bazel cho mỗi cơ sở đầu ra riêng biệt. Máy chủ Bazel thường duy trì hoạt động, nhưng sẽ tắt sau một khoảng thời gian không hoạt động để không lãng phí tài nguyên.

  • Máy chủ Bazel thực hiện các bước tải và phân tích cho một lệnh nhất định (build, run, cquery, v.v.), trong đó, máy chủ này tạo các phần cần thiết của biểu đồ bản dựng trong bộ nhớ. Các cấu trúc dữ liệu kết quả được giữ lại trong máy chủ Bazel như một phần của bộ nhớ đệm phân tích.

  • Máy chủ Bazel cũng có thể thực hiện việc thực thi hành động hoặc gửi các hành động để thực thi từ xa nếu được thiết lập để thực hiện việc này. Kết quả của việc thực thi hành động cũng được lưu vào bộ nhớ đệm, cụ thể là trong bộ nhớ đệm hành động (hoặc bộ nhớ đệm thực thi, có thể là cục bộ hoặc từ xa và có thể được chia sẻ giữa các máy chủ Bazel).

  • Kết quả của lệnh gọi Bazel được cung cấp trong cây đầu ra.

Chạy Bazel theo vòng lặp

Trong quy trình làm việc điển hình của nhà phát triển, bạn thường xuyên xây dựng (hoặc chạy) một đoạn mã lặp đi lặp lại, thường với tần suất rất cao (ví dụ: để giải quyết một số lỗi biên dịch hoặc điều tra một bài kiểm thử không thành công). Trong trường hợp này, điều quan trọng là các lệnh gọi lặp lại của bazel có mức hao tổn càng ít càng tốt so với hành động lặp lại cơ bản (ví dụ: gọi trình biên dịch hoặc thực thi bài kiểm thử).

Xét trên góc độ này, chúng ta hãy xem xét lại trạng thái thời gian chạy của Bazel:

Bộ nhớ đệm phân tích là một phần dữ liệu quan trọng. Bạn có thể mất một khoảng thời gian đáng kể chỉ để thực hiện các giai đoạn tải và phân tích của một lần chạy nguội (tức là một lần chạy ngay sau khi máy chủ Bazel được khởi động hoặc khi bộ nhớ đệm phân tích bị loại bỏ). Đối với một bản dựng nguội thành công duy nhất (ví dụ: cho bản phát hành chính thức), chi phí này có thể chấp nhận được, nhưng đối với việc xây dựng lặp lại cùng một mục tiêu, điều quan trọng là chi phí này phải được phân bổ và không lặp lại trên mỗi lệnh gọi.

Bộ nhớ đệm phân tích khá dễ thay đổi. Trước hết, đây là một phần của trạng thái trong quy trình của máy chủ Bazel, vì vậy, việc mất máy chủ sẽ làm mất bộ nhớ đệm. Tuy nhiên, bộ nhớ đệm cũng rất dễ bị vô hiệu hoá: ví dụ: nhiều bazel cờ dòng lệnh khiến bộ nhớ đệm bị loại bỏ. Điều này là do nhiều cờ ảnh hưởng đến biểu đồ bản dựng (ví dụ: do các thuộc tính có thể cấu hình). Một số thay đổi về cờ cũng có thể khiến máy chủ Bazel khởi động lại (ví dụ: thay đổi các tuỳ chọn khởi động).

Bộ nhớ đệm thực thi tốt cũng có giá trị đối với hiệu suất bản dựng. Bạn có thể giữ bộ nhớ đệm thực thi cục bộ trên đĩahoặc từ xa. Bộ nhớ đệm có thể được chia sẻ giữa các máy chủ Bazel và thực sự là giữa các nhà phát triển.

Tránh loại bỏ bộ nhớ đệm phân tích

Bazel sẽ in một cảnh báo nếu bộ nhớ đệm phân tích bị loại bỏ hoặc máy chủ được khởi động lại. Bạn nên tránh một trong hai trường hợp này trong quá trình sử dụng lặp lại:

  • Hãy lưu ý đến việc thay đổi bazel cờ ở giữa quy trình làm việc lặp lại. Ví dụ: việc kết hợp bazel build -c opt với bazel cquery khiến mỗi lệnh loại bỏ bộ nhớ đệm phân tích của lệnh kia. Nói chung, hãy cố gắng sử dụng một tập hợp cờ cố định trong suốt thời gian của một quy trình làm việc cụ thể.

  • Việc mất máy chủ Bazel sẽ làm mất bộ nhớ đệm phân tích. Máy chủ Bazel có thời gian không hoạt động có thể định cấu hình, sau đó máy chủ sẽ tắt. Bạn có thể định cấu hình thời gian này thông qua tệp bazelrc cho phù hợp với nhu cầu của mình. Máy chủ cũng khởi động lại khi các cờ khởi động thay đổi, vì vậy, hãy tránh thay đổi các cờ đó nếu có thể.

  • Hãy lưu ý rằng máy chủ Bazel sẽ bị huỷ nếu bạn nhấn Ctrl-C nhiều lần trong khi Bazel đang chạy. Bạn có thể muốn cố gắng tiết kiệm thời gian bằng cách làm gián đoạn một bản dựng đang chạy không còn cần thiết nữa, nhưng chỉ nhấn Ctrl-C một lần để yêu cầu kết thúc lệnh gọi hiện tại một cách suôn sẻ.

  • Nếu muốn sử dụng nhiều tập hợp cờ từ cùng một không gian làm việc, bạn có thể sử dụng nhiều cơ sở đầu ra riêng biệt, được chuyển đổi bằng cờ --output_base. Mỗi cơ sở đầu ra có máy chủ Bazel riêng.

Để biến điều kiện này thành một lỗi thay vì một cảnh báo, bạn có thể sử dụng cờ --noallow_analysis_cache_discard (ra mắt trong Bazel 6.4.0)