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

Quy trình trình nền đóng các tiến trình ít cần thiết khi còn ít dung lượng (lmkd) của Android sẽ giám sát trạng thái bộ nhớ của hệ thống Android đang chạy và phản ứng với tình trạng bộ nhớ bị quá tải bằng cách đóng các tiến trình ít cần thiết nhất để hệ thống hoạt động ở mức chấp nhận được.

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

Hệ thống Android chạy song song nhiều quy trình có thể gặp phải các trường hợp khi bộ nhớ hệ thống bị cạn kiệt và các quy trình yêu cầu nhiều bộ nhớ hơn sẽ bị trễ đáng kể. Áp lực về bộ nhớ là trạng thái mà hệ thống sắp hết bộ nhớ, yêu cầu Android giải phóng bộ nhớ (để giảm áp lực) bằng cách điều tiết hoặc loại bỏ các quy trình không quan trọng, yêu cầu các quy trình giải phóng các 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 áp lực bộ nhớ hệ thống bằng trình điều khiển low memory killer (LMK) trong nhân, một cơ chế cứng nhắc phụ thuộc vào các giá trị được mã hoá cứng. Kể từ nhân 4.12, trình điều khiển LMK sẽ bị xoá khỏi nhân thượng nguồn và lmkd không gian người dùng sẽ thực hiện các tác vụ giám sát bộ nhớ và loại bỏ quy trình.

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

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 của nhân (PSI) để phát hiện áp lực bộ nhớ. PSI patchset trong nhân nguồn mở (được chuyển ngược về các nhân 4.9 và 4.14) đo lường khoảng thời gian các tác vụ bị trì hoãn do tình trạng thiếu bộ nhớ. Vì những độ trễ này ảnh hưởng trực tiếp đến trải nghiệm người dùng, nên chúng là một chỉ số thuận tiện để xác định mức độ nghiêm trọng của áp lực bộ nhớ. Hạt nhân thượng nguồn cũng bao gồm các màn hình PSI cho phép các quy trình không gian người dùng có đặc quyền (chẳng hạn như lmkd) chỉ định ngưỡng cho những độ trễ này và đăng ký nhận các sự kiện từ hạt nhân khi một ngưỡng bị vi phạm.

PSI theo dõi so với tín hiệu áp suất

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

Sử dụng các màn hình PSI

Để sử dụng các màn hình PSI thay vì 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 PSI trở thành cơ chế mặc định để phát hiện áp lực bộ nhớ cho lmkd. Vì các màn hình PSI yêu cầu hỗ trợ của nhân, nên nhân phải có 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 nhân

Android không 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 mạnh mẽ, và ngay cả khi đó, chúng vẫn hoạt động kém hiệu quả trên các khối lượng công việc có pagecache đang hoạt động được sao lưu bằng tệp lớn. Hiệu suất kém dẫn đến việc không có mạng nào bị hạ gục.
  • Trình điều khiển LMK kernel dựa vào giới hạn bộ nhớ trống, không có khả năng mở rộng dựa trên áp lực bộ nhớ.
  • Do thiết kế cứng nhắc, các đối tác thường tuỳ chỉnh trình điều khiển để trình điều khiển 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 giảm kích thước khối, không được thiết kế cho các thao tác nặng như tìm kiếm mục tiêu và loại bỏ mục tiêu. Điều này làm chậm quá trình vmscan.

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

lmkd của không gian người dùng triển khai chức năng tương tự như trình điều khiển trong nhân nhưng sử dụng các cơ chế hiện có của nhân để phát hiện và ước tính á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 nhân tạo hoặc 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) để nhận thông báo về các mức áp lực bộ nhớ và sử dụng các tính năng nhóm kiểm soát bộ nhớ để giới hạn tài nguyên bộ nhớ được phân bổ cho từng quy trình dựa trên mức độ quan trọng của quy trình.

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

Trong Android 9 trở lên, lmkd 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 nhân. Vì không gian người dùng lmkd yêu cầu kernel hỗ trợ các nhóm kiểm soát bộ nhớ, nên kernel phải được biên dịch bằng 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 chấm dứt

Userspace lmkd hỗ trợ các chiến lược tắt dựa trên các sự kiện vmpressure hoặc các màn hình PSI, mức độ nghiêm trọng và các gợi ý khác như mức sử dụng trao đổi. Chiến lược tắt ứng dụng khác nhau giữa các thiết bị có bộ nhớ thấp và thiết bị có hiệu suất cao:

  • Trên các thiết bị có bộ nhớ thấp, hệ thống phải chịu được á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, á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 kết thúc bằng cách sử dụng thuộc tính ro.config.low_ram.

lmkd của không gian người dùng cũng hỗ trợ một chế độ cũ, trong đó chế độ này đưa ra quyết định kết thúc 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 nhân (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 Mục đích sử dụng Mặc định
ro.config.low_ram Chỉ định xem thiết bị có RAM thấp hay hiệu suất cao. false
ro.lmk.use_psi Sử dụng các màn hình PSI (thay vì sự kiện vmpressure). true
ro.lmk.use_minfree_levels Sử dụng các ngưỡng bộ nhớ trống và bộ nhớ đệm tệp để đưa ra quyết định loại bỏ quy trình (tức là khớp chức năng của trình điều khiển LMK trong nhân). false
ro.lmk.low Điểm oom_adj tối thiểu cho các quy trình đủ điều kiện bị huỷ ở cấp vmpressure thấp. 1001
(đã tắt)
ro.lmk.medium Điểm oom_adj tối thiểu cho các quy trình đủ điều kiện bị huỷ ở cấp độ 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 quy trình đủ điều kiện bị huỷ ở cấp độ vmpressure quan trọng. 0
(mọi quy trình)
ro.lmk.critical_upgrade Bật chế độ nâng cấp lên cấp độ quan trọng. false
ro.lmk.upgrade_pressure mem_pressure tối đa mà cấp độ được nâng cấp vì hệ thống đang hoán đổi quá nhiều. 100
(đã tắt)
ro.lmk.downgrade_pressure mem_pressure tối thiểu mà tại đó sự kiện vmpressure bị bỏ qua vì vẫn còn đủ bộ nhớ trống. 100
(đã tắt)
ro.lmk.kill_heaviest_task Huỷ tác vụ đủ điều kiện có mức sử dụng bộ nhớ cao 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). false
ro.lmk.kill_timeout_ms Thời lượng tính bằng mili giây sau khi huỷ mà không có thêm lệnh huỷ nào được thực hiện. 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 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 áp lực bộ nhớ được giới thiệu trong Android 10. lmkd trong Android 11 tính đến các mức sử dụng tài nguyên bộ nhớ và hiện tượng thrashing để 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 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 sau của nhân:

  • Bao gồm các bản vá PSI và bật PSI (các bản vá ngược có trong các nhân 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 vá ngược có trong các nhân chung của Android 4.9, 4.14 và 4.19).
  • Đối với các thiết bị có dung lượng RAM thấp, hãy thêm cgroup bộ nhớ.

Bạn phải biên dịch nhân bằng 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à chế độ 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 Mục đích sử dụng Mặc định
Hiệu suất cao RAM thấp
ro.lmk.psi_partial_stall_ms Ngưỡng tạm dừng 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 á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 á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 hoàn thành PSI (chỉ số về tốc độ hệ thống) (tính bằng mili giây) để kích hoạt thông báo nguy cấp về bộ nhớ. Nếu thiết bị nhận được thông báo áp lực bộ nhớ quan 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 các thông báo áp lực bộ nhớ quan 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 truy cập lại workingset dưới dạng tỷ lệ phần trăm của tổng kích thước pagecache được hỗ trợ bằng tệp. Workingset refaults (lỗi truy cập lại vào tập hợp đang hoạt động) cao hơn giá trị này có nghĩa là hệ thống được coi là đang lãng phí bộ nhớ đệm trang. Nếu hiệu suất của thiết bị bị ảnh hưởng trong quá trình chịu áp lực bộ nhớ, hãy giảm giá trị này để hạn chế hiện tượng thrashing. Nếu hiệu suất của thiết bị bị giảm một cách không cần thiết vì lý do thrashing, hãy tăng giá trị để cho phép thrashing nhiều hơn. 100 30
ro.lmk.thrashing_limit_decay Mức suy giảm ngưỡng lặp lại đượ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 bị tắt. Nếu việc phân trang liên tục tạo ra các thao tác huỷ không cần thiết, hãy giảm giá trị này. Nếu phản hồi cho tình trạng liên tục truy cập dữ liệu sau khi một tiến trình bị huỷ quá chậm, hãy tăng giá trị này. 10 50
ro.lmk.swap_util_max Lượng bộ nhớ được hoán đổi tối đa dưới dạng tỷ lệ phần trăm của tổng bộ nhớ có thể hoán đổi. Khi bộ nhớ hoán đổi tăng lên quá giới hạn này, tức 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 hoạt động phân bổ không thể hoán đổi đang tạo á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, tức là vô hiệu hoá quy trình kiểm tra này. Nếu hiệu suất của thiết bị bị ảnh hưởng trong quá trình chịu áp lực bộ nhớ trong khi mức sử dụng bộ nhớ ảo cao và mức bộ nhớ ảo trống không giảm xuống ro.lmk.swap_free_low_percentage, hãy giảm giá trị để giới hạn mức sử dụng bộ nhớ ảo. 100 100

Các núm đ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 Mục đích sử dụng Mặc định
Hiệu suất cao RAM thấp
ro.lmk.swap_free_low_percentage Mức độ trao đổi miễn phí dưới dạng tỷ lệ phần trăm của tổng không gian trao đổi. `lmkd` sử dụng giá trị này làm ngưỡng để xem xét hệ thống khi thiếu không gian trao đổi. Nếu `lmkd` bị huỷ trong khi có quá nhiều dung lượng trong bộ nhớ hoán đổi, hãy giảm tỷ lệ phần trăm. Nếu `lmkd` kết thúc quá muộn, cho phép các lượt kết thúc OOM xảy ra, hãy tăng tỷ lệ phần trăm. 20 10
ro.lmk.debug Thao tác này sẽ bật nhật ký gỡ lỗi `lmkd`. Bật chế độ gỡ lỗi trong khi điều chỉnh. false