Daemon sát thủ bộ nhớ thấp

Quy trình daemon sát thủ bộ nhớ thấp của Android ( lmkd ) 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 áp lực bộ nhớ cao bằng cách loại bỏ các quy trình ít cần thiết nhất để giữ cho hệ thống hoạt động ở mức chấp nhận được.

Về áp lực bộ nhớ

Hệ thống Android chạy song song nhiều quy trình có thể gặp phải tình huống khi bộ nhớ hệ thống cạn kiệt và các quy trình yêu cầu nhiều bộ nhớ hơn gặp phải tình trạng chậm trễ đáng chú ý. Á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 bớt á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 trong bộ nhớ đệm không quan trọng, v.v.

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

Thông tin gian hàng áp lực

Android 10 trở lên hỗ trợ chế độ lmkd mới sử dụng màn hình thông tin ổn định áp suất lõi (PSI) để phát hiện áp suất bộ nhớ. Bộ vá PSI trong hạt nhân ngược dòng (được chuyển sang hạt nhân 4.9 và 4.14) đo lượng thời gian mà các tác vụ bị trì hoãn do 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à thước đo thuận tiện để xác định mức độ nghiêm trọng của áp lực bộ nhớ. Hạt nhân ngược dòng cũng bao gồm các trình giám sát PSI cho phép các quy trình không gian người dùng đặc quyền (chẳng hạn như lmkd ) chỉ định ngưỡng cho những độ trễ này và đăng ký các sự kiện từ hạt nhân khi ngưỡng bị vi phạm.

Màn hình PSI so với tín hiệu vmáp suất

Vì các tín hiệu vmpressure (do kernel tạo ra để phát hiện áp suất 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 lọc để xác định xem bộ nhớ có chịu áp lực thực 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 các tài nguyên tính toán bổ sung. Việc sử dụng màn hình PSI giúp phát hiện áp suất bộ nhớ chính xác hơn và giảm thiểu chi phí lọc.

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

Để sử dụng màn hình 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 , làm cho PSI giám sát cơ chế phát hiện áp suất bộ nhớ mặc định cho lmkd . Vì các màn hình PSI yêu cầu hỗ trợ kernel nên kernel phải bao gồm các bản vá backport PSI và được biên dịch với hỗ trợ PSI được bật ( CONFIG_PSI=y ).

Hạn chế của trình điều khiển LMK trong kernel

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ị RAM thấp phải được điều chỉnh mạnh mẽ và thậm chí sau đó sẽ hoạt động kém trên khối lượng công việc có bộ nhớ đệm hoạt động được hỗ trợ bằng tệp lớn. Màn trình diễn kém cỏi dẫn đến việc bị đập và không có điểm hạ gục.
  • Trình điều khiển hạt nhân LMK dựa trên giới hạn bộ nhớ trống, không chia tỷ lệ dựa trên áp suất bộ nhớ.
  • Do thiết kế cứng nhắc, các đối tác thường tùy chỉnh trình điều khiển để nó hoạt động trên thiết bị của họ.
  • Trình điều khiển LMK được nối vào API của công cụ thu gọn phiến, vốn không được thiết kế cho các hoạt động nặng như tìm kiếm và tiêu diệt mục tiêu, điều này làm chậm quá trình vmscan .

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

Không gian người dùng lmkd thực hiện chức năng tương tự như 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 áp lực bộ nhớ. Các cơ chế như vậy bao gồm sử dụng các sự kiện vmpressure do kernel tạo hoặc trình giám sát thông tin áp suất (PSI) để nhận thông báo về mức áp suất bộ nhớ và sử dụng các tính năng nhóm bộ nhớ để hạn chế tài nguyên bộ nhớ được phân bổ cho từng quy trình dựa trên tầm quan trọng của quy trình.

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

Trong Android 9 trở lên, lmkd vùng 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 hỗ trợ kernel cho các nhóm bộ nhớ nên kernel phải được biên dịch với các 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 tiêu diệt

Không gian người dùng lmkd hỗ trợ các chiến lược tiêu diệt dựa trên các sự kiện vmpressure hoặc màn hình PSI, mức độ nghiêm trọng của chúng và các gợi ý khác như việc sử dụng trao đổi. Chiến lược tiêu diệt 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 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ị hiệu suất cao, áp lực bộ nhớ phải được xem như một tình huống bất thường và được khắc phục trước khi nó ảnh hưởng đến hiệu suất tổng thể.

Bạn có thể định cấu hình chiến lược tiêu diệt bằng thuộc tính ro.config.low_ram . Để biết chi tiết, xem Cấu hình ram thấp .

Không gian người dùng lmkd cũng hỗ trợ chế độ cũ trong đó nó đưa ra quyết định tiêu diệt 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 (nghĩa là bộ nhớ trống và ngưỡng bộ đệm tệp). Để bật chế độ cũ, hãy đặt thuộc tính ro.lmk.use_minfree_levels thành true .

Đang định cấu hình lmkd

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

Tài sản 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 màn hình 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 (nghĩa là phù hợp với 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ị hủy ở mức vmpressure thấp. 1001
(tàn tật)
ro.lmk.medium Điểm oom_adj tối thiểu cho các quy trình đủ điều kiện bị hủy ở mức vmpressure vmtrung bình. 800
(các dịch vụ được lưu trong bộ nhớ cache 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ị loại bỏ ở mức vmpressure tới hạn. 0
(bất kỳ quá trình nào)
ro.lmk.critical_upgrade Cho phép nâng cấp lên mức quan trọng. false
ro.lmk.upgrade_pressure mem_pressure tối đa mà cấp độ được nâng cấp do hệ thống hoán đổi quá nhiều. 100
(tàn 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àn tật)
ro.lmk.kill_heaviest_task Loại bỏ nhiệm vụ đủ điều kiện nặng nhất (quyết định tốt nhất) so với bất kỳ nhiệm vụ đủ điều kiện nào (quyết định nhanh). true
ro.lmk.kill_timeout_ms Khoảng thời gian tính bằng mili giây sau một lần tiêu diệt khi không có lần tiêu diệt bổ sung nào được thực hiện. 0
(tàn tật)
ro.lmk.debug Kích hoạt nhật ký gỡ lỗi lmkd . false

Cấu hình thiết bị ví dụ:

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

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

Android 11 cải thiện lmkd bằng cách giới thiệu chiến lược tiêu diệt mới. Chiến lược tiêu diệt sử dụng cơ chế PSI để phát hiện áp suất bộ nhớ được giới thiệu trong Android 10. lmkd trong Android 11 tính toán mức sử dụng tài nguyên bộ nhớ và xử lý sự cố để ngăn chặn tình trạng thiếu bộ nhớ và suy giảm hiệu suất. Chiến lược tiêu diệt 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ị hiệu suất cao và RAM thấp (Android Go).

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

Đối với 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à kích hoạt PSI (backport có sẵn trong các nhân phổ biến của Android 4.9, 4.14 và 4.19).
  • Bao gồm các bản vá hỗ trợ PIDFD (backport có sẵn trong các nhân phổ biến của Android 4.9, 4.14 và 4.19).
  • Đối với các thiết bị RAM thấp, hãy bao gồm các nhóm bộ nhớ.

Kernel phải được biên dịch với các 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à 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à RAM thấp.

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

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

Tài sản Sử dụng Mặc định
Hiệu suất cao RAM thấp
ro.lmk.swap_free_low_percentage Mức trao đổi tự do tính theo 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 khi nào nên coi hệ thống là thiếu không gian trao đổi. Nếu `lmkd` tắt trong khi có quá nhiều dung lượng trao đổi, hãy giảm tỷ lệ phần trăm. Nếu tiêu diệt `lmkd` xảy ra quá muộn, cho phép xảy ra tiêu diệt OOM, hãy tăng tỷ lệ phần trăm. 20 10
ro.lmk.debug Điều này cho phép nhật ký gỡ lỗi `lmkd`. Bật gỡ lỗi trong khi điều chỉnh. false