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 |