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ượt truy cập không tìm thấy trong 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 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 mình đ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 lượt 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 đó cho biết chi tiết về nơi chạy hành động. 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 một 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ẽ hiển thị dưới dạng remote cache hit
.
Ví dụ:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
Trong ví dụ này, có 6 lượt truy cập vào bộ nhớ đệm từ xa và 2 thao tác không có lượt truy cập vào bộ nhớ đệm và được thực thi từ xa. Bạn có thể bỏ qua 3 phần bên trong.
Đây thường là các thao tác nội bộ nhỏ, chẳng hạn như tạo đường liên kết tượng trưng. Lượt truy cập 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 tạo/kiểm thử.
Khắc phục sự cố về lượt truy cập vào bộ nhớ đệm
Nếu bạn không đạt được tỷ lệ truy cập 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 tạo/kiểm thử sẽ tạo ra các lượt truy cập bộ nhớ đệm
Chạy(các) bản dựng và/hoặc(các) kiểm thử mà bạn muốn điền vào bộ nhớ đệm. Lần đầu tiên chạy bản dựng mới trên một ngăn xếp cụ thể, bạn có thể không nhận được lượt truy cập vào bộ nhớ đệm từ xa. Trong quá trình thực thi từ xa, kết quả của thao tác sẽ được lưu trữ trong bộ nhớ đệm và một 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ượt truy cập bộ nhớ đệm từ xa mà không bị các lượt truy cập bộ nhớ đệm cục bộ che khuất kết quả.Chạy lại(các) bản dựng và(các) 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 vào bộ nhớ đệm. Nếu bạn không thấy quy trình nào ngoại trừremote cache hit
và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 có thể gây ra sự khác biệt 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 trong hai lần chạy. Để tìm những thao tác đó, hãy làm như sau:
a. Chạy lại(các) bản dựng hoặc(các) kiểm thử có vấn đề để lấy nhật ký thực thi:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
b. 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 trong cả hai tệp nhật ký. Sự khác biệt cung cấp thông tin về những thay đổi đã xảy ra giữa các lần chạy. Hãy cập nhật bản dựng để loại bỏ những điểm khác biệt đó.
Nếu bạn có thể giải quyết các vấn đề về lưu vào bộ nhớ đệm và bây giờ lần chạy lặp lại tạo ra tất cả các lượt truy cập bộ nhớ đệm, hãy chuyển sang phần tiếp theo.
Nếu mã nhận dạng thao tác của bạn giống nhau nhưng không có lượt truy cập vào bộ nhớ đệm, thì có 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. Hãy 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 đặt thành true
cacheable
. Nếucacheable
không xuất hiện trong nhật ký thực thi cho một hành động nhất định, điều đó có nghĩa là quy tắc tương ứng có thể có thẻno-cache
trong định nghĩa của quy tắc đó trong tệpBUILD
. Hãy xem các trườngmnemonic
vàtarget_label
trong nhật ký thực thi để xác định nguồn gốc của hành động.Nếu các thao tác giống hệt nhau và
cacheable
nhưng không có lượt truy cập bộ nhớ đệm, thì có thể dòng lệnh của bạn bao gồm--noremote_accept_cached
. Điều này sẽ vô hiệu hoá các lượt tra cứu bộ nhớ đệm cho một bản dựng.Nếu khó xác định dòng lệnh thực tế, hãy sử dụng dòng lệnh chuẩn từ Giao thức sự kiện bản dựng như sau:
a. Thêm
--build_event_text_file=/tmp/bep.txt
và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 thông báo
structured_command_line
bằngcommand_line_label: "canonical"
. Sau khi mở rộng, danh sách này sẽ liệt kê tất cả các lựa chọn.c. Tìm
remote_accept_cached
và kiểm tra xem giá trị này có được đặt thànhfalse
hay không.d. Nếu
remote_accept_cached
làfalse
, hãy xác định vị trí đặt thànhfalse
: ở dòng lệnh hoặc trong tệp bazelrc.
Đảm bảo việc lưu vào bộ nhớ đệm trên nhiều máy
Sau khi các lượt truy cập vào bộ nhớ đệm diễn ra như dự kiến trên cùng một máy, hãy chạy (các) bản dựng/thử nghiệm tương tự trên một máy khác. Nếu bạn nghi ngờ rằng quá trình lưu vào bộ nhớ đệm không diễn ra trên các máy, hãy làm như sau:
Sửa đổi nhỏ bản dựng để tránh ảnh hưởng đến bộ nhớ đệm hiện có.
Chạy bản dựng trên máy đầu tiên:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
Chạy bản dựng trên máy thứ hai, đảm bảo rằng nội dung sửa đổi từ bước 1 được đưa vào:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
So sánh nhật ký thực thi cho hai lần chạy. Nếu nhật ký không giống nhau, hãy kiểm tra 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 hai 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ề tất cả các thao tác được thực thi trong quá trình tạo. Đối với mỗi thao tác, sẽ có một phần tử SpawnExec chứa tất cả thông tin từ khoá thao tác. Do đó, nếu nhật ký giống nhau thì khoá bộ nhớ đệm thao tác cũng giống nhau.
Để so sánh nhật ký của 2 bản dựng không chia sẻ lượt truy cập bộ nhớ đệm như dự kiến, 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ữ nhật ký đó dưới dạng
/tmp/exec1.log
và/tmp/exec2.log
.Tải mã nguồn Bazel xuống và chuyển đến thư mục Bazel bằng cách sử dụng lệnh bên dưới. Bạn cần mã nguồn để phân tích cú pháp nhật ký thực thi bằng trình phân tích cú pháp execlog.
git clone https://github.com/bazelbuild/bazel.git cd bazel
Sử dụng trình phân tích cú pháp nhật ký thực thi để chuyển đổi nhật ký thành văn bản. Lệnh gọi sau đây cũng sắp xếp các thao tác trong nhật ký thứ hai sao cho khớp với thứ tự thao tác trong nhật ký đầu tiên để dễ dàng so sánh.
bazel build src/tools/execlog:parser 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.txt
Sử dụng công cụ so sánh văn bản mà bạn yêu thích để so sánh
/tmp/exec1.log.txt
và/tmp/exec2.log.txt
.