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

Báo cáo vấn đề Xem nguồn Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 các lệnh từ người dùng.

  • Công cụ CLI sẽ 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 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 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 hiện quá trình thực thi thao tác hoặc gửi các thao tác để thực thi từ xa nếu được thiết lập để làm như vậ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à 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ó 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, việc tạo (hoặc chạy) một đoạn mã nhiều lần là điều thường thấy, 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 thử nghiệm 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ó ít chi phí nhất có thể so với hành động lặp lại cơ bản (ví dụ: gọi một trình biên dịch hoặc thực thi một kiểm thử).

Với suy nghĩ 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ỉ 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 đượ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 khởi động nguội thành công (ví dụ: đối với một 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 liên tục tạo cùng một mục tiêu, điều quan trọng là chi phí này phải được khấu hao và không lặp lại trên mỗi lệnh gọi.

Bộ nhớ đệm phân tích khá dễ bị 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, nếu mất máy chủ thì cũng 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 lựa chọn khởi động).

Bộ nhớ đệm thực thi hiệu quả cũng rất có giá trị đối với hiệu suất bản dựng. Bạn có thể lưu trữ 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à thực tế 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 sử dụng một trong hai cách này trong quá trình sử dụng lặp đi lặp lại:

  • Hãy lưu ý đến việc thay đổi cờ bazel trong quy trình làm việc lặp đi 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 bộ cờ cố định trong suốt quy trình làm việc cụ thể.

  • 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 chờ 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ờ 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 Ctrl-C nhiều lần trong khi Bazel đang chạy. Bạn có thể 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 suôn sẻ lệnh gọi hiện tại.

  • Nếu muốn sử dụng nhiều bộ cờ trong 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.

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