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 · 7.3 · 7.2 · 7.1 · 7.0 · 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 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 bạn đang sử dụng hiệu quả bộ nhớ đệm từ xa.

Kiểm tra tỷ lệ 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, 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. 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 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. 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ượt 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 bản dựng/kiểm thử sẽ 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 đưa 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ể 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 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 lại (các) bản dựng và (các) chương trình kiểm thử mà bạn đang điều tra (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. Một nguồn có thể gây ra sự khác biệt là một vấn đề không 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 hành động đó, hãy làm như sau:

    a. Chạy lại (các) bản dựng hoặc (các) chương trình 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_compact_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 chênh lệch đó.

    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 các trường mnemonictarget_label 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ó 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ý và tì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 và kiểm tra xem thuộc tính này có được đặt thành false hay không.

    d. Nếu remote_accept_cachedfalse, hãy xác định vị trí remote_accept_cached đang được đặt thành false: tại dòng lệnh hoặc trong tệp bazelrc.

Đảm bảo 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/kiểm thử 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:

  1. Thực hiện một sửa đổi nhỏ đối với bản dựng để tránh truy cập vào 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_compact_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_compact_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 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 các thao tác được thực thi trong quá trình tạo bản dựng. Mỗi bản ghi mô tả cả dữ liệu đầu vào (không chỉ tệp mà còn cả đối số dòng lệnh, biến môi trường, v.v.) và dữ liệu đầu ra của hành động. Do đó, việc kiểm tra nhật ký có thể cho biết lý do thực thi lại một hành động.

Bạn có thể tạo nhật ký thực thi ở một trong ba định dạng sau: thu gọn (--execution_log_compact_file), tệp nhị phân (--execution_log_binary_file) hoặc JSON (--execution_log_json_file). Bạn nên dùng định dạng thu gọn vì định dạng này tạo ra các tệp nhỏ hơn nhiều với một chút hao tổn trong thời gian chạy. Các hướng dẫn sau đây áp dụng cho mọi định dạng. Bạn cũng có thể chuyển đổi giữa các loại này bằng công cụ //src/tools/execlog:converter.

Để 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à tạo //src/tools/execlog:parser công cụ:

    nhân bản git https://github.com/bazelbuild/bazel.git CD bazel bản dựng bazel //src/tools/execlog:parser

  3. Sử dụng công cụ //src/tools/execlog:parser để chuyển đổi nhật ký thành định dạng văn bản mà con người có thể đọc được. Ở định dạng này, các hành động trong nhật ký thứ hai là được sắp xếp cho phù hợp với thứ tự trong nhật ký đầu tiên, giúp việc so sánh dễ dàng hơn.

    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.