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ệ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ụ dành cho 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 ổ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 đó máy chủ này xây dựng 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 lưu giữ 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 thao tác thực thi hoặc có thể tắt các hành động để thực thi từ xa nếu được thiết lập để làm vậy. Kết quả 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ẻ giữa các máy chủ 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 một quy trình làm việc điển hình của nhà phát triển, thông thường, bạn sẽ tạo (hoặc chạy) một đoạn mã nhiều lần, 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 đạt). 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 thấp 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 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. Có thể dành một lượng thời gian đáng kể cho các giai đoạn tải và phân tích của quá trình chạy nguội (chẳng hạn như 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, đơn lẻ (ví dụ: bản phát hành công khai), chi phí này có thể chấp nhận được, nhưng để 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 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 có nhiều biến động. Trước hết, đây là một phần của trạng thái đang xử lý của máy chủ Bazel, vì vậy, khi mất máy chủ, bộ nhớ đệm sẽ bị mất. 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ỏ. Nguyên nhân là do có 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 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. Bộ nhớ đệm thực thi có thể được lưu 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 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ủ 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 ở giữa quy trình làm việc lặp lại. Ví dụ: việc kết hợp một bazel build -c opt với một 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 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 những cờ đó nếu có thể.

  • Hãy 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 khi Bazel đang chạy. Bạn nên tìm cách 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ỉ 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 nhẹ nhàng.

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