Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

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 giết các quy trình ít thiết yếu nhất để giữ cho hệ thống hoạt động ở mức có thể chấp nhận được.

Về áp lực bộ nhớ

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 quá trình yêu cầu nhiều bộ nhớ hơn sẽ gặp phải sự chậm trễ đáng chú ý. Áp lực bộ nhớ , một trạng thái mà hệ thống đang thiếu 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 chỉnh hoặc giết 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 được lưu trong bộ nhớ cache không xác thực, v.v.

Trước đây, Android theo dõi áp lực bộ nhớ hệ thống bằng cách sử dụng trình điều khiển 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ừ nhân 4.12, trình điều khiển LMK bị xóa khỏi nhân ngược dòng và không gian người dùng lmkd thực hiện các tác vụ giám sát bộ nhớ và xử lý các tác vụ tiêu diệt.

Thông tin về áp suất

Android 10 trở lên hỗ trợ chế độ lmkd mới sử dụng màn hình thông tin áp suất nhân (PSI) để phát hiện áp suất bộ nhớ. Bộ vá PSI trong nhân ngược dòng (được hỗ trợ cho 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 sự chậm trễ này ảnh hưởng trực tiếp đến trải nghiệm người dùng, chúng đại diện cho một số liệu thuận tiện để xác định mức độ nghiêm trọng của áp lực bộ nhớ. Nhân ngược dòng cũng bao gồm các trình theo dõi PSI cho phép các quá trình không gian người dùng đặc quyền (chẳng hạn như lmkd ) chỉ định các ngưỡng cho những sự chậm trễ này và đăng ký các sự kiện từ nhân 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 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ả, lmkd phải thực hiện lọc để xác định xem bộ nhớ có đang chịu áp suất thực hay không. Điều này dẫn đến việc lmkd không cần thiết và sử dụng các tài nguyên tính toán bổ sung. 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 . Mặc định là true , làm cho PSI giám sát cơ chế mặc định của phát hiện áp suất bộ nhớ cho lmkd . Bởi vì màn hình PSI yêu cầu hỗ trợ hạt nhân, hạt nhân phải bao gồm các bản vá lỗi PSI backport và được biên dịch với hỗ trợ PSI được kích hoạt ( CONFIG_PSI=y ).

Hạn chế 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ạnh mẽ, và thậm chí sau đó sẽ hoạt động kém trên các khối lượng công việc với pagecache hoạt động được hỗ trợ bởi tệp lớn. Hiệu suất kém dẫn đến đâm chém và không giết đượ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 mở rộng quy mô dựa trên áp lực bộ nhớ.
  • Vì sự cứng nhắc của thiết kế, 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 đã kết nối với API bộ thu nhỏ phiến, không được thiết kế cho các hoạt động nặng như tìm kiếm mục tiêu và tiêu diệt chúng, đ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 nhân nhưng sử dụng các cơ chế nhân hiện có để phát hiện và ước tính áp suất bộ nhớ. Các cơ chế như vậy bao gồm sử dụng các sự kiện vmpressure do hạt nhân tạo ra hoặc màn hình 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 cgroup bộ nhớ để giới hạn tài nguyên bộ nhớ được phân bổ cho mỗi quá trình dựa trên mức độ quan trọng của quá trình.

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

Trong Android 9 trở lên, lmkd không gian người dùng sẽ kích hoạt nếu trình điều khiển LMK trong nhân không được phát hiệ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ớ, hạt nhân 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 giết người

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ư sử dụng hoán đổi. Các chiến lược hủy 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 á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ớ nên đượ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, hãy xem Cấu hình ram thấp .

Không gian người dùng lmkd cũng hỗ trợ một chế độ kế thừa, trong đó nó đưa ra các 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ộ nhớ cache tệp). Để bật chế độ kế thừa, 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.

Bất động sản Sử dụng Vỡ nợ
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 bộ nhớ trống và ngưỡng bộ nhớ cache tệp để đưa ra quyết định hủy quá 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ị giết ở 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ị loại bỏ ở mức vmpressure trung 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ị giết ở mức vmpressure quan trọng. 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 tại đó 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 Giết 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 Thời lượng tính bằng mili giây sau một lần tiêu diệt khi không có thêm lần tiêu diệt nào được thực hiện. 0
(tàn tật)
ro.lmk.debug Bật nhật ký gỡ lỗi lmkd . false

Cấu hình thiết bị mẫu:

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 một 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 đến mức sử dụng tài nguyên bộ nhớ và đập để ngăn bộ nhớ đói và 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 về 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à kích hoạt PSI (các cổng hỗ trợ 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 (các cổng lùi 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ị có 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 tiêu diệt 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ị hiệu suất cao và RAM thấp.

Bất động sản Sử dụng Vỡ nợ
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 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 thông báo áp suất bộ nhớ kích hoạt 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 hoàn toàn của PSI, 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 kích hoạt 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 kết quả tối đa của bộ làm việc theo tỷ lệ phần trăm của tổng kích thước bộ đệm trang được hỗ trợ bởi tệp. Các kết quả của bộ làm việc trên giá trị này có nghĩa là hệ thống được coi là đang tấn công bộ đệm phân trang của nó. Nếu hiệu suất của thiết bị bị ảnh hưởng trong quá trình ép bộ nhớ, hãy giảm giá trị để hạn chế sự cố. Nếu hiệu suất của thiết bị bị giết một cách không cần thiết vì lý do đập, hãy tăng giá trị để cho phép đập nhiều hơn. 100 30
ro.lmk.thrashing_limit_decay Phân rã ngưỡng đập được biểu thị bằng phần trăm của ngưỡng ban đầu được sử dụng để giảm ngưỡng khi hệ thống không phục hồi, ngay cả sau khi kết thúc. Nếu đập liên tục tạo ra số mạng không cần thiết, hãy giảm giá trị. Nếu phản ứng với hành động đậ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 Số lượng bộ nhớ được hoán đổi tối đa theo tỷ lệ phần trăm của tổng bộ nhớ có thể hoán đổi. Khi bộ nhớ được hoán đổi phát triển vượt quá giới hạn này, điều đó có nghĩa là hệ thống đã hoán đổi phần lớn bộ nhớ có thể hoán đổi và vẫn đang bị á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 áp lực bộ nhớ mà không thể giải tỏa 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, sẽ vô hiệu hóa hiệu quả kiểm tra này. Nếu hiệu suất của thiết bị bị ảnh hưởng khi áp lực bộ nhớ trong khi sử dụng hoán đổi 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ế sử dụng hoán đổ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.

Bất động sản Sử dụng Vỡ nợ
Hiệu suất cao RAM thấp
ro.lmk.swap_free_low_percentage Mức độ hoán đổi miễn phí theo tỷ lệ 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 cho thời điểm coi hệ thống là không gian hoán đổi bị bỏ đói. Nếu `lmkd` giết trong khi có quá nhiều dung lượng trong hoán đổi, hãy giảm tỷ lệ phần trăm. Nếu số lần giết `lmkd` xảy ra quá muộn, cho phép số lần giết của OOM xảy ra, 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