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 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 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 đó 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 thi thao tác hoặc có thể tắt thao tác để thực thi từ xa nếu đã thiết lập như vậy. Kết quả của việc 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à 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 xuất hiện trong cây đầu ra.

Chạy Bazel lặp lại

Trong quy trình làm việc thông thường của nhà phát triển, họ thường 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 bazel lặp lại sẽ có mức hao tổn thấp nhất có thể so với hành động cơ bản và lặp lại (ví dụ: gọi trình biên dịch hoặc thực thi kiểm thử).

Vì vậy, chúng ta cần 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. Một lượng thời gian đáng kể chỉ có thể dành 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 có thể chấp nhận được, nhưng đối với việc tạo nhiều lần cùng một mục tiêu, điều quan trọng là chi phí này phải được khấu trừ và không lặp lại trong mỗi lần 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 đang xử lý của máy chủ Bazel, vì vậy, nếu bạn 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á: 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 nhiều cờ ảnh hưởng đến biểu đồ xây 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).

Bộ nhớ đệm thực thi hiệu quả cũng giúp tăng hiệu suất của bản dựng. Bạn có thể lưu giữ bộ nhớ đệm thực thi trên ổ đĩa cục bộ hoặc từ xa. Bộ nhớ đệm có thể được chia sẻ giữa các máy chủ 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 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 những cách 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 công 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 các 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 thời gian của một quy trình 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 không hoạt động 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ể.

  • Hãy lưu ý rằng máy chủ Bazel sẽ bị vô hiệu hoá 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 lệnh gọi hiện tại một cách linh hoạt.

  • 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.