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

Trang này mô tả cách kiểm tra tỷ lệ truy cập trong bộ nhớ đệm và cách điều tra các thiếu sót 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 thử nghiệm 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ệ lượt truy cập vào bộ nhớ đệm

Trong đầu ra chuẩn của quá trình chạy Bazel, hãy nhìn vào dòng INFO liệt kê các quy trình, gần như tương ứng với các hành động Bazel. Dòng đó nêu chi tiết nơi thực hiện hành động. Hãy tìm nhãn remote (cho biết một hành động đượ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. 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, còn 2 thao tác 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. Số 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 con số thấp hơn dự kiến), hãy chạy bazel clean, sau đó là lệnh tạo/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. Vào 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 bộ nhớ đệm từ xa. Trong quá trình thực thi từ xa, các kết quả của thao tác đượ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 bộ nhớ đệm từ xa mà không khiến kết quả bị che khuất bởi các lượt truy cập bộ nhớ đệm cục bộ.

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

    Nếu các mã thao tác giống hệt nhau nhưng không có lượt truy cập vào bộ nhớ đệm, thì có điều gì đó 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 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 thao tác cụ thể, thì có nghĩa là quy tắc tương ứng có thể có thẻ no-cache theo định nghĩa ở tệp BUILD. Xem các trường mnemonictarget_label trong nhật ký thực thi để giúp xác định hành động này đến từ đâu.

  7. Nếu các hành động 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 chứa --noremote_accept_cached để tắt hoạt động tra cứu bộ nhớ đệm cho một bản dựng.

    Nếu khó tìm ra 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 tạo như sau:

    a. Thêm --build_event_text_file=/tmp/bep.txt vào lệnh Bazel để nhận 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 thông báo structured_command_line bằng 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í đặt thành false: ở dòng lệnh hoặc trong tệp 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ờ 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:

  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 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 của 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ủ 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. Đối với mỗi thao tác, có một phần tử SpawnExec chứa tất cả thông tin của phím hành động. Do đó, nếu nhật ký giống hệt nhau thì các khoá bộ nhớ đệm của thao tác cũng vậy.

Để so sánh nhật ký của 2 bản dựng không dùng chung lượt truy cập bộ nhớ đệm như dự kiến, 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 rồi 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 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 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.