Các loại hồ sơ và trường hợp hữu ích của từng loại

Bạn có thể ghi lại một số loại hồ sơ hiệu suất trong Android. Việc thu thập hồ sơ giúp bạn gỡ lỗi các vấn đề liên quan đến tốc độ chạy của ứng dụng, dung lượng bộ nhớ sử dụng, mức tiêu thụ năng lượng và nhiều vấn đề khác.

Tài liệu này mô tả các loại hồ sơ hữu ích nhất và thời điểm sử dụng từng loại để gỡ lỗi các vấn đề thường gặp về hiệu suất.

Dấu vết hệ thống

Ví dụ về dấu vết hệ thống
Hình 1.: Ví dụ về dấu vết hệ thống.

Dấu vết hệ thống là một trình phân tích tài nguyên mạnh mẽ chứa thông tin về các quy trình, luồng, thông tin về thời gian, quá trình thực thi CPU và tác vụ, cũng như các sự kiện do hệ thống hoặc người dùng xác định.

Theo góc độ của ứng dụng, bản chất của thông tin trong dấu vết có thể trải rộng trên nhiều lĩnh vực, bao gồm độ trễ, hiện tượng giật, bộ nhớ, pin và nhiều vấn đề khác.

Dấu vết hệ thống chứa các sự kiện do mã điều khiển sau đây, có thể do hệ thống hoặc người dùng xác định. Sự kiện do mã điều khiển là những sự kiện mà người dùng có thể kích hoạt thông qua các lệnh gọi hàm.

  • Phân đoạn dấu vết: đại diện cho thời gian giữa các điểm khác nhau trong mã của bạn. Bạn có thể thêm các phân đoạn này bằng Trace.beginSectionTrace.endSection API.
  • Bộ đếm dấu vết: giá trị số đại diện cho các chỉ số, ví dụ: kích thước vùng nhớ khối xếp. Bạn có thể thêm các bộ đếm này bằng API Trace.setCounter.

Dấu vết hệ thống cũng chứa các chỉ số có thể được tạo từ các truy vấn PerfettoSQL và có thể dùng để phân tích hoặc so sánh dấu vết.

Bạn nên sử dụng dấu vết hệ thống để thực hiện các tác vụ sau:

  • Chẩn đoán các vấn đề về độ trễ. Dấu vết hệ thống rất hữu ích để tìm các vấn đề về độ trễ do sự chậm trễ, thời gian chờ hoặc các vấn đề về lập lịch. Các trình phân tích khác, chẳng hạn như hồ sơ dựa trên mẫu, không cung cấp thông tin về thời gian mà dấu vết hệ thống cung cấp.

  • Tìm các phép tính trùng lặp. Tính năng theo dõi có thể cho biết liệu một số phép tính có đang được lặp lại hay không, điều này có thể cho thấy các thao tác không cần thiết.

  • Chẩn đoán các vấn đề về tranh chấp khoá. Với thông tin về trạng thái luồng và các phân đoạn cho biết thời điểm tài nguyên bị chặn, bạn có thể xác định xem các khoá (như khối synchronized) có gây ra sự chậm trễ trong hành trình của người dùng hay không.

  • Tìm hiểu về tính năng đa luồng trong ứng dụng. Dấu vết cung cấp chế độ xem nhiều luồng, cho thấy trạng thái của từng luồng và mọi phân đoạn dấu vết do hệ thống hoặc ứng dụng của bạn thêm vào. Chế độ xem đa luồng này giúp bạn hiểu rõ những luồng nào đang hoạt động, đang ở chế độ ngủ hoặc đang chạy và cách chúng tương tác.

  • Thực hiện phân tích hiệu suất phức tạp. Giao diện người dùng mạnh mẽ và khả năng hiển thị nhiều loại thông tin giúp dấu vết hệ thống hữu ích cho việc gỡ lỗi nhiều vấn đề về hiệu suất, bao gồm độ trễ, bộ nhớ và mức sử dụng pin.

Dấu vết hệ thống cũng hỗ trợ truy vấn bằng PerfettoSQL. Tính năng mạnh mẽ này cho phép bạn:

  • Trích xuất dữ liệu cụ thể.
  • Chuyển đổi dữ liệu dấu vết thành các chỉ số tuỳ chỉnh.
  • Tạo các bản ghi gỡ lỗi từ các truy vấn để dễ dàng hình dung những điều bạn quan tâm nhất trong giao diện người dùng Perfetto.
  • Thực hiện các phân tích phức tạp trực tiếp trong giao diện người dùng Perfetto.

Hồ sơ mẫu ngăn xếp

Ví dụ về hồ sơ mẫu ngăn xếp
Hình 2.: Ví dụ về hồ sơ mẫu ngăn xếp.

Hồ sơ mẫu ngăn xếp hoạt động bằng cách ghi lại các mẫu thực thi mã và lưu trữ thông tin ngăn xếp lệnh gọi theo một tốc độ đã đặt trong khi một luồng đang chạy các tác vụ trên CPU. Điều này cung cấp thông tin chi tiết về những gì mã của bạn đang thực hiện trong quá trình thực thi.

Bạn nên sử dụng các mẫu ngăn xếp để thực hiện những việc sau:

  • Tối ưu hoá điểm nóng. Các mẫu ngăn xếp giúp xác định các phần mã có nhiều hoạt động CPU, nghĩa là luồng thường ở trạng thái "đang chạy".
  • Tìm hiểu về quá trình thực thi mã. Các mẫu ngăn xếp có thể giúp bạn hiểu rõ hành vi tổng thể của cơ sở mã.
  • Xác định mã không được chạy. Bạn có thể tìm thấy các ngăn xếp lệnh gọi không được chạy, điều này cho thấy cơ hội tối ưu hoá ngay lập tức.

Tệp báo lỗi

Ví dụ về tệp báo lỗi
Hình 3.: Ví dụ về tệp báo lỗi.

Tệp báo lỗi vùng nhớ khối xếp Java cho thấy ảnh chụp nhanh bộ nhớ vùng nhớ khối xếp Java của ứng dụng. Ảnh chụp nhanh này bao gồm tất cả các đối tượng và cách chúng tham chiếu lẫn nhau tại thời điểm tạo tệp báo lỗi.

Bạn nên thu thập tệp báo lỗi để thực hiện những việc sau:

  • Phát hiện các đối tượng trùng lặp. Tệp báo lỗi cho thấy số lượng đối tượng trực tiếp, hữu ích cho việc theo dõi các đối tượng trùng lặp. Các tệp này cũng cung cấp thông tin tham chiếu đối tượng, giúp bạn xác định vị trí mã nơi các đối tượng được tạo.
  • Tìm tình trạng rò rỉ bộ nhớ. Tệp báo lỗi có thể tiết lộ bộ nhớ không còn được sử dụng khi tạo tệp báo lỗi, cho thấy tình trạng rò rỉ bộ nhớ tiềm ẩn.
  • Xác định các đối tượng có thể được tối ưu hoá. Bằng cách hiển thị các đối tượng sử dụng nhiều bộ nhớ và số lượng của chúng, tệp báo lỗi giúp xác định các mẫu sử dụng bộ nhớ không hiệu quả.

Hồ sơ của vùng nhớ khối xếp

Ví dụ về hồ sơ ảnh chụp nhanh của vùng nhớ khối xếp
Hình 4.: Ví dụ về hồ sơ của vùng nhớ khối xếp.

Hồ sơ của vùng nhớ khối xếp có cả phiên bản gốc và Java, rất hữu ích cho việc gỡ lỗi các vấn đề về bộ nhớ. Các hồ sơ này tương tự như các mẫu ngăn xếp lệnh gọi, nhưng thay vì đo lường chu kỳ CPU, chúng lấy mẫu khi bộ nhớ được phân bổ.

Bạn nên sử dụng hồ sơ của vùng nhớ khối xếp để thực hiện những việc sau:

  • Giảm tình trạng nhồi nhét bộ nhớ. Hồ sơ của vùng nhớ khối xếp cung cấp các mẫu có vị trí mã cho việc phân bổ bộ nhớ. Điều này giúp bạn xác định các khu vực tạo ra nhiều đối tượng tạm thời, có thể góp phần vào việc Thu gom rác (GC) thường xuyên trong ứng dụng của bạn.
  • Phát hiện tình trạng rò rỉ bộ nhớ. Bạn có thể sử dụng hồ sơ của vùng nhớ khối xếp với các hồ sơ bộ nhớ khác để chẩn đoán và khắc phục tình trạng rò rỉ bộ nhớ. Các hồ sơ này giúp bạn xác định các vị trí đang phân bổ nhiều bộ nhớ hơn đáng kể so với dự kiến.

Kết hợp hồ sơ

Thông thường, bạn sẽ phân tích hiệu suất bằng một hồ sơ. Tuy nhiên, việc thu thập nhiều hồ sơ hoặc một hồ sơ kết hợp có thể cung cấp bức tranh đầy đủ hơn và giúp chẩn đoán các vấn đề phức tạp mà một hồ sơ đơn lẻ không thể thực hiện được.

Hãy cân nhắc các trường hợp sau đây khi việc kết hợp hồ sơ mang lại lợi ích:

  • Trường hợp 1: Điều tra mã chưa được đo lường. Theo dõi hệ thống có thể cho thấy độ trễ đối với các thao tác mà bạn đã đo lường. Tuy nhiên, bạn có thể cần thêm thông tin về các phần chưa được đo lường của mã đang chạy trong những thời điểm đó. Để điều tra, hãy lấy hồ sơ ngăn xếp lệnh gọi để hiểu rõ mã đã thực thi. Sau đó, thông tin này có thể giúp bạn cải thiện tính năng theo dõi bằng cách thêm nhiều phân đoạn dấu vết hơn.

  • Trường hợp 2: Phân tích tình trạng rò rỉ bộ nhớ và thu gom rác. Hãy tưởng tượng một dấu vết hệ thống cho thấy bộ nhớ vùng nhớ khối xếp Java liên tục tăng do việc phân bổ, kích hoạt hoạt động thu gom rác (GC) thường xuyên. Để hiểu rõ các đối tượng được phân bổ, hãy lấy hồ sơ của vùng nhớ khối xếp hoặc tệp báo lỗi. Phương pháp kết hợp này giúp bạn xác định các cách giảm mức sử dụng bộ nhớ. Ví dụ: việc giảm các hoạt động phân bổ lãng phí hoặc có thể tối ưu hoá bằng cách sử dụng bộ nhớ đệm có thể ngăn chặn hoạt động GC xảy ra.