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

Android bộ nhớ thấp killer daemon ( lmkd ) màn trình tình trạng bộ nhớ của một hệ điều hành Android chạy và phản ứng với áp lực bộ nhớ cao bằng cách giết chết các quá trình cần thiết nhất để giữ cho hệ thống thực hiện ở mức 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 gặp phải sự chậm trễ đáng chú ý. Áp lực bộ nhớ, một trạng thái trong đó hệ thống đang chạy ngắn về bộ nhớ, yêu cầu Android vào bộ nhớ miễn phí (để giảm bớt áp lực) bằng cách bóp nghẹt hoặc giết chết quá trình không quan trọng, yêu cầu quy trình để các nguồn tài nguyên được lưu trữ đoạn không quan trọng miễn phí, và vân vân.

Trước đây, Android theo dõi áp suất 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. Tính đến kernel 4.12, người lái xe LMK được lấy ra từ hạt nhân ở thượng nguồn và userspace lmkd Thực hiện giám sát bộ nhớ và quá trình giết nhiệm vụ.

Thông tin về áp suất

Android 10 và sau đó hỗ trợ một mới lmkd chế độ sử dụng hạt nhân thông tin gian hàng áp (PSI) màn hình để phát hiện áp lực 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ớ. Kernel thượng nguồn cũng bao gồm màn hình PSI cho phép quá trình userspace đặc quyền (như lmkd ) để xác định ngưỡng cho những sự chậm trễ và để đăng ký các sự kiện từ hạt nhân khi một ngưỡng được vi phạm.

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

Bởi vì vmpressure tín hiệu (tạo ra bởi các hạt nhân để phát hiện áp lực bộ nhớ và sử dụng bởi lmkd ) thường bao gồm nhiều dương tính giả, lmkd phải thực hiện lọc để xác định nếu bộ nhớ đang chịu áp lực thực sự. Đây kết quả trong không cần thiết lmkd wakeups và sử dụng 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ì vmpressure sự kiện, cấu hình các ro.lmk.use_psi tài sản. Giá trị mặc định là true , làm cho màn hình PSI cơ chế mặc định của phát hiện áp lực bộ nhớ cho lmkd . Bởi vì màn 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 backport PSI và được biên soạn với sự hỗ trợ PSI 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 tích cực, và thậm chí sau đó sẽ hoạt động kém trên các khối lượng công việc có phân trang 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 có 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ọ.
  • Người tài xế LMK nối vào API phiến shrinker, mà không được thiết kế cho các hoạt động nặng như tìm kiếm các mục tiêu và tiêu diệt chúng, mà làm chậm vmscan quá trình.

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

Các userspace lmkd cụ cùng chức năng như tài xế 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à áp lực bộ nhớ dự toán. Cơ chế này bao gồm sử dụng hạt nhân tạo vmpressure các sự kiện hoặc thông tin gian hàng áp (PSI) màn hình để nhận thông báo về mức độ áp lực bộ nhớ, và sử dụng các tính năng bộ nhớ cgroup để hạn chế nguồn tài nguyên bộ nhớ phân bổ cho từng quá trình dựa trên quá trình quan trọng.

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

Trong Android 9 và sau đó, không gian người dùng lmkd máy hoạt động nếu một trình điều khiển LMK trong hạt nhân không được phát hiện. Bởi vì userspace lmkd yêu cầu hỗ trợ hạt nhân cho cgroups nhớ, hạt nhân phải được biên dịch với các thiết lập cấu hình sau đây:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Chiến lược giết người

Userspace lmkd hỗ trợ tiêu diệt các chiến lược dựa trên vmpressure các sự kiện hoặc màn PSI, mức độ nghiêm trọng của họ, và 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ể cấu hình các chiến lược tiêu diệt bằng cách sử dụng ro.config.low_ram tài sản (để biết chi tiết, xem RAM Cấu hình thấp ).

Userspace lmkd cũng hỗ trợ chế độ kế thừa trong đó đưa ra quyết định giết bằng cách sử dụng chiến lược tương tự như trình điều khiển LMK trong kernel (có nghĩa là, bộ nhớ miễn phí và tập tin bộ nhớ cache ngưỡng). Để kích hoạt chế độ di sản, thiết lập ro.lmk.use_minfree_levels tài sản cho true .

Định cấu hình lmkd

Cấu hình lmkd cho một thiết bị cụ thể 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ì vmpressure sự kiện). 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 Tối thiểu oom_adj điểm cho quá trình đủ điều kiện để được giết chết ít thấp vmpressure cấp. 1001
(Vô hiệu hóa)
ro.lmk.medium Tối thiểu oom_adj điểm cho quá trình đủ điều kiện để bị giết tại trung vmpressure cấp. 800
(các dịch vụ được lưu trong bộ nhớ cache hoặc không cần thiết)
ro.lmk.critical Tối thiểu oom_adj điểm cho quá trình đủ điều kiện để được giết chết ít quan trọng vmpressure cấp. 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 Tối đa mem_pressure mà tại đó mức độ được nâng cấp vì hệ thống được trao đổi quá nhiều. 100
(Vô hiệu hóa)
ro.lmk.downgrade_pressure Tối thiểu mem_pressure mà tại đó một vmpressure Sự kiện này được bỏ qua bởi vì đủ bộ nhớ trống vẫn có sẵn. 100
(Vô hiệu hóa)
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
(Vô hiệu hóa)
ro.lmk.debug Kích hoạt tính năng lmkd bản ghi gỡ lỗi. 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 giết hại mới. Chiến lược giết sử dụng một cơ chế PSI để phát hiện áp lực bộ nhớ giới thiệu trong Android 10 lmkd trong Android 11 tài khoản cho các mức độ sử dụng tài nguyên bộ nhớ và sân đập để ngăn chặn nạn đói 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 về nhân

11 thiết bị Android, lmkd đòi hỏi 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 trang của nó. 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ế 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 trong quá trình áp lực bộ nhớ khi sử dụng hoán đổi là cao và mức độ trao đổi miễn phí không giảm xuống ro.lmk.swap_free_low_percentage , giảm giá trị để sử dụng giới hạn 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ị thiếu. Nếu `lmkd` giết trong khi có quá nhiều không gian 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