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

Báo cáo vấn đề Xem nguồn Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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ệnh gọi Bazel bao gồm 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ụ dòng lệnh khởi động một máy chủ Bazel cho mỗi cơ sở đầu ra riêng biệt. Máy chủ Bazel thường hoạt động liên tục, nhưng sẽ tắt sau một khoảng thời gian rảnh để 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 cụ thể (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 thu được đượ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 các lần 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 thông thường của nhà phát triển, thường thì bạn sẽ tạo (hoặc chạy) một đoạn mã nhiều lần, thường là 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 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 í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 kiểm thử).

Do đó, chúng ta sẽ 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 lượng thời gian đáng kể chỉ cho 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 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 (ví dụ: bản phát hành chính thức), chi phí này là chấp nhận được, nhưng để tạo 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ổ dần và không lặp lại trên mỗi lệnh gọi.

Bộ nhớ đệm phân tích khá biến động. Trước tiên, đây là một phần của trạng thái đang xử lý của máy chủ Bazel, vì vậy, nếu mất máy chủ thì bạn sẽ 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 cờ dòng lệnh bazel khiến bộ nhớ đệm bị loại bỏ. Lý do là vì 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 tốt cũng có giá trị đối với hiệu suất bản dựng. Bạn có thể lưu bộ nhớ đệm thực thi 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à giữa các nhà phát triển.

Tránh loại bỏ 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 những điều sau trong quá trình sử dụng lặp lại:

  • Hãy lưu ý thay đổi cờ bazel ở giữa quy trình 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 loại bỏ 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 tập hợp cờ cố định trong suốt thời gian của một quy trình công việc cụ thể.

  • Nếu mất máy chủ Bazel, bạn sẽ mất bộ nhớ đệm phân tích. Máy chủ Bazel có thời gian rảnh 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, hãy tránh thay đổi các cờ đó nếu có thể.

  • Chú ý rằng máy chủ Bazel sẽ bị tắt nếu bạn nhấn phím Ctrl-C nhiều lần trong khi Bazel đang chạy. Bạn có thể 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, nhưng chỉ cần nhấn tổ hợp phím Ctrl-C một lần để yêu cầu kết thúc một cách mượt mà lệnh gọi hiện tại.

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

Để đặt đ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 giới thiệu trong Bazel 6.4.0)