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

Báo cáo vấn đề Xem nguồn Hằng đêm · 7.3 · 7.2 · 7.1 · 7 · 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 lặp lại.

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ụ CLI khởi động máy chủ Bazel cho từng cơ sở đầu ra riêng biệt. Máy chủ Bazel thường ổn định, nhưng sẽ tắt sau một thời gian không hoạt động thời gian để 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ấ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 hành động hoặc gửi tắt để thực thi từ xa nếu chế độ này được thiết lập để thực thi. Kết quả của các quá trình thực thi hành động 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ẻ trong số các máy chủ của Bazel).

  • Kết quả của lệnh gọi Bazel hiện có trong cây đầu ra.

Chạy Bazel lặp đi lặp lại

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

Do đó, 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. Việc dành nhiều thời gian có thể chỉ được dành cho giai đoạn tải và phân tích của quy trình chạy nguội (ví dụ: chỉ chạy sau khi máy chủ Bazel khởi động hoặc khi bộ nhớ đệm phân tích bị huỷ). Đối với một bản dựng nguội thành công, riêng lẻ (ví dụ: đối với bản phát hành công khai), chi phí này là có thể chịu được, nhưng nếu liên tục tạo dựng cùng một mục tiêu, điều quan trọng là được khấu trừ dần và không lặp lại trên mỗi lệnh gọi.

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

Một bộ nhớ đệm thực thi tốt cũng đóng vai trò quan trọng đối với hiệu suất của bản dựng. Một lượt thực thi bộ nhớ đệm có thể được lưu cục bộ trên đĩa, hoặc từ xa. Bộ nhớ đệm này có thể được chia sẻ giữa 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 yếu tố sau trong quá trình sử dụng lặp lại:

  • Lưu ý việc thay đổi cờ bazel trong một lần lặp lại quy trình làm việc. Ví dụ: kết hợp bazel build -c opt với bazel cquery khiến mỗi lệnh huỷ bộ nhớ đệm phân tích của lệnh khác. Nhìn chung, hãy cố gắng sử dụng một tập hợp cờ cố định trong suốt một quy trình làm 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ó một có thể định cấu hình ở trạng thái rảnh sau đó sẽ tắt. Bạn có thể định cấu hình thời gian này qua bazelrc cho phù hợp với nhu cầu của bạn. Máy chủ cũng đã khởi động lại khi khởi động cờ thay đổi, vì vậy, một lần nữa, hãy tránh thay đổi các cờ đó nếu có thể.

  • Cảnh giác rằng máy chủ Bazel sẽ bị vô hiệu hoá nếu bạn nhấn Ctrl-C nhiều lần khi Bazel đang chạy. Thật hấp dẫn khi 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 mà chỉ nhấn Ctrl-C một lần để yêu cầu một kết thúc êm ái của lệnh gọi hiện tại.

  • 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 --output_base cờ. Mỗi cơ sở đầu ra sẽ có máy chủ Bazel riêng.