Trình nền đóng các tiến trình bộ nhớ thấp

Quá 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 theo dõi trạng thái bộ nhớ của hệ thống Android đang chạy và phản ứng với áp lực bộ nhớ cao bằng cách đóng các quy trình ít cần thiết 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ề áp lực bộ nhớ

Một hệ thống Android chạy nhiều quy trình song song có thể gặp phải tình huống khi bộ nhớ hệ thống đã hết và các quy trình đòi hỏi nhiều độ trễ đáng kể hơn về trải nghiệm bộ nhớ. Áp lực bộ nhớ, trạng thái trong đó 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 tài nguyên không quan trọng trong bộ nhớ đệm, v.v.

Trước đây, Android theo dõi áp lực bộ nhớ của hệ thống bằng cách sử dụng một trình điều khiển tiêu diệt bộ nhớ thấp (LMK) trong nhân, một cơ chế cố định phụ thuộc vào các giá trị được cố định giá trị trong mã. Kể từ kernel 4.12, trình điều khiển LMK sẽ bị xoá khỏi kernel thượng nguồn và không gian người dùng lmkd 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 mất áp suất

Android 10 trở lên hỗ trợ chế độ lmkd mới sử dụng màn hình thông tin về tình trạng tắc nghẽn áp lực hạt nhân (PSI) để phát hiện áp lực bộ nhớ. Bộ bản vá PSI trong hạt nhân ngược dòng (đã điều chỉnh cho phiên bản cũ cho hạt 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ớ. Nhân hệ điều hành ngược (upstream) cũng bao gồm các màn hình PSI cho phép các quy trình đặc quyền của không gian người dùng (chẳng hạn như lmkd) để chỉ định các ngưỡng cho những độ trễ này và đăng ký các sự kiện từ nhân hệ điều hành khi một ngưỡng bị vi phạm.

Màn hình PSI so với tín hiệu vmpressure

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

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

Để sử dụng trình quan sát 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 theo dõi cơ chế mặc định của việc phát hiện áp lực bộ nhớ cho lmkd. Vì các trình theo dõi PSI yêu cầu hỗ trợ hạt nhân, nên hạt nhân phải bao gồm các bản vá điều chỉnh cho phiên bản cũ của PSI và được biên dịch với tính năng hỗ trợ PSI được bật (CONFIG_PSI=y).

Nhược điểm của trình điều khiển LMK trong hạt nhân

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ó dung lượng RAM thấp phải được điều chỉnh mạnh mẽ và ngay cả khi đó, hiệu suất vẫn kém trên các khối lượng công việc có bộ nhớ đệm trang đang hoạt động được hỗ trợ bằng tệp lớn. Hiệu suất kém dẫn đến tình trạng đơ máy và không có lượt loại bỏ.
  • Trình điều khiển hạt nhân LMK dựa vào các giới hạn bộ nhớ trống, không điều chỉnh theo á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 đã kết nối với API trình thu gọn slab (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ỏ chúng) khiến quá trình vmscan bị chậm.

Userspace lmkd

lmkd 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 hạt nhân nhưng sử dụng các cơ chế hạt nhân hiện có để 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 hạt nhân tạo ra hoặc trình quan sát thông tin về tình trạng tắc nghẽn áp lực (PSI) để nhận thông báo về mức áp lực bộ nhớ, cũng như 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 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, không gian người dùng lmkd sẽ kích hoạt nếu không phát hiện thấy trình điều khiển LMK trong hạt nhân. Vì không gian người dùng lmkd yêu cầu hỗ trợ hạt nhân cho các nhóm bộ nhớ, nên hạt nhân 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 loại bỏ

Userspace lmkd 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 quan sát PSI, mức độ nghiêm trọng của các sự kiện đó và các gợi ý khác như mức sử dụng vùng hoán đổi. Các chiến lược loại bỏ khác nhau giữa 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ớ phải được xem là một tình huống bất thường và đượ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 thuộc tính ro.config.low_ram. Để biết thông tin chi tiết, hãy xem phần Cấu hình ram thấp.

Không gian người dùng lmkd cũng hỗ trợ chế độ cũ, trong đó đưa ra quyết định loại bỏ bằng cách sử dụng các chiến lược giống như trình điều khiển LMK trong hạt nhân (tức là bộ nhớ trống và ngưỡng 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á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ó dung lượng RAM thấp hay hiệu suất cao. false
ro.lmk.use_psi Sử dụng màn hình PSI (thay vì các sự kiện vmpressure). true
ro.lmk.use_minfree_levels Sử dụng bộ nhớ trống và ngưỡng bộ nhớ đệm tệp để đưa ra quyết định loại bỏ quy trình (tức là khớp với chức năng của trình điều khiển LMK trong hạt 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ị loại bỏ ở 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ị loại bỏ ở cấp vmpressure trung bình. 800
(các dịch vụ không cần thiết hoặc đã lưu vào bộ nhớ đệm)
ro.lmk.critical Điểm oom_adj tối thiểu cho các quy trình đủ điều kiện bị loại bỏ ở cấp vmpressure nghiêm trọng. 0
(bất kỳ quy trình nào)
ro.lmk.critical_upgrade Bật tính năng nâng cấp lên cấp độ nghiêm 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 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 khác (quyết định nhanh). false
ro.lmk.kill_timeout_ms Thời lượng tính bằng mili giây sau khi loại bỏ một ứng dụng khi không có ứng dụng 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 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 buộc tắt 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 và tình trạng đơ tài nguyên bộ nhớ để ngăn tình trạng thiếu hụt bộ nhớ và suy 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ó dung lượng RAM thấp (Android Go).

Yêu cầu về hạt nhân

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

  • Bao gồm các bản vá PSI và bật PSI (điều chỉnh cho phiên bản cũ có trong các nhân Android phổ biến 4.9, 4.14 và 4.19).
  • Bao gồm các bản vá hỗ trợ PIDFD (có bản vá ngược trong các nhân Android phổ biến 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 các nhóm bộ nhớ.

Nhân 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ó dung lượng RAM thấp.

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

Các nút điều chỉnh cũ dưới đây cũng hoạt động với chiến thuật giết người mới.

Thuộc tính Mục đích sử dụng Mặc định
Hiệu suất cao Dung lượng RAM thấp
ro.lmk.swap_free_low_percentage Mức hoán đổi miễn phí dưới dạng phần trăm của tổng không gian hoán đổi. "lmkd" sử dụng giá trị này làm ngưỡng để xác định thời điểm coi hệ thống là không gian hoán đổi bị thiếu. Nếu `lmkd` bị huỷ trong khi có quá nhiều không gian trong vùng hoán đổi, hãy giảm tỷ lệ phần trăm. Nếu quá trình loại bỏ `lmkd` diễn ra quá muộn, cho phép quá trình loại bỏ 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 tính năng gỡ lỗi trong khi điều chỉnh. false