Trình nền đóng các tiến trình ít cần thiết khi còn ít dung lượng

Tiến trình trình nền (daemon) low memory killer (LMK) của Android (lmkd) giám sát trạng thái bộ nhớ của một hệ thống Android đang chạy và phản ứng với tình trạng áp lực bộ nhớ cao bằng cách loại bỏ các tiến trình ít quan trọng nhất để duy trì hiệu suất của hệ thống ở mức chấp nhận được.

Giới thiệu về tình trạng áp lực bộ nhớ

Một hệ thống Android chạy nhiều tiến trình song song có thể gặp phải tình huống khi bộ nhớ hệ thống cạn kiệt và các tiến trình cần nhiều bộ nhớ hơn sẽ bị chậm trễ đáng kể. Tình trạng áp lực bộ nhớ là trạng thái mà hệ thống sắp hết bộ nhớ. Tình trạng này yêu cầu Android giải phóng bộ nhớ (để giảm bớt áp lực) bằng cách điều tiết hoặc loại bỏ các tiến trình không quan trọng, yêu cầu các tiến trình giải phóng tài nguyên được lưu vào bộ nhớ đệm không quan trọng, v.v.

Trước đây, Android giám sát tình trạng áp lực bộ nhớ hệ thống bằng trình điều khiển low memory killer (LMK) trong kernel, một cơ chế cứng nhắc phụ thuộc vào các giá trị được mã hoá cứng. Kể từ kernel 4.12, trình điều khiển LMK đã bị xoá khỏi kernel ngược dòng và lmkd trong không gian người dùng thực hiện các tác vụ giám sát bộ nhớ và loại bỏ tiến trình.

Thông tin về tình trạng tắc nghẽn do áp lực

Android 10 trở lên hỗ trợ chế độ lmkd mới sử dụng các trình giám sát thông tin về tình trạng tắc nghẽn do áp lực (PSI) của kernel để phát hiện tình trạng áp lực bộ nhớ. Bộ vá PSI trong kernel ngược dòng (được chuyển ngược về kernel 4.9 và 4.14) đo lường khoảng thời gian các tác vụ bị trì hoãn do thiếu bộ nhớ. Vì những sự chậm trễ này ảnh hưởng trực tiếp đến trải nghiệm người dùng, nên chúng thể hiện một chỉ số thuận tiện để xác định mức độ nghiêm trọng của tình trạng áp lực bộ nhớ. Kernel ngược dòng cũng bao gồm các trình giám sát PSI cho phép các tiến trình trong không gian người dùng có đặc quyền (chẳng hạn như lmkd) chỉ định ngưỡng cho những sự chậm trễ này và đăng ký các sự kiện từ kernel khi một ngưỡng bị vi phạm.

Trình giám sát PSI so với tín hiệu vmpressure

Vì các tín hiệu vmpressure (do kernel tạo để phát hiện tình trạng áp lực bộ nhớ và được lmkd sử dụng) thường bao gồm nhiều kết quả dương tính giả, nên lmkd phải thực hiện quá trình lọc để xác định xem bộ nhớ có thực sự chịu áp lực hay không. Điều này dẫn đến việc lmkd thức dậy không cần thiết và sử dụng thêm tài nguyên tính toán. Việc sử dụng trình giám sát PSI giúp phát hiện tình trạng áp lực bộ nhớ chính xác hơn và giảm thiểu chi phí lọc.

Sử dụng trình giám sát PSI

Để sử dụng trình giám sát PSI thay vì các sự kiện vmpressure, hãy định cấu hình thuộc tính ro.lmk.use_psi. Giá trị mặc định là true, giúp trình giám sát PSI trở thành cơ chế phát hiện tình trạng áp lực bộ nhớ mặc định cho lmkd. Vì trình giám sát PSI yêu cầu hỗ trợ kernel, nên kernel phải bao gồm các bản vá chuyển ngược PSI và được biên dịch khi bật tính năng hỗ trợ PSI (CONFIG_PSI=y).

Nhược điểm của trình điều khiển LMK trong kernel

Android ngừng sử dụng trình điều khiển LMK do một số vấn đề, bao gồm:

  • Các thiết bị có RAM thấp phải được điều chỉnh một cách tích cực và ngay cả khi đó, hiệu suất của chúng cũng sẽ kém khi xử lý các khối lượng công việc có bộ nhớ đệm trang hoạt động được sao lưu bằng tệp lớn. Hiệu suất kém dẫn đến tình trạng giật lag và không loại bỏ được tiến trình nào.
  • Trình điều khiển kernel LMK dựa vào giới hạn bộ nhớ trống, không có khả năng điều chỉnh dựa trên tình trạng áp lực bộ nhớ.
  • Do tính cứng nhắc của thiết kế, các đối tác thường tuỳ chỉnh trình điều khiển để trình điều khiển này hoạt động trên thiết bị của họ.
  • Trình điều khiển LMK được kết nối với API thu nhỏ slab, API này không được thiết kế cho các hoạt động nặng như tìm kiếm mục tiêu và loại bỏ chúng, điều này làm chậm tiến trình vmscan.

lmkd trong không gian người dùng

lmkd trong không gian người dùng triển khai cùng chức năng với trình điều khiển trong kernel nhưng sử dụng các cơ chế kernel hiện có để phát hiện và ước tính tình trạng áp lực bộ nhớ. Các cơ chế như vậy bao gồm việc sử dụng các sự kiện vmpressure do kernel tạo hoặc trình giám sát thông tin về tình trạng tắc nghẽn do áp lực (PSI) để nhận thông báo về mức độ áp lực bộ nhớ và sử dụng các tính năng cgroup bộ nhớ để giới hạn tài nguyên bộ nhớ được phân bổ cho mỗi tiến trình dựa trên mức độ quan trọng của tiến trình.

Sử dụng lmkd trong không gian người dùng trong Android 10

Trong Android 9 trở lên, lmkd trong không gian người dùng sẽ kích hoạt nếu không phát hiện thấy trình điều khiển LMK trong kernel. Vì lmkd trong không gian người dùng yêu cầu hỗ trợ kernel cho cgroup bộ nhớ, nên kernel phải được biên dịch với các chế độ cài đặt cấu hình sau:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Chiến lược loại bỏ

lmkd trong không gian người dùng hỗ trợ các chiến lược loại bỏ dựa trên các sự kiện vmpressure hoặc trình giám sát PSI, mức độ nghiêm trọng của chúng và các gợi ý khác như mức sử dụng bộ nhớ ảo. Các chiến lược loại bỏ khác nhau giữa các thiết bị có bộ nhớ thấp và hiệu suất cao:

  • Trên các thiết bị có bộ nhớ thấp, hệ thống sẽ chịu được tình trạng áp lực bộ nhớ cao hơn như một chế độ hoạt động bình thường.
  • Trên các thiết bị có hiệu suất cao, tình trạng áp lực bộ nhớ nên được xem là một tình huống bất thường và cần được khắc phục trước khi ảnh hưởng đến hiệu suất tổng thể.

Bạn có thể định cấu hình chiến lược loại bỏ bằng cách sử dụng thuộc tính ro.config.low_ram.

lmkd trong không gian người dùng cũng hỗ trợ chế độ cũ, trong đó chế độ này đưa ra quyết định loại bỏ bằng cách sử dụng các chiến lược tương tự như trình điều khiển LMK trong kernel (tức là ngưỡng bộ nhớ trống và bộ nhớ đệm tệp). Để bật chế độ cũ, hãy đặt thuộc tính ro.lmk.use_minfree_levels thành true.

Định cấu hình lmkd

Định cấu hình lmkd cho một thiết bị cụ thể bằng cách sử dụng các thuộc tính sau.

Thuộc tính Sử dụng Mặc định
ro.config.low_ram Chỉ định xem thiết bị là thiết bị có RAM thấp hay hiệu suất cao. false
ro.lmk.use_psi Sử dụng trình giám sát PSI (thay vì các sự kiện vmpressure). true
ro.lmk.use_minfree_levels Sử dụng ngưỡng bộ nhớ trống và bộ nhớ đệm tệp để đưa ra quyết định loại bỏ tiến trình (tức là khớp với chức năng của trình điều khiển LMK trong kernel ). false
ro.lmk.low Điểm oom_adj tối thiểu cho các tiến trình đủ điều kiện bị loại bỏ ở mức vmpressure thấp. 1001
(đã tắt)
ro.lmk.medium Điểm oom_adj tối thiểu cho các tiến trình đủ điều kiện bị loại bỏ ở mức vmpressure trung bình. 800
(các dịch vụ được lưu vào bộ nhớ đệm hoặc không cần thiết)
ro.lmk.critical Điểm oom_adj tối thiểu cho các tiến trình đủ điều kiện bị loại bỏ ở mức vmpressure nghiêm trọng. 0
(mọi tiến trình)
ro.lmk.critical_upgrade Bật tính năng nâng cấp lên mức nghiêm trọng. false
ro.lmk.upgrade_pressure `mem_pressure` tối đa mà mức này được nâng cấp vì hệ thống đang hoán đổi quá nhiều.mem_pressure 100
(đã tắt)
ro.lmk.downgrade_pressure `mem_pressure` tối thiểu mà sự kiện vmpressure bị bỏ qua vì vẫn còn đủ bộ nhớ trống.mem_pressure 100
(đã tắt)
ro.lmk.kill_heaviest_task Loại bỏ tác vụ đủ điều kiện nặng nhất (quyết định tốt nhất) so với bất kỳ tác vụ đủ điều kiện nào (quyết định nhanh chóng). false
ro.lmk.kill_timeout_ms Thời lượng tính bằng mili giây sau khi loại bỏ tiến trình mà không có tiến trình nào khác bị loại bỏ. 0
(đã tắt)
ro.lmk.debug Bật nhật ký gỡ lỗi lmkd. false

Ví dụ về cấu hình thiết bị:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.lmk.low=1001 \
    ro.lmk.medium=800 \
    ro.lmk.critical=0 \
    ro.lmk.critical_upgrade=false \
    ro.lmk.upgrade_pressure=100 \
    ro.lmk.downgrade_pressure=100 \
    ro.lmk.kill_heaviest_task=true

lmkd trong không gian người dùng trong Android 11

Android 11 cải thiện lmkd bằng cách giới thiệu một chiến lược loại bỏ mới. Chiến lược loại bỏ sử dụng cơ chế PSI để phát hiện tình trạng áp lực bộ nhớ được giới thiệu trong Android 10. lmkd trong Android 11 tính đến mức sử dụng tài nguyên bộ nhớ và tình trạng giật lag để ngăn tình trạng thiếu bộ nhớ và giảm hiệu suất. Chiến lược loại bỏ này thay thế các chiến lược trước đó và có thể được sử dụng trên cả thiết bị có hiệu suất cao và thiết bị có RAM thấp (Android Go).

Yêu cầu về kernel

Đối với các thiết bị Android 11, lmkd yêu cầu các tính năng kernel sau:

  • Bao gồm các bản vá PSI và bật PSI (các bản chuyển ngược có trong kernel chung của Android 4.9, 4.14 và 4.19).
  • Bao gồm các bản vá hỗ trợ PIDFD (các bản chuyển ngược có trong kernel chung của Android 4.9, 4.14 và 4.19).
  • Đối với các thiết bị có RAM thấp, hãy bao gồm cgroup bộ nhớ.

Kernel phải được biên dịch với các chế độ cài đặt cấu hình sau:

CONFIG_PSI=y

Định cấu hình lmkd trong Android 11

Chiến lược loại bỏ bộ nhớ trong Android 11 hỗ trợ các nút điều chỉnh và giá trị mặc định được liệt kê bên dưới. Các tính năng này hoạt động trên cả thiết bị có hiệu suất cao và thiết bị có RAM thấp.

Thuộc tính Sử dụng Mặc định
Hiệu suất cao RAM thấp
ro.lmk.psi_partial_stall_ms Ngưỡng tắc nghẽn PSI một phần (tính bằng mili giây) để kích hoạt thông báo bộ nhớ thấp. Nếu thiết bị nhận được thông báo về tình trạng áp lực bộ nhớ quá muộn, hãy giảm giá trị này để kích hoạt thông báo sớm hơn. Nếu thông báo về tình trạng áp lực bộ nhớ kích hoạt không cần thiết, hãy tăng giá trị này để thiết bị ít nhạy cảm hơn với nhiễu. 70 200
ro.lmk.psi_complete_stall_ms Ngưỡng tắc nghẽn PSI hoàn chỉnh (tính bằng mili giây) để kích hoạt thông báo bộ nhớ nghiêm trọng. Nếu thiết bị nhận được thông báo về tình trạng áp lực bộ nhớ nghiêm trọng quá muộn, hãy giảm giá trị này để kích hoạt thông báo sớm hơn. Nếu thông báo về tình trạng áp lực bộ nhớ nghiêm trọng kích hoạt không cần thiết, hãy tăng giá trị này để thiết bị ít nhạy cảm hơn với nhiễu. 700
ro.lmk.thrashing_limit Số lượng tối đa các lỗi refault workingset tính bằng tỷ lệ phần trăm của tổng kích thước bộ nhớ đệm trang được sao lưu bằng tệp. Các lỗi refault workingset vượt quá giá trị này có nghĩa là hệ thống được coi là đang trong tình trạng đơ máy bộ nhớ đệm trang. Nếu hiệu suất của thiết bị bị ảnh hưởng trong tình trạng áp lực bộ nhớ, hãy giảm giá trị này để hạn chế tình trạng giật lag. Nếu hiệu suất của thiết bị bị loại bỏ không cần thiết vì lý do giật lag, hãy tăng giá trị này để cho phép giật lag nhiều hơn. 100 30
ro.lmk.thrashing_limit_decay Mức giảm ngưỡng tình trạng đơ máy được biểu thị bằng tỷ lệ phần trăm của ngưỡng ban đầu dùng để giảm ngưỡng khi hệ thống không khôi phục, ngay cả sau khi loại bỏ tiến trình. Nếu tình trạng đơ máy liên tục tạo ra các tiến trình bị loại bỏ không cần thiết, hãy giảm giá trị này. Nếu phản hồi đối với tình trạng đơ máy liên tục sau khi loại bỏ tiến trình quá chậm, hãy tăng giá trị này. 10 50
ro.lmk.swap_util_max Số lượng tối đa bộ nhớ được hoán đổi tính bằng tỷ lệ phần trăm của tổng bộ nhớ có thể hoán đổi. Khi bộ nhớ được hoán đổi tăng quá giới hạn này, điều đó có nghĩa là hệ thống đã hoán đổi hầu hết bộ nhớ có thể hoán đổi và vẫn chịu áp lực. Điều này có thể xảy ra khi các phân bổ không thể hoán đổi đang tạo ra tình trạng áp lực bộ nhớ mà không thể giảm bớt bằng cách hoán đổi vì hầu hết bộ nhớ có thể hoán đổi đã được hoán đổi. Giá trị mặc định là 100, giá trị này sẽ vô hiệu hoá việc kiểm tra này. Nếu hiệu suất của thiết bị bị ảnh hưởng trong tình trạng áp lực bộ nhớ trong khi mức sử dụng bộ nhớ ảo cao và mức hoán đổi trống không giảm xuống ro.lmk.swap_free_low_percentage, hãy giảm giá trị này để hạn chế mức sử dụng bộ nhớ ảo. 100 100

Các nút điều chỉnh cũ sau đây cũng hoạt động với chiến lược loại bỏ mới.

Thuộc tính Sử dụng Mặc định
Hiệu suất cao RAM thấp
ro.lmk.swap_free_low_percentage Mức hoán đổi trống tính bằng tỷ lệ phần trăm của tổng dung lượng hoán đổi. `lmkd` sử dụng giá trị này làm ngưỡng để xem hệ thống có thiếu dung lượng hoán đổi hay không. Nếu `lmkd` loại bỏ tiến trình khi có quá nhiều dung lượng trong bộ nhớ ảo, hãy giảm tỷ lệ phần trăm. Nếu `lmkd` loại bỏ tiến trình quá muộn, cho phép các tiến trình OOM bị loại bỏ, hãy tăng tỷ lệ phần trăm. 20 10
ro.lmk.debug Tính năng này bật nhật ký gỡ lỗi `lmkd`. Bật tính năng gỡ lỗi trong khi điều chỉnh. false