Tin tức về sản phẩm

Tăng hiệu suất của Android: Giới thiệu AutoFDO cho Kernel

4 phút đọc
Yabin Cui
Kỹ sư phần mềm

Chúng tôi là nhóm công cụ LLVM Android. Một trong những ưu tiên hàng đầu của chúng tôi là cải thiện hiệu suất của Android thông qua các kỹ thuật tối ưu hoá trong hệ sinh thái LLVM. Chúng tôi không ngừng tìm kiếm các cách để giúp Android hoạt động nhanh hơn, mượt mà hơn và hiệu quả hơn.Mặc dù phần lớn công việc tối ưu hoá của chúng tôi diễn ra trong không gian người dùng, nhưng nhân hệ điều hành vẫn là cốt lõi của hệ thống. Hôm nay, chúng tôi rất vui mừng được chia sẻ cách chúng tôi đưa tính năng Tối ưu hoá tự động dựa trên phản hồi (AutoFDO) vào nhân hệ điều hành Android để mang lại hiệu suất vượt trội cho người dùng.

AutoFDO là gì?

Trong quá trình xây dựng phần mềm tiêu chuẩn, trình biên dịch đưa ra hàng nghìn quyết định nhỏ, chẳng hạn như có nội tuyến một hàm hay không và nhánh nào của câu lệnh có điều kiện có khả năng được thực hiện, dựa trên các gợi ý về mã tĩnh.Mặc dù các phương pháp phỏng đoán này rất hữu ích, nhưng chúng không phải lúc nào cũng dự đoán chính xác quá trình thực thi mã trong quá trình sử dụng điện thoại thực tế.

AutoFDO thay đổi điều này bằng cách sử dụng các mẫu thực thi thực tế để hướng dẫn trình biên dịch. Các mẫu này thể hiện các đường dẫn thực thi lệnh phổ biến nhất mà mã thực hiện trong quá trình sử dụng thực tế, được ghi lại bằng cách ghi lại lịch sử phân nhánh của CPU. Mặc dù dữ liệu này có thể được thu thập từ các thiết bị trong đội xe, nhưng đối với kernel, chúng tôi tổng hợp dữ liệu này trong môi trường phòng thí nghiệm bằng cách sử dụng các khối lượng công việc đại diện, chẳng hạn như chạy 100 ứng dụng phổ biến nhất. Chúng tôi sử dụng trình phân tích mẫu để thu thập dữ liệu này, xác định những phần nào của mã là "nóng" (thường được sử dụng) và phần nào là "lạnh". Khi chúng tôi xây dựng lại kernel bằng các hồ sơ này, trình biên dịch có thể đưa ra các quyết định tối ưu hoá thông minh hơn nhiều, phù hợp với khối lượng công việc thực tế của Android.

Để hiểu tác động của việc tối ưu hoá này, hãy xem xét các thông tin chính sau:

  • Trên Android, kernel chiếm khoảng 40% thời gian CPU.
  • Chúng tôi đã sử dụng AutoFDO để tối ưu hoá các tệp thực thi và thư viện gốc trong không gian người dùng, cải thiện khoảng 4% thời gian khởi chạy ứng dụng lạnh và giảm 1% thời gian khởi động.

Hiệu suất vượt trội trong thực tế

Chúng tôi đã thấy những cải tiến đáng kể trên các chỉ số chính của Android bằng cách tận dụng các hồ sơ từ môi trường phòng thí nghiệm được kiểm soát. Các hồ sơ này được thu thập bằng cách thu thập dữ liệu và khởi chạy ứng dụng, đồng thời được đo lường trên các thiết bị Pixel trên các kernel 6.1, 6.6 và 6.12.

Những cải tiến đáng chú ý nhất được liệt kê bên dưới. Bạn có thể tìm thấy thông tin chi tiết về hồ sơ AutoFDO cho các phiên bản kernel này trong các kho lưu trữ kernel Android tương ứng cho các kernel android16-6.12android15-6.6.

boosting_2.png

Đây không chỉ là những con số lý thuyết. Chúng chuyển thành một giao diện nhanh nhạy hơn, chuyển đổi ứng dụng nhanh hơn, kéo dài thời lượng pin và một thiết bị phản hồi nhanh hơn cho người dùng cuối.

Cách hoạt động: Quy trình

Chiến lược triển khai của chúng tôi bao gồm một pipeline phức tạp để đảm bảo hồ sơ luôn phù hợp và hiệu suất vẫn ổn định.

boosting_3.png

Bước 1: Thu thập hồ sơ

Mặc dù chúng tôi dựa vào đội xe thử nghiệm nội bộ để lập hồ sơ tệp nhị phân không gian người dùng, nhưng chúng tôi đã chuyển sang môi trường phòng thí nghiệm được kiểm soát cho Hình ảnh kernel chung (GKI). Việc tách biệt quá trình lập hồ sơ khỏi chu kỳ phát hành thiết bị cho phép cập nhật linh hoạt, ngay lập tức, độc lập với các phiên bản kernel đã triển khai. Điều quan trọng là các bài kiểm thử xác nhận rằng dữ liệu dựa trên phòng thí nghiệm này mang lại hiệu suất tương đương với dữ liệu từ các đội xe thực tế.

  • Công cụ và môi trường: Chúng tôi flash các thiết bị kiểm thử bằng hình ảnh kernel mới nhất và sử dụng simpleperf để thu thập các luồng thực thi lệnh. Quá trình này dựa vào các khả năng của phần cứng để ghi lại lịch sử phân nhánh, đặc biệt là sử dụng  ARM Embedded Trace Extension (ETE) và ARM Trace Buffer Extension (TRBE) trên các thiết bị Pixel.
  • Khối lượng công việc: Chúng tôi xây dựng một khối lượng công việc đại diện bằng cách sử dụng 100 ứng dụng phổ biến nhất từ Bộ kiểm tra tính tương thích của ứng dụng Android (C-Suite). Để thu thập dữ liệu chính xác nhất, chúng tôi tập trung vào:
    • Khởi chạy ứng dụng: Tối ưu hoá cho những độ trễ dễ thấy nhất của người dùng
    • Thu thập dữ liệu ứng dụng dựa trên AI: Mô phỏng các tương tác liên tục, phát triển của người dùng
    • Giám sát trên toàn hệ thống: Không chỉ thu thập dữ liệu về các hoạt động của ứng dụng ở nền trước mà còn thu thập dữ liệu về các khối lượng công việc quan trọng ở nền sau và giao tiếp giữa các quy trình
  • Xác thực: Khối lượng công việc tổng hợp này cho thấy mức độ tương đồng là 85% với các mẫu thực thi được thu thập từ đội xe nội bộ của chúng tôi.
  • Dữ liệu được nhắm mục tiêu: Bằng cách lặp lại các bài kiểm thử này một cách đầy đủ, chúng tôi thu thập các mẫu thực thi có độ trung thực cao, thể hiện chính xác lượt tương tác của người dùng thực tế với các ứng dụng phổ biến nhất. Hơn nữa, khung có thể mở rộng này cho phép chúng tôi tích hợp liền mạch các khối lượng công việc và điểm chuẩn bổ sung để mở rộng phạm vi bao phủ.

Bước 2: Xử lý hồ sơ

Chúng tôi xử lý dữ liệu dấu vết thô sau khi xử lý để đảm bảo dữ liệu sạch, hiệu quả và sẵn sàng cho trình biên dịch.

  • Tổng hợp: Chúng tôi hợp nhất dữ liệu từ nhiều lần chạy kiểm thử và thiết bị vào một chế độ xem hệ thống duy nhất.
  • Chuyển đổi: Chúng tôi chuyển đổi dấu vết thô thành định dạng hồ sơ AutoFDO, lọc ra các ký hiệu không mong muốn nếu cần.
  • Cắt bớt hồ sơ: Chúng tôi cắt bớt hồ sơ để xoá dữ liệu cho các hàm "lạnh", cho phép các hàm này sử dụng tính năng tối ưu hoá tiêu chuẩn. Điều này giúp ngăn chặn các lỗi hồi quy trong mã hiếm khi được sử dụng và tránh tăng kích thước nhị phân không cần thiết.

Bước 3: Kiểm thử hồ sơ

Trước khi triển khai, các hồ sơ sẽ trải qua quá trình xác minh nghiêm ngặt để đảm bảo mang lại hiệu suất ổn định mà không có rủi ro về độ ổn định.

  • Phân tích hồ sơ và tệp nhị phân: Chúng tôi so sánh nghiêm ngặt nội dung của hồ sơ mới (bao gồm các hàm nóng, số lượng mẫu và kích thước hồ sơ) với các phiên bản trước. Chúng tôi cũng sử dụng hồ sơ để tạo hình ảnh kernel mới, phân tích các tệp nhị phân để đảm bảo rằng các thay đổi đối với phần văn bản nhất quán với kỳ vọng.
  • Xác minh hiệu suất: Chúng tôi chạy các điểm chuẩn được nhắm mục tiêu trên hình ảnh kernel mới. Điều này xác nhận rằng hình ảnh kernel mới duy trì các cải tiến về hiệu suất do các đường cơ sở trước đó thiết lập.

Cập nhật liên tục

Mã tự nhiên "trôi dạt" theo thời gian, vì vậy, hồ sơ tĩnh cuối cùng sẽ mất hiệu quả. Để duy trì hiệu suất cao nhất, chúng tôi chạy pipeline liên tục để thúc đẩy các bản cập nhật thường xuyên:

  • Làm mới thường xuyên: Chúng tôi làm mới hồ sơ trong các nhánh LTS kernel Android trước mỗi bản phát hành GKI, đảm bảo mọi bản dựng đều bao gồm dữ liệu hồ sơ mới nhất.
  • Mở rộng trong tương lai: Chúng tôi hiện đang cung cấp các bản cập nhật này cho các nhánh android16-6.12android15-6.6 và sẽ mở rộng hỗ trợ cho các phiên bản GKI mới hơn, chẳng hạn như android17-6.18 sắp tới.

Đảm bảo độ ổn định

Một câu hỏi thường gặp về tính năng tối ưu hoá theo hồ sơ là liệu tính năng này có gây ra rủi ro về độ ổn định hay không. Vì AutoFDO chủ yếu ảnh hưởng đến các phương pháp phỏng đoán của trình biên dịch, chẳng hạn như nội tuyến hàm và bố cục mã, thay vì thay đổi logic của mã nguồn, nên tính năng này sẽ giữ nguyên tính toàn vẹn chức năng của kernel. Công nghệ này đã được chứng minh ở quy mô lớn, đóng vai trò là tính năng tối ưu hoá tiêu chuẩn cho các thư viện nền tảng Android, ChromeOS và cơ sở hạ tầng máy chủ của riêng Google trong nhiều năm.

Để đảm bảo hơn nữa hành vi nhất quán, chúng tôi áp dụng chiến lược "thận trọng theo mặc định". Các hàm không được thu thập trong hồ sơ có độ trung thực cao của chúng tôi được tối ưu hoá bằng các phương thức trình biên dịch tiêu chuẩn. Điều này đảm bảo rằng các phần "lạnh" hoặc hiếm khi được thực thi của kernel hoạt động chính xác như trong bản dựng tiêu chuẩn, ngăn chặn các lỗi hồi quy về hiệu suất hoặc hành vi không mong muốn trong các trường hợp đặc biệt.

Hướng đến tương lai

Chúng tôi hiện đang triển khai AutoFDO trên các nhánh android16-6.12android15-6.6. Ngoài việc triển khai ban đầu này, chúng tôi thấy một số hướng đi đầy hứa hẹn để nâng cao hơn nữa công nghệ này:

  • Mở rộng phạm vi tiếp cận: Chúng tôi mong muốn triển khai hồ sơ AutoFDO cho các phiên bản kernel GKI mới hơn và các mục tiêu bản dựng bổ sung ngoài khả năng hỗ trợ aarch64 hiện tại.
  • Tối ưu hoá mô-đun GKI: Hiện tại, tính năng tối ưu hoá của chúng tôi tập trung vào tệp nhị phân nhân hệ điều hành chính (vmlinux). Việc mở rộng AutoFDO sang các mô-đun GKI có thể mang lại lợi ích về hiệu suất cho một phần lớn hơn của hệ thống con nhân hệ điều hành.
  • Hỗ trợ mô-đun nhà cung cấp: Chúng tôi cũng quan tâm đến việc hỗ trợ AutoFDO cho các mô-đun nhà cung cấp được xây dựng bằng Bộ phát triển trình điều khiển (DDK). Với khả năng hỗ trợ đã có trong hệ thống xây dựng (Kleaf) và các công cụ lập hồ sơ (simpleperf), điều này cho phép các nhà cung cấp áp dụng các kỹ thuật tối ưu hoá tương tự cho các trình điều khiển phần cứng cụ thể của họ.
  • Phạm vi bao phủ hồ sơ rộng hơn: Có khả năng thu thập hồ sơ từ nhiều Hành trình trọng yếu của người dùng (CUJ) hơn để tối ưu hoá các hồ sơ đó.

Bằng cách đưa AutoFDO vào kernel Android, chúng tôi đảm bảo rằng nền tảng cơ bản của hệ điều hành được tối ưu hoá cho cách bạn sử dụng thiết bị của mình mỗi ngày.

Tác giả:

Tiếp tục đọc