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 vấn đề Xem nguồn Hằng đêm · 7.3 · 7.2 · 7.1 · 7 · 6,5

Trang này mô tả cách kiểm tra tỷ lệ truy cập bộ nhớ đệm và cách điều tra thiếu bộ nhớ đệm trong ngữ 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 thử nghiệm thành công sử dụng thực thi từ xa và bạn muốn đảm bảo rằng mình đang làm việc hiệu quả sử dụng bộ nhớ đệm từ xa.

Kiểm tra tỷ lệ lượt truy cập vào bộ nhớ đệm

Trong đầu ra chuẩn của lần chạy Bazel, hãy nhìn vào dòng INFO liệt kê tương ứng với các hành động Bazel. Chi tiết dòng đó nơi thực hiện hành động. Tìm nhãn remote cho biết thao tác thực thi từ xa, linux-sandbox cho các hành động đượ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. Hành động có kết quả từ bộ nhớ đệm từ xa được 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 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. Có thể bỏ qua 3 phần nội bộ này. Đó thường là những hành động nhỏ nội bộ, ví dụ như tạo các liên kết tượng trưng. Chiến dịch Địa phương không có trong bản tóm tắt này. Nếu bạn nhận được 0 quy trình (hoặc một con số thấp hơn dự kiến), hãy chạy bazel clean, sau đó chạy bản dựng/kiểm thử .

Khắc phục sự cố về số lần truy cập vào bộ nhớ đệm

Nếu bạn không nhận được tỷ lệ lượt 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 tạo/kiểm thử sẽ tạo ra lượt truy cập 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 đưa vào bộ nhớ đệm. Chiến lược phát hành đĩa đơn khi một bản dựng mới được chạy trên một ngăn xếp cụ thể, bạn sẽ không thể số lần truy cập bộ nhớ đệm. Trong quá trình thực thi từ xa, kết quả của hành động sẽ được lưu trữ trong bộ nhớ đệm và lần chạy tiếp theo sẽ chọn lại chúng.

  2. Chạy bazel clean. Lệnh này sẽ xoá sạch bộ nhớ đệm cục bộ, điều này cho phép bạn điều tra các lần truy cập bộ nhớ đệm từ xa mà không cho kết quả nào được che giấu số lần truy cập vào bộ nhớ đệm cục bộ.

  3. Chạy(các) bản dựng và(các) kiểm thử mà bạn đang điều tra lại (trên cùng 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ì bộ nhớ đệm của bạn đang được điền chính xác và truy cập. Trong trường hợp đó, hãy chuyển sang phần tiếp theo.

  5. Nguyên nhân có thể gây ra sự khác biệt là điều gì đó không liền mạch trong bản dựng gây ra các hành động để nhận các phím hành động khác nhau trong hai lần chạy. Để tìm những hành động đó, 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ó 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 rằng các thao tác trên 2 tệp nhật ký là giống nhau. Sự khác biệt cung cấp đầu mối về những thay đổi đã xảy ra giữa 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à bây giờ chạy lặp lại sẽ tạo ra tất cả kết quả tìm kiếm trong bộ nhớ đệm, hãy chuyển đến phần tiếp theo.

    Nếu mã thao tác giống hệt nhau nhưng không có kết quả tìm kiếm trong bộ nhớ đệm, thì bạn có thể 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 sự cố thường gặp.

  6. Kiểm tra để đảm bảo tất cả hành động trong nhật ký thực thi đã được đặt cacheable thành true. Nếu cacheable không xuất hiện trong nhật ký thực thi cho một hành động cho phép có nghĩa là quy tắc tương ứng có thể có thẻ no-cache trong trong tệp BUILD. Hãy xem mnemonictarget_label các trường trong nhật ký thực thi để giúp xác định vị trí sắp thực hiện hành động .

  7. Nếu các thao tác giống hệt nhau và cacheable nhưng không có kết quả tìm kiếm trong bộ nhớ đệm, thì có thể là dòng lệnh của bạn bao gồm --noremote_accept_cached sẽ tắt tra cứu bộ nhớ đệm cho một bản dựng.

    Nếu việc tìm ra dòng lệnh thực sự gặp khó khăn, hãy sử dụng phiên bản dòng lệnh từ Tạo giao thức sự kiện 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 kiếm structured_command_line nhắn tin cho command_line_label: "canonical". Bảng này sẽ liệt kê tất cả lựa chọn sau khi mở rộng.

    c. Tìm remote_accept_cached rồi kiểm tra xem đã đặt thành false hay chưa.

    d. Nếu remote_accept_cachedfalse, hãy xác định vị trí đang diễn ra đặt thành false: ở dòng lệnh hoặc trong bazelrc.

Đảm bảo việc lưu vào bộ nhớ đệm trên các máy

Sau khi các lượt truy cập 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 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 của bạn để tránh gặp phải các 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 sửa đổi từ bước 1 bao gồm:

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

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

  1. Nhận 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 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 có mã nguồn để phân tích cú pháp nhật ký thực thi với 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. Nội dung sau đây cũng sắp xếp các hành động trong nhật ký thứ hai để khớp với thứ tự hành động trong nhật ký đầu tiên để dễ 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 sử dụng văn bản bạn yêu thích để phân biệt /tmp/exec1.log.txt/tmp/exec2.log.txt.