Trang này mô tả cách kiểm tra tỷ lệ truy cập bộ nhớ đệm và cách điều tra các lần truy cập không thành công vào bộ nhớ đệm trong bối cảnh thực thi từ xa.
Trang này giả định rằng bạn có một bản dựng và/hoặc quy trình kiểm thử sử dụng thành công tính năng thực thi từ xa và bạn muốn đảm bảo rằng bạn đang sử dụng bộ nhớ đệm từ xa một cách hiệu quả.
Kiểm tra tỷ lệ truy cập bộ nhớ đệm
Trong đầu ra tiêu chuẩn của quá trình chạy Bazel, hãy xem dòng INFO liệt kê
các quy trình, tương ứng với các thao tác của Bazel. Dòng đó nêu chi tiết
nơi chạy thao tác. Hãy tìm nhãn remote cho biết một thao tác
được thực thi từ xa, linux-sandbox cho các thao tác được thực thi trong hộp cát cục bộ,
và các giá trị khác cho các chiến lược thực thi khác. Một thao tác có kết quả đến
từ bộ nhớ đệm từ xa sẽ được hiển thị là remote cache hit.
Ví dụ:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
Trong ví dụ này, có 6 lần truy cập thành công vào bộ nhớ đệm từ xa và 2 thao tác không truy cập thành công vào bộ nhớ đệm
và được thực thi từ xa. Bạn có thể bỏ qua phần 3 bên trong.
Đây thường là các thao tác nội bộ nhỏ, chẳng hạn như tạo các đường liên kết tượng trưng. Các lần truy cập thành công vào bộ nhớ đệm cục bộ
không được đưa vào bản tóm tắt này. Nếu bạn nhận được 0 quy trình
(hoặc một số thấp hơn dự kiến), hãy chạy bazel clean, sau đó chạy lệnh kiểm thử/bản dựng.
Khắc phục sự cố truy cập thành công vào bộ nhớ đệm
Nếu bạn không nhận được tỷ lệ truy cập thành công vào bộ nhớ đệm như mong đợi, hãy làm như sau:
Đảm bảo việc chạy lại cùng một lệnh kiểm thử/bản dựng sẽ tạo ra các lần truy cập thành công vào bộ nhớ đệm
Chạy(các) bản dựng và/hoặc(các) quy trình kiểm thử mà bạn muốn điền vào bộ nhớ đệm. Lần đầu tiên chạy một bản dựng mới trên một ngăn xếp cụ thể, bạn có thể không truy cập thành công vào bộ nhớ đệm từ xa. Trong quá trình thực thi từ xa, kết quả thao tác được lưu trữ trong bộ nhớ đệm và lần chạy tiếp theo sẽ chọn các kết quả đó.
Chạy
bazel clean. Lệnh này sẽ xoá bộ nhớ đệm cục bộ, cho phép bạn điều tra các lần truy cập thành công vào bộ nhớ đệm từ xa mà không bị các lần truy cập thành công vào bộ nhớ đệm cục bộ che khuất kết quả.Chạy lại (các) bản dựng và quy trình kiểm thử mà bạn đang điều tra (trên cùng một máy).
Kiểm tra dòng
INFOđể biết tỷ lệ truy cập thành công vào bộ nhớ đệm. Nếu bạn không thấy quy trình nào ngoại trừremote cache hitvàinternal, thì bộ nhớ đệm của bạn đang được điền và truy cập đúng cách. Trong trường hợp đó, hãy chuyển sang phần tiếp theo.Một nguồn gây ra sự khác biệt có thể là một thứ gì đó không kín trong bản dựng khiến các thao tác nhận được các khoá thao tác khác nhau trên hai lần chạy. Để tìm các thao tác đó, hãy làm như sau:
a. Chạy lại(các) bản dựng hoặc(các) quy trình kiểm thử đang được đề cập để lấy nhật ký thực thi:
bazel cleanbazel --optional-flags build //your:target --execution_log_compact_file=/tmp/exec1.logb. So sánh nhật ký thực thi giữa hai lần chạy. Đảm bảo rằng các thao tác giống hệt nhau trên hai tệp nhật ký. Sự khác biệt cung cấp một manh mối về những thay đổi đã xảy ra giữa các lần chạy. Cập nhật bản dựng để loại bỏ những sự khác biệt đó.
Nếu bạn có thể giải quyết các vấn đề về bộ nhớ đệm và giờ đây, lần chạy lặp lại tạo ra tất cả các lần truy cập thành công vào bộ nhớ đệm, hãy chuyển sang phần tiếp theo.
Nếu mã thao tác của bạn giống hệt nhau nhưng không có lần truy cập thành công vào bộ nhớ đệm, thì có điều gì đó trong cấu hình của bạn đang ngăn chặn việc lưu vào bộ nhớ đệm. Tiếp tục với phần này để kiểm tra các vấn đề thường gặp.
Kiểm tra để đảm bảo rằng tất cả các thao tác trong nhật ký thực thi đều có
cacheableđược đặt thành true. Nếucacheablekhông xuất hiện trong nhật ký thực thi cho một thao tác nhất định, điều đó có nghĩa là quy tắc tương ứng có thể có thẻno-cachetrong định nghĩa của quy tắc đó trong tệpBUILD. Hãy xem các trườngmnemonicvàtarget_labeltrong nhật ký thực thi để giúp xác định nguồn gốc của thao tác từ.Nếu các thao tác giống hệt nhau và
cacheablenhưng không có lần truy cập thành công vào bộ nhớ đệm, thì có thể dòng lệnh của bạn bao gồm--noremote_accept_cachedthao tác này sẽ tắt tính năng tra cứu bộ nhớ đệm cho một bản dựng.a. Thêm
--build_event_text_file=/tmp/bep.txtvào lệnh Bazel để lấy phiên bản văn bản của nhật ký.b. Mở phiên bản văn bản của nhật ký và tìm kiếm thông báo
structured_command_linebằngcommand_line_label: "canonical". Thông báo này sẽ liệt kê tất cả các tuỳ chọn sau khi mở rộng.c. Tìm kiếm
remote_accept_cachedvà kiểm tra xem giá trị này có được đặt thànhfalsehay không.d. Nếu
remote_accept_cachedlàfalse, hãy xác định vị trí đặt giá trị này thànhfalse: ở dòng lệnh hoặc trong tệp bazelrc.
Đảm bảo lưu vào bộ nhớ đệm trên các máy
Sau khi các lần truy cập thành công vào bộ nhớ đệm diễn ra như mong đợi trên cùng một máy, hãy chạy (các) bản dựng/quy trình kiểm thử tương tự trên một máy khác. Nếu bạn nghi ngờ rằng việc lưu vào bộ nhớ đệm không diễn ra trên các máy, hãy làm như sau:
Thực hiện một thay đổi nhỏ đối với bản dựng để tránh truy cập vào các bộ nhớ đệm hiện có.
Chạy bản dựng trên máy đầu tiên:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec1.logChạy bản dựng trên máy thứ hai, đảm bảo rằng thay đổi từ bước 1 được đưa vào:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec2.logSo sánh nhật ký thực thi cho hai lần chạy. Nếu nhật ký không giống hệt nhau, hãy điều tra các cấu hình bản dựng để tìm sự khác biệt cũng như các thuộc tính từ môi trường máy chủ lưu trữ bị rò rỉ vào một trong các bản dựng.
So sánh nhật ký thực thi
Nhật ký thực thi chứa các bản ghi về các thao tác được thực thi trong quá trình xây dựng. Mỗi bản ghi mô tả cả dữ liệu đầu vào (không chỉ tệp mà còn cả đối số dòng lệnh , biến môi trường, v.v.) và dữ liệu đầu ra của thao tác. Do đó, việc kiểm tra nhật ký có thể tiết lộ lý do một thao tác được thực thi lại.
Nhật ký thực thi có thể được tạo ở một trong ba định dạng:
nhỏ gọn (--execution_log_compact_file),
nhị phân (--execution_log_binary_file) hoặc JSON (--execution_log_json_file).
Bạn nên sử dụng định dạng nhỏ gọn vì định dạng này tạo ra các tệp nhỏ hơn nhiều với rất
ít chi phí hoạt động. Các hướng dẫn sau đây hoạt động cho mọi định dạng. Bạn
cũng có thể chuyển đổi giữa các định dạng này bằng công cụ //src/tools/execlog:converter.
Để so sánh nhật ký cho hai bản dựng không chia sẻ các lần truy cập thành công vào bộ nhớ đệm như mong đợi, hãy làm như sau:
Lấy nhật ký thực thi từ mỗi bản dựng và lưu trữ dưới dạng
/tmp/exec1.logvà/tmp/exec2.log.Tải mã nguồn Bazel xuống và xây dựng
//src/tools/execlog:parsercông cụ:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
Sử dụng công cụ
//src/tools/execlog:parserđể chuyển đổi nhật ký thành định dạng văn bản mà con người có thể đọc được. Ở định dạng này, các thao tác trong nhật ký thứ hai được sắp xếp để khớp với thứ tự trong nhật ký đầu tiên, giúp việc so sánh trở nên dễ dàng hơn.bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txtSử dụng công cụ so sánh văn bản yêu thích của bạn để so sánh
/tmp/exec1.log.txtvà/tmp/exec2.log.txt.