Quá trình trình nền tiêu diệt bộ nhớ thấp của Android (lmkd
) giám sát bộ nhớ
trạng thái 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 tắt
những quy trình ít cần thiết nhất để hệ thống hoạt động ở mức chấp nhận được
cấp độ.
Giới thiệu về áp lực bộ nhớ
Hệ thống Android chạy nhiều quy trình song song có thể gặp phải tình trạng các tình huống khi bộ nhớ hệ thống đã hết và các quá trình cần thêm bộ nhớ sẽ bị trễ đáng kể. Áp suất bộ nhớ, trạng thái mà trong đó hệ thống sắp hết bộ nhớ, yêu cầu Android phải 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ỏ những quy trình không quan trọng, yêu cầu để giải phóng các tài nguyên không quan trọng được lưu vào 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 nhân hệ điều hành
trình điều khiển tiêu diệt bộ nhớ thấp (LMK), một cơ chế cứng nhắc phụ thuộc vào mã hoá cứng
giá trị. Kể từ nhân hệ điều hành 4.12, trình điều khiển LMK bị xoá khỏi luồng ngược dòng (upstream)
nhân hệ điều hành và không gian người dùng lmkd
thực hiện giám sát bộ nhớ và loại bỏ quy trình
công việc.
Thông tin về buồng áp suất
Android 10 trở lên hỗ trợ chế độ lmkd
mới
sử dụng trình theo dõi thông tin ngăn áp lực nhân (PSI) để biết áp lực bộ nhớ
của bạn. Bản vá PSI trong nhân ngược dòng (được điều chỉnh cho phiên bản 4.9 và 4.14)
kernel) đo lường khoảng thời gian các tác vụ bị trì hoãn do
thiếu bộ nhớ. Do những chậm trễ này ảnh hưởng trực tiếp đến trải nghiệm người dùng,
biểu thị một chỉ số thuận tiện để xác định mức độ nghiêm trọng của áp lực bộ nhớ. Chiến lược phát hành đĩa đơn
nhân hệ điều hành ngược dòng (upstream) cũng bao gồm các màn hình PSI cho phép không gian người dùng có đặc quyền
các quy trình (chẳng hạn như lmkd
) để chỉ định ngưỡng cho các độ trễ này và
đăng ký các sự kiện từ nhân khi một ngưỡng 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 nhân hệ điều hành tạo ra cho bộ nhớ
phát hiện áp lực và sử dụng bởi lmkd
) thường bao gồm nhiều kết quả dương tính giả,
lmkd
phải thực hiện quá trình 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
lần một cách không cần thiết và việc sử dụng các tiện ích bổ sung
tài nguyên điện toán. Việc sử dụng màn hình PSI sẽ mang lại bộ nhớ chính xác hơn
phát hiện áp suất 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ì 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
, để PSI giám sát
cơ chế mặc định để phát hiện áp lực bộ nhớ cho lmkd
. Vì PSI giám sát
yêu cầu hỗ trợ kernel, thì kernel phải bao gồm các bản vá điều chỉnh cho phiên bản cũ PSI và
được biên dịch khi bật tính năng hỗ trợ PSI (CONFIG_PSI=y
).
Nhược điểm của trình điều khiển LMK trong nhân
Android sẽ 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 liên tục, và thậm chí khi đó hoạt động kém hiệu quả trên các khối lượng công việc có bộ nhớ đệm trang đang hoạt động có lưu trữ tệp lớn. Chiến lược phát hành đĩa đơn dẫn đến việc bị đơ máy và không có mạng nào bị giết.
- Trình điều khiển nhân hệ điều hành LMK dựa vào giới hạn bộ nhớ trống mà không dựa trên tỷ lệ áp lực về bộ nhớ.
- Do độ cứng của thiết kế, các đối tác thường tuỳ chỉnh trình điều khiển để tính năng này hoạt động trên thiết bị của họ.
- Trình điều khiển LMK đã nối vào API trình thu gọn slab
được thiết kế cho các tác vụ nặng nề như tìm kiếm mục tiêu và giết người
vì chúng làm chậm quá trình
vmscan
.
Lmkd không gian người dùng
Không gian người dùng lmkd
triển khai chức năng tương tự như trình điều khiển trong nhân hệ điều hành
nhưng sử dụng các cơ chế nhân hiện có để phát hiện và ước tính áp lực bộ nhớ. Chẳng hạn
cơ chế bao gồm sử dụng các sự kiện vmpressure
do nhân hệ điều hành tạo hoặc ngăn áp lực
thông tin (PSI) giám sát để nhận thông báo về mức áp lực bộ nhớ,
và sử dụng các tính năng nhóm bộ nhớ để giới hạn tài nguyên bộ nhớ được phân bổ cho mỗi
dựa trên tầm 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 nhân hệ điều hành. Vì không gian người dùng lmkd
cần hỗ trợ hạt nhân cho các cgroups bộ nhớ, nhân hệ điều hành 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ỏ
Không gian người dùng lmkd
hỗ trợ các chiến lược loại bỏ dựa trên sự kiện vmpressure
hoặc PSI
theo dõi mức độ nghiêm trọng và các gợi ý khác như hoạt động hoán đổi nội dung. Tắt
có sự khác biệt giữa thiết bị có bộ nhớ thấp và thiết bị 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 dưới dạng chế độ hoạt động thông thường.
- Trên các thiết bị hiệu suất cao, áp lực bộ nhớ nên được xem là một hiện tượng bất thường tình huống cụ thể 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 cách sử dụng thuộc tính ro.config.low_ram
. Cho
thông tin chi tiết, hãy xem phần Lượng bộ nhớ thấp
Cấu hình.
Không gian người dùng lmkd
cũng hỗ trợ chế độ cũ, trong đó chế độ này đưa ra quyết định loại bỏ
bằng cách sử dụng cùng các chiến lược như trình điều khiển LMK trong nhân (tức là
ngưỡng bộ nhớ đệm của tệp và bộ nhớ). Để bật chế độ cũ, hãy đặt
ro.lmk.use_minfree_levels
thuộc tính sang 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ị là 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
|
Dùng ngưỡng bộ nhớ trống và bộ nhớ đệm tệp để tắt quy trình quyết định phù hợp (tức là phù hợp với chức năng của nhân hệ điều hành người lái xe LMK). | false
|
ro.lmk.low
|
Điểm oom_adj tối thiểu để các quy trình đủ điều kiện trở thành
bị giết ở mức vmpressure thấp.
|
1001 (đã tắt) |
ro.lmk.medium
|
Điểm oom_adj tối thiểu để các quy trình đủ điều kiện trở thành
bị giết ở cấp độ vmpressure trung bình.
|
800 (các dịch vụ được lưu vào bộ nhớ đệm hoặc không thiết yếu) |
ro.lmk.critical
|
Điểm oom_adj tối thiểu để các quy trình đủ điều kiện trở thành
bị giết ở 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 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 đang hoán đổi quá nhiều.
|
100 (đã tắt) |
ro.lmk.downgrade_pressure
|
mem_pressure tối thiểu mà tại đó một vmpressure
sự kiện bị bỏ qua vì vẫn còn đủ bộ nhớ trống.
|
100 (đã 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 mọi nhiệm vụ đủ điều kiện (quyết định nhanh chóng). | true
|
ro.lmk.kill_timeout_ms
|
Thời lượng tính bằng mili giây sau khi hạ gục khi không có thêm lệnh giết nào xong. | 0 (đã 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
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 tính năng mới
chiến thuật giết người. Chiến lược loại bỏ sử dụng cơ chế PSI cho áp lực bộ nhớ
phát hiện trên Android 10. lmkd
inch
Android 11 tính đến các mức sử dụng tài nguyên bộ nhớ
và tình trạng đơ máy để ngăn tình trạng thiếu hụt bộ nhớ và suy giảm hiệu suất.
Chiến lược giết người này thay thế các chiến lược trước đó và có thể được sử dụng trên cả hai chiến lược
thiết bị hiệu suất cao và có dung lượng RAM thấp (Android Go).
Yêu cầu về kernel
Đối với các thiết bị Android 11, lmkd
yêu cầu các tính năng nhân sau đây:
- Bao gồm các bản vá PSI và bật PSI (phiên bản cũ 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 (điều chỉnh cho phiên bản cũ có trong Android phổ biến hạt nhân 4.9, 4.14 và 4.19).
- Đối với thiết bị có dung lượng RAM thấp, hãy bao gồ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à chế độ 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.
Thuộc tính | Mục đích 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, khi kích hoạt mức thấp thông báo kỷ niệm. Nếu thiết bị nhận được thông báo về á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 bộ nhớ thông báo áp lực kích hoạt một cách 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. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Ngưỡng tổng thời gian chờ PSI, tính bằng mili giây, để kích hoạt các thông báo quan trọng về bộ nhớ. Nếu thiết bị nhận được bộ nhớ quan trọng thông báo áp lực quá muộn, hãy giảm giá trị này để kích hoạt sớm hơn thông báo. Nếu các thông báo về áp lực 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 để giảm độ nhạy của thiết bị tiếng ồn. | 700 |
|
ro.lmk.thrashing_limit |
Số lượng từ chối tối đa của nhóm công việc tính theo phần trăm trên tổng số kích thước pagecache của tệp sao lưu. Các lỗi của workset trên giá trị trung bình này hệ thống được coi là đang đóng bă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 đơ máy. Nếu hiệu suất của thiết bị bị dừng không cần thiết vì lý do đơ máy, hãy tăng giá trị để cho phép nhiều hơn tình trạng đơ máy. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Mức giảm của ngưỡng ngăn chặn được biểu thị bằng tỷ lệ phần trăm của ngưỡng ban đầu được dùng để giảm ngưỡng khi hệ thống không phục hồi, ngay cả sau khi bị hạ gục. Nếu tình trạng đơ máy liên tục tạo ra tình trạng không cần thiết tắt, giảm giá trị. Nếu phản hồi với tình trạng đơ máy liên tục sau hạ gục quá chậm, hãy tăng giá trị lên. | 10 |
50 |
ro.lmk.swap_util_max |
Dung lượng bộ nhớ tối đa được hoán đổi tính theo tỷ lệ phần trăm của tổng bộ nhớ có thể hoán đổi
bộ nhớ. Khi bộ nhớ được hoán đổi tăng lên trên 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 chịu áp lực.
Điều này có thể xảy ra khi các cơ cấu phân bổ không thể hoán đổi đang tạo bộ nhớ
áp lực mà không thể giảm bớt bằng cách hoán đổi vì hầu hết áp lực có thể hoán đổi
bộ nhớ đã được hoán đổi. Giá trị mặc định là 100. Giá trị này
tắt lần kiểm tra này. Nếu hiệu suất của thiết bị bị ảnh hưởng trong khoảng thời gian
áp lực bộ nhớ trong khi sử dụng hoán đổi là 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ị để giới hạn 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 | 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à hoán đổi đói bụng. Nếu `lmkd` bị giết trong khi có quá nhiều không gian để hoán đổi, giảm tỷ lệ phần trăm. Nếu lượt giết "lmkd" diễn ra quá muộn, khiến OOM có thể giết chết, 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 gỡ lỗi trong khi dò. | false |