Trình nền giám sát bộ nhớ quy trình

Android 17 trở lên hỗ trợ trình nền giám sát bộ nhớ quy trình (PMGD), giúp bảo vệ tình trạng hệ thống và trải nghiệm người dùng bằng cách chủ động quản lý mức sử dụng bộ nhớ theo từng quy trình. Trình nền này cải thiện độ ổn định tổng thể của thiết bị bằng cách thực thi trần bộ nhớ một cách hiệu quả trên các quy trình mục tiêu cụ thể, xác minh rằng các rò rỉ hoặc đột biến bộ nhớ riêng lẻ không gây ra tình trạng suy giảm hiệu suất trên toàn hệ thống.

Trong khi các chương trình diệt quy trình thông thường trên toàn cầu chỉ hoạt động khi toàn bộ hệ thống chịu áp lực, thì PMGD lại có cách tiếp cận chi tiết. Trình nền đạt được điều này bằng cách giám sát các giá trị bộ nhớ Control Group v2 cho các quy trình mục tiêu. Khi một quy trình được nhắm đến vượt quá giới hạn bộ nhớ đã định cấu hình, pmgd sẽ xử lý các trường hợp vi phạm giới hạn bằng cách ghi nhật ký các atom bộ nhớ Statsd trước khi chấm dứt quy trình.

Cách hoạt động

Trình nền này sử dụng inotify để theo dõi các sự kiện áp lực bộ nhớ (cụ thể là hoạt động sử dụng bộ nhớ cao bằng cách sử dụng memory.events). Khi một quy trình được giám sát kích hoạt sự kiện bộ nhớ, pmgd sẽ thực hiện các thao tác sau:

  1. Kiểm tra bộ nhớ ẩn danh: Đánh giá bộ nhớ ẩn danh của quy trình. Nếu vượt quá anon_limit_in_mb đã định cấu hình, pmgd sẽ huỷ ngay lập tức quy trình.
  2. Thời gian chờ thu hồi: Nếu bộ nhớ ẩn danh nằm dưới giới hạn bộ nhớ ẩn danh được chỉ định, pmgd sẽ chờ thời gian ân hạn thu hồi hệ thống (reclaim_wait_time_secs).
  3. Đánh giá bộ nhớ sau khi thu hồi: Nếu memory.current của quy trình mục tiêu vẫn lớn hơn hoặc bằng memory.high sau thời gian ân hạn, hoặc bộ nhớ ẩn danh vượt quá anon_limit_in_mb, pmgd sẽ loại bỏ quy trình ngay lập tức.

Quá trình này diễn ra liên tục cho đến khi quy trình bị loại bỏ hoặc việc thu hồi trên quy trình làm giảm mức sử dụng bộ nhớ xuống dưới giới hạn bộ nhớ đã chỉ định.

Các tính năng sức khoẻ của hệ thống

  • Giới hạn tốc độ khởi động lại: Để ngăn chặn vòng lặp khởi động hoặc sự cố liên tục, pmgd theo dõi các quy trình bị loại bỏ trong /data/misc/pmgd/history.json. Trình nền này giới hạn các quy trình ở một lần huỷ do pmgd khởi tạo cho mỗi lần khởi động lại thiết bị.

Cấu hình SELinux

Khả năng giám sát các quy trình của PMGD bị hạn chế theo chính sách SELinux. Nếu bạn định cấu hình PMGD để theo dõi một quy trình mà chính sách không cho phép miền của quy trình đó (chẳng hạn như quy trình hệ thống dành riêng cho nhà cung cấp), thì PMGD sẽ không thể theo dõi quy trình đó và bạn có thể thấy các lệnh từ chối SELinux trong logcat.

Để cho phép PMGD giám sát các quy trình trong các miền bổ sung, bạn phải mở rộng các quyền của PMGD bằng cách cập nhật chính sách SELinux dành riêng cho thiết bị cho PMGD.

Sau đây là ví dụ về tệp device/<vendor>/<device>/sepolicy/pmgd.te giúp thêm quyền truy cập vào một miền mới:

# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)

Để biết thêm thông tin về cách viết chính sách dành riêng cho thiết bị, hãy xem phần Triển khai SELinux.

Cấu hình do nhà cung cấp xác định

Cấu hình PMGD do nhà cung cấp điều khiển, được định cấu hình bằng tệp JSON bắt buộc /vendor/etc/pmgd/config.json. Thao tác này liệt kê các quy trình cần theo dõi, hồ sơ giới hạn bộ nhớ đã định cấu hình của các quy trình đó (sử dụng hồ sơ tác vụ cgroup) và giới hạn bộ nhớ ẩn cố định tính bằng megabyte.

Các trường cấu hình của nhà cung cấp

Cấu hình JSON được cung cấp là danh sách các quy trình và giới hạn của các quy trình đó, được xác định bằng các trường sau:

Trường Loại Bắt buộc Mô tả Mặc định
target_cmd Chuỗi Tên lệnh của quy trình mục tiêu cần theo dõi, ví dụ: system_server. Không áp dụng
uid Số nguyên Không Mã nhận dạng người dùng (UID) của quy trình. Nếu bạn bỏ qua, pmgd sẽ áp dụng quy tắc này trên toàn cầu cho mọi quy trình khớp với target_cmd. Không áp dụng
reclaim_wait_time_secs Số nguyên Không Khoảng thời gian gia hạn tính bằng giây để hệ thống đợi thu hồi bộ nhớ trước khi đánh giá lại giới hạn bộ nhớ. 5
mem_limit_profile Chuỗi Tên của hồ sơ tác vụ cgroup đặt "memory.high". Thông số này dùng để đặt giới hạn bộ nhớ của quy trình. Không áp dụng
anon_limit_in_mb Số nguyên Giới hạn bộ nhớ ẩn tối đa tính bằng megabyte. Nếu mức sử dụng bộ nhớ ẩn danh vượt quá giá trị này, pmgd sẽ nhanh chóng loại bỏ quy trình. Không áp dụng
additional_task_profiles Danh sách chuỗi Không Danh sách mọi hồ sơ tác vụ bổ sung mà pmgd áp dụng cho quy trình khi bắt đầu giám sát. Danh sách trống

Sau đây là ví dụ về cấu hình của hồ sơ tác vụ cgroup trong vendor/etc/task_profiles.json:

{
  "Attributes": [
    ...
    {
      "Name": "MemHigh",
      "Controller": "memory",
      "File": "memory.high"
    }
  ],
  "Profiles": [
    {
      "Name": "SystemServerMemoryHighLimit",
      "Actions": [
        {
          "Name": "SetAttribute",
          "Params":
          {
            "Name": "MemHigh",
            "Value": "1080M"
          }
        }
      ]
    }
  ]
}

Sau đây là một ví dụ về cấu hình PMGD trong vendor/etc/pmgd/config.json:

{
  "targets": [
    {
      "target_cmd": "system_server",
      "uid": 1000,
      "reclaim_wait_time_secs": 5,
      "mem_limit_profile": "SystemServerMemoryHighLimit",
      "anon_limit_in_mb": 300
    }
  ]
}