Gỡ lỗi các lượt truy cập vào bộ nhớ đệm từ xa để thực thi từ xa

Báo cáo sự cố Xem nguồn

Trang này mô tả cách kiểm tra tỷ lệ truy cập của bộ nhớ đệm và cách điều tra tình trạng bỏ lỡ 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ử có thể sử dụng thành công tính năng thực thi từ xa, đồng thời bạn muốn đảm bảo 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 vào bộ nhớ đệm của bạn

Trong đầu ra tiêu chuẩn của lần 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 Bazel. Dòng đó nêu chi tiết nơi thực hiện hành động. Tìm nhãn remote cho biết hành động được thực thi từ xa, linux-sandbox đối với hành động đượ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. Hành động có kết quả từ mộ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 hành động 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 nội bộ này. Thông thường, đó là những hành động nhỏ bên trong, chẳng hạn như tạo các đường liên kết tượng trưng. Số lượt truy cập vào bộ nhớ đệm cục bộ không được bao gồm trong bản tóm tắt này. Nếu bạn không có quy trình nào (hoặc một con số thấp hơn dự kiến), hãy chạy bazel clean rồi chạy lệnh xây dựng/kiểm thử.

Khắc phục sự cố về các lượt truy cập vào bộ nhớ đệm

Nếu bạn không nhận được tỷ lệ truy cập vào bộ nhớ đệm mà mình mong muốn, hãy làm như sau:

Đảm bảo việc chạy lại cùng một lệnh bản dựng/kiểm thử tạo ra các lượt truy cập vào bộ nhớ đệm

  1. Chạy(các) bản dựng và/hoặc(các) hoạt động kiểm thử mà bạn muốn điền vào bộ nhớ đệm. Trong 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ể sẽ 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ả hành động được lưu trữ trong bộ nhớ đệm và lần chạy tiếp theo sẽ tiếp nhận các kết quả này.

  2. 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 vào bộ nhớ đệm từ xa mà không có kết quả bị che giấu bằng các lượt truy cập vào bộ nhớ đệm cục bộ.

  3. Chạy (các) bản dựng và thử nghiệm mà bạn đang kiểm tra lại (trên cùng một máy).

  4. 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 hitinternal, thì tức là 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.

  5. Nguồn gốc có thể gây ra sự khác biệt là nội dung nào đó không mang tính khép kín trong bản dựng, khiến các hành động nhận được các khoá hành động 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 quy trình kiểm thử liên quan để 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 các thao tác trên 2 tệp nhật ký giống nhau. Sự chênh lệch là một gợi ý 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 sự cố lưu vào bộ nhớ đệm và giờ đây, thao tác chạy lặp lại sẽ tạo ra tất cả các lượt truy cập vào 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 hệt nhau nhưng không có lượt truy cập nào vào bộ nhớ đệm, thì có một yếu tố trong cấu hình của bạn đang ngă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.

  6. Kiểm tra để đảm bảo rằng tất cả các hành động trong nhật ký thực thi đã đặt cacheable thành true. Nếu cacheable không xuất hiện trong nhật ký thực thi cho một thao tác nhất định, thì điều đó có nghĩa là quy tắc tương ứng có thể có thẻ no-cache trong định nghĩa của nó trong tệp BUILD. Xem các trường mnemonictarget_label trong nhật ký thực thi để giúp xác định nguồn của hành động.

  7. Nếu các thao tác giống hệt nhau và cacheable nhưng không có lượt truy cập nào vào 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ẽ tắt tính năng tra cứu bộ nhớ đệm cho bản dựng.

    Nếu bạn khó xác định dòng lệnh thực tế, hãy sử dụng dòng lệnh chính tắc trong phần Build Event Protocol (Giao thức sự kiện tạo bản dựng) như sau:

    a. Thêm --build_event_text_file=/tmp/bep.txt vào lệnh Bazel để tải 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ý rồi tìm thông điệp structured_command_line bằng command_line_label: "canonical". Phần này sẽ liệt kê tất cả các tuỳ chọn sau khi mở rộng.

    c. Tìm remote_accept_cached rồi kiểm tra xem giá trị này đã được đặt thành false hay chưa.

    d. Nếu remote_accept_cachedfalse, hãy xác định vị trí bạn đặt thành false: ở 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ượ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ùng một bản dựng/kiểm thử 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 xảy ra trên các máy, hãy làm như sau:

  1. Thực hiện một sửa đổi nhỏ đối với bản dựng để tránh gặp phải bộ nhớ đệm hiện có.

  2. Chạy bản dựng trên máy đầu tiên:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. Chạy bản dựng trên máy thứ hai, đảm bảo bao gồm nội dung sửa đổi từ bước 1:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. 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 điều tra cấu hình bản dựng để xác định sự khác biệt cũng như thuộc tính từ môi trường máy chủ 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 bản ghi của tất cả các hành động được thực thi trong quá trình tạo bản dựng. Đối với mỗi hành động, có một phần tử SpawnExec chứa tất cả thông tin từ khoá hành động. Do đó, nếu nhật ký giống hệt nhau thì các khoá bộ nhớ đệm hành động cũng vậy.

Để so sánh nhật ký của hai bản dựng không chia sẻ số lượt truy cập vào bộ nhớ đệm như dự kiến, hãy làm như sau:

  1. Lấy nhật ký thực thi của mỗi bản dựng rồi lưu trữ dưới dạng /tmp/exec1.log/tmp/exec2.log.

  2. Tải mã nguồn Bazel xuống rồi chuyển đến thư mục Bazel bằng cách dùng lệnh bên dưới. Bạn cần có 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 thực thi.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. 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 để 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
    
  4. Hãy dùng văn bản bạn yêu thích để phân biệt /tmp/exec1.log.txt/tmp/exec2.log.txt.