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

Báo cáo sự cố Xem nguồn

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

Lời gọi Bazel liên quan đến một số 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ột máy chủ Bazel cho từng cơ sở đầu ra riêng biệt. Máy chủ Bazel thường hoạt động ổn định 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 đó 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 thu được sẽ đượ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 thi thao tác hoặc có thể tắt các thao tác để thực thi từ xa nếu đã thiết lập chế độ này. Kết quả của quá trình thực thi thao tác cũng được lưu vào bộ nhớ đệm, cụ thể là trong bộ nhớ đệm thao tác (hoặc bộ nhớ đệm thực thi, có thể là bộ nhớ đệm 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ó sẵn trong cây đầu ra.

Chạy Bazel lặp lại

Trong một quy trình làm việc thông thường dành cho nhà phát triển, người dùng thường phải tạo (hoặc chạy) một đoạn mã nhiều lần, thường ở 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 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 phải có mức hao tổn càng thấp càng tốt so với thao tác cơ bản, lặp lại (ví dụ: gọi trình biên dịch hoặc thực thi kiểm thử).

Vì lý do này, chúng ta hãy xem 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. Một khoảng thời gian đáng kể chỉ dành cho các giai đoạn tải và phân tích của thời gian chạy nguội (tức là chạy ngay sau khi máy chủ Bazel 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ụ: đối với bản phát hành chính thức), chi phí này có thể chịu được, nhưng để xây dựng cùng một mục tiêu nhiều lần, điều quan trọng là chi phí này phải được khấu trừ và không lặp lại cho mỗi lệnh gọi.

Bộ nhớ đệm phân tích khá biến động. Trước hết, đây là một phần của trạng thái trong quá trình của máy chủ Bazel, vì vậy, khi bị mất máy chủ, bộ nhớ đệm sẽ bị mất. Tuy nhiên, bộ nhớ đệm cũng rất dễ vô hiệu hoá: chẳng hạn như nhiều cờ dòng lệnh bazel 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ể định 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 hiệu quả cũng giúp tăng hiệu suất bản dựng. Bộ nhớ đệm thực thi có thể được lưu trữ cục bộ trên ổ đĩa hoặc từ xa. Bộ nhớ đệm có thể được chia sẻ giữa các máy chủ Bazel và thực sự giữa các nhà phát triển.

Tránh huỷ bộ nhớ đệm phân tích

Bazel sẽ in 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 sử dụng một trong hai cách sau trong quá trình sử dụng lặp lại:

  • Hãy chú ý đến việc thay đổi cờ bazel ở 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 sẽ khiến mỗi lệnh huỷ bộ nhớ đệm phân tích của lệnh còn lại. Nhìn chung, hãy cố gắng sử dụng một bộ cờ cố định trong suốt một quy trình công việc cụ thể.

  • Nếu bạn mất máy chủ Bazel, bộ nhớ đệm phân tích sẽ bị mất. Máy chủ Bazel có thời gian không hoạt động có thể định cấu hình, sau đó 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ờ khởi động thay đổi, vì vậy, một lần nữa, hãy tránh thay đổi các cờ đó nếu có thể.

  • Lưu ý rằng máy chủ Bazel sẽ bị tắt nếu bạn nhấn tổ hợp phím Ctrl-C nhiều lần trong khi Bazel đang chạy. Thật muốn 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 linh hoạt.

  • Nếu muốn sử dụng nhiều nhóm 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 sẽ có máy chủ Bazel riêng.

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