Gỡ lỗi truy cập bộ nhớ đệm từ xa để thực thi từ xa

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo vấn đề Xem nguồn

Trang này mô tả cách kiểm tra tỷ lệ truy cập vào bộ nhớ đệm và cách điều tra các trường hợp thiếu bộ nhớ đệm trong quá trì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 quá trình 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ả.

Đang kiểm tra tỷ lệ truy cập vào 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 hành động của Bazel. Chi tiết về dòng đó nơi chạy hành động. Tìm nhãn remote. Nhãn này 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. Thao tác có kết quả 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. Phần 3 nội bộ có thể bị bỏ qua. Đó thường là các hành động nội bộ nhỏ, chẳng hạn như tạo đường liên kết tượng trưng. Các 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 đang 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 theo sau là lệnh bản dựng/kiểm thử.

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

Nếu bạn không nhận được tỷ lệ truy cập 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 tạo/thử nghiệm sẽ tạo ra lượt truy cập vào bộ nhớ đệm

  1. 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. 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ể thấy rằng sẽ không có lượt truy cập vào bộ nhớ đệm từ xa nào. Trong quá trình thực thi từ xa, các kết quả hành động được lưu trữ trong bộ nhớ đệm và các lần chạy tiếp theo sẽ xử lý kết quả.

  2. Chạy bazel clean. Lệnh này sẽ xoá bộ nhớ đệm trên máy, 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 làm ảnh hưởng đến kết quả do 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à(các) kiểm thử mà bạn đang tìm hiểu 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ì có nghĩa là bộ nhớ đệm đã đượ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. Một nguồn khác biệt có thể xảy ra là một lỗi không có ý nghĩa khi xây dựng, khiến các hành động nhận được các khoá hành động khác nhau trong hai lượt chạy đó. Để tìm thấy 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) kiểm thử đang được nói đế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 nhau trên hai tệp nhật ký. Sự khác biệt cung cấp 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 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, việ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 vào bộ nhớ đệm, thì tức là có một nội dung nào đó trong cấu hình 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 đề phổ biến.

    Nếu không cần phân biệt các nhật ký thực thi khác, bạn có thể sử dụng cờ --execution_log_json_file mà con người có thể đọc được. Bạn không thể sử dụng tính năng này để mở rộng ổn định vì nó chứa thời gian thực thi và không đảm bảo sắp xếp theo thứ tự.

  6. Kiểm tra để đảm bảo rằng tất cả các hành động trong nhật ký thực thi đều được đặt thành cacheable. Nếu cacheable không xuất hiện trong nhật ký thực thi cho một hành động cụ thể, thì có nghĩa là quy tắc tương ứng có thể có thẻ no-cache trong định nghĩa của tệp đó trong tệp BUILD. Xem trường progress_message mà con người có thể đọc được trong nhật ký thực thi để xác định nguồn gốc 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 vào bộ nhớ đệm, thì có thể dòng lệnh của bạn bao gồm --noremote_accept_cached sẽ vô hiệu hoá hoạt động tra cứu bộ nhớ đệm cho một bản dựng.

    Nếu việc xác định dòng lệnh thực tế gặp khó khăn, hãy sử dụng dòng lệnh chính tắc 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 để 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ý và tìm kiếm thông báo structured_command_line bằng command_line_label: "canonical". Nó sẽ liệt kê tất cả các tuỳ chọn sau khi mở rộng.

    c. Tìm kiếm remote_accept_cached và kiểm tra xem có được đặt là false hay không.

    d. Nếu remote_accept_cachedfalse, hãy xác định vị trí bạn muốn đặt thành false: tại dòng lệnh hoặc trong một 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ư mong đợi trên cùng một máy, hãy chạy (các) bản dựng/thử nghiệm giống nhau 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. Sửa đổi một chút về bản dựng của bạn để 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 của hai lần chạy này. Nếu nhật ký không giống nhau, hãy điều tra cấu hình xây dựng của bạn để biết 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 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ý cho hai bản dựng không chia sẻ 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 từ mỗi bản dựng và lưu trữ chúng 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 bằng trình phân tích cú pháp execlog.

    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 để phù hợ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. Việc sử dụng văn bản yêu thích của bạn khác với /tmp/exec1.log.txt/tmp/exec2.log.txt.