Quy trình trình nền đóng các tiến trình ít cần thiết khi còn ít dung lượng (lmkd
) của Android sẽ 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 tình trạng bộ nhớ bị quá tải bằng cách đóng các tiến trình ít cần thiết nhất để hệ thống hoạt động ở mức chấp nhận được.
Giới thiệu về tình trạng áp lực bộ nhớ
Hệ thống Android chạy song song nhiều quy trình có thể gặp phải các trường hợp khi bộ nhớ hệ thống bị cạn kiệt và các quy trình yêu cầu nhiều bộ nhớ hơn sẽ bị trễ đáng kể. Áp lực về bộ nhớ là trạng thái mà hệ thống sắp hết bộ nhớ, yêu cầu Android giải phóng bộ nhớ (để giảm á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 vào bộ nhớ đệm không quan trọng, v.v.
Trước đây, Android giám sát áp lực bộ nhớ hệ thống bằng trình điều khiển low memory killer (LMK) trong nhân, một cơ chế cứng nhắc phụ thuộc vào các giá trị được mã hoá cứng. Kể từ nhân 4.12, trình điều khiển LMK sẽ bị xoá khỏi nhân thượng nguồn và lmkd
không gian người dùng sẽ thực hiện các tác vụ giám sát bộ nhớ và loại bỏ quy trình.
Thông tin về tình trạng tắc nghẽn do áp suất
Android 10 trở lên hỗ trợ chế độ lmkd
mới sử dụng các trình giám sát thông tin về tình trạng tắc nghẽn do áp lực của nhân (PSI) để phát hiện áp lực bộ nhớ. PSI patchset trong nhân nguồn mở (được chuyển ngược về các nhân 4.9 và 4.14) đo lường khoảng thời gian các tác vụ bị trì hoãn do tình trạng 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à một chỉ số thuận tiện để xác định mức độ nghiêm trọng của áp lực bộ nhớ. Hạt nhân thượng nguồn cũng bao gồm các màn hình PSI cho phép các quy trình không gian người dùng có đặc quyền (chẳng hạn như lmkd
) chỉ định ngưỡng cho những độ trễ này và đăng ký nhận các sự kiện từ hạt nhân khi một ngưỡng bị vi phạm.
PSI theo dõi so với tín hiệu áp suất
Vì các tín hiệu vmpressure
(do nhân tạo ra để phát hiện tình trạng thiếu bộ nhớ và được lmkd
sử dụng) thường có 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ó thực sự bị thiếu hay không.
Điều này dẫn đến việc đánh thức lmkd
không cần thiết và việc sử dụng thêm tài nguyên điện toán. Việc sử dụng các chỉ số PSI giúp phát hiện áp lực bộ nhớ chính xác hơn và giảm thiểu chi phí lọc.
Sử dụng các màn hình PSI
Để sử dụng các 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
, giúp PSI trở thành cơ chế mặc định để phát hiện áp lực bộ nhớ cho lmkd
. Vì các màn hình PSI yêu cầu hỗ trợ của nhân, nên nhân phải có các bản vá chuyển ngượ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 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ột cách mạnh mẽ, và ngay cả khi đó, chúng vẫn hoạt động kém hiệu quả trên các khối lượng công việc có pagecache đang hoạt động được sao lưu bằng tệp lớn. Hiệu suất kém dẫn đến việc không có mạng nào bị hạ gục.
- Trình điều khiển LMK kernel dựa vào giới hạn bộ nhớ trống, không có khả năng mở rộng dựa trên áp lực bộ nhớ.
- Do thiết kế cứng nhắc, các đối tác thường tuỳ chỉnh trình điều khiển để trình điều khiển hoạt động trên thiết bị của họ.
- Trình điều khiển LMK được kết nối với API giảm kích thước khối, không được thiết kế cho các thao tác nặng như tìm kiếm mục tiêu và loại bỏ mục tiêu. Điều này làm chậm quá trình
vmscan
.
lmkd không gian người dùng
lmkd
của không gian người dùng triển khai 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ế hiện có của nhân để phát hiện và ước tính áp lực bộ nhớ. Các cơ chế như vậy bao gồm việc sử dụng các sự kiện vmpressure
do nhân tạo hoặc các trình giám sát thông tin về tình trạng tắc nghẽn do áp lực (PSI) để nhận thông báo về các mức áp lực bộ nhớ và sử dụng các tính năng nhóm kiểm soát bộ nhớ để giới hạn tài nguyên bộ nhớ được phân bổ cho từng quy trình dựa trên mức độ 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, lmkd
không gian 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 kernel hỗ trợ các nhóm kiểm soát bộ nhớ, nên kernel 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 chấm dứt
Userspace lmkd
hỗ trợ các chiến lược tắt dựa trên các sự kiện vmpressure
hoặc các màn hình PSI, mức độ nghiêm trọng và các gợi ý khác như mức sử dụng trao đổi. Chiến lược tắt ứng dụng khác nhau giữa các thiết bị có bộ nhớ thấp và thiết bị có 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ị có hiệu suất cao, áp lực bộ nhớ nên được xem là một tình huống bất thường và cần đượ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 kết thúc bằng cách sử dụng thuộc tính ro.config.low_ram
.
lmkd
của không gian người dùng cũng hỗ trợ một chế độ cũ, trong đó chế độ này đưa ra quyết định kết thúc 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 (tức là ngưỡng bộ nhớ trống và bộ nhớ đệm tệp). Để bật chế độ cũ, 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.
Thuộc tính | Mục đích sử dụng | Mặc định |
---|---|---|
ro.config.low_ram
|
Chỉ định xem thiết bị có RAM thấp hay hiệu suất cao. | false
|
ro.lmk.use_psi |
Sử dụng các màn hình PSI (thay vì sự kiện vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Sử dụng các ngưỡng bộ nhớ trống và bộ nhớ đệm tệp để đưa ra quyết định loại bỏ quy trình (tức là khớp 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ị huỷ ở cấp vmpressure thấp.
|
1001 (đã tắt) |
ro.lmk.medium
|
Điểm oom_adj tối thiểu cho các quy trình đủ điều kiện bị huỷ ở cấp độ vmpressure trung bình.
|
800 (các dịch vụ được lưu vào bộ nhớ đệm 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ị huỷ ở cấp độ vmpressure quan trọng.
|
0 (mọi quy trình) |
ro.lmk.critical_upgrade
|
Bật chế độ 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 vì 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 đó sự kiện vmpressure bị bỏ qua vì vẫn còn đủ bộ nhớ trống.
|
100 (đã tắt) |
ro.lmk.kill_heaviest_task
|
Huỷ tác vụ đủ điều kiện có mức sử dụng bộ nhớ cao nhất (quyết định tốt nhất) so với bất kỳ tác vụ đủ điều kiện nào (quyết định nhanh). | false
|
ro.lmk.kill_timeout_ms
|
Thời lượng tính bằng mili giây sau khi huỷ mà không có thêm lệnh huỷ nào được thực hiện. | 0 (đã tắt) |
ro.lmk.debug
|
Bật nhật ký gỡ lỗi lmkd .
|
false
|
Ví dụ về cấu hình thiết bị:
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 chiến lược loại bỏ mới. Chiến lược loại bỏ sử dụng cơ chế PSI để phát hiện áp lực bộ nhớ được giới thiệu trong Android 10. lmkd
trong Android 11 tính đến các mức sử dụng tài nguyên bộ nhớ và hiện tượng thrashing để ngăn tình trạng thiếu bộ nhớ và giảm hiệu suất.
Chiến lược loại bỏ này thay thế các chiến lược trước đó và có thể được dùng trên cả thiết bị có hiệu suất cao và thiết bị có 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 sau của nhân:
- Bao gồm các bản vá PSI và bật PSI (các bản vá ngược có trong các nhân chung của Android 4.9, 4.14 và 4.19).
- Bao gồm các bản vá hỗ trợ PIDFD (các bản vá ngược có trong các nhân chung của Android 4.9, 4.14 và 4.19).
- Đối với các thiết bị có dung lượng RAM thấp, hãy thêm cgroup bộ nhớ.
Bạn phải biên dịch nhân bằng 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à thiết bị có 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 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 lực bộ nhớ quá muộn, hãy giảm giá trị này để kích hoạt thông báo sớm hơn. Nếu thông báo áp lực bộ nhớ kích hoạt 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 nhiễu. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Ngưỡng hoàn thành PSI (chỉ số về tốc độ hệ thống) (tính bằng mili giây) để kích hoạt thông báo nguy cấp về bộ nhớ. Nếu thiết bị nhận được thông báo áp lực bộ nhớ quan trọng quá muộn, hãy giảm giá trị này để kích hoạt thông báo sớm hơn. Nếu các thông báo áp lực bộ nhớ quan trọng kích hoạt 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 nhiễu. | 700 |
|
ro.lmk.thrashing_limit |
Số lượng tối đa các lỗi truy cập lại workingset dưới dạng tỷ lệ phần trăm của tổng kích thước pagecache được hỗ trợ bằng tệp. Workingset refaults (lỗi truy cập lại vào tập hợp đang hoạt động) cao hơn giá trị này có nghĩa là hệ thống được coi là đang lãng phí bộ nhớ đệm trang. Nếu hiệu suất của thiết bị bị ảnh hưởng trong quá trình chịu áp lực bộ nhớ, hãy giảm giá trị này để hạn chế hiện tượng thrashing. 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 thrashing, hãy tăng giá trị để cho phép thrashing nhiều hơn. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Mức suy giảm ngưỡng lặp lại được biểu thị bằng tỷ lệ phần trăm của ngưỡng ban đầu dùng để giảm ngưỡng khi hệ thống không khôi phục, ngay cả sau khi bị tắt. Nếu việc phân trang liên tục tạo ra các thao tác huỷ không cần thiết, hãy giảm giá trị này. Nếu phản hồi cho tình trạng liên tục truy cập dữ liệu sau khi một tiến trình bị huỷ quá chậm, hãy tăng giá trị này. | 10 |
50 |
ro.lmk.swap_util_max |
Lượng bộ nhớ được hoán đổi tối đa dưới dạng tỷ lệ phần trăm của tổng bộ nhớ có thể hoán đổi. Khi bộ nhớ hoán đổi tăng lên quá giới hạn này, tức là hệ thống đã hoán đổi hầu hết bộ nhớ có thể hoán đổi và vẫn chịu áp lực.
Điều này có thể xảy ra khi các hoạt động phân bổ không thể hoán đổi đang tạo á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ể hoán đổi đã được hoán đổi. Giá trị mặc định là 100, tức là vô hiệu hoá quy trình kiểm tra này. Nếu hiệu suất của thiết bị bị ảnh hưởng trong quá trình chịu áp lực bộ nhớ trong khi mức sử dụng bộ nhớ ảo cao và mức bộ nhớ ảo trống không giảm xuống ro.lmk.swap_free_low_percentage , hãy giảm giá trị để giới hạn mức sử dụng bộ nhớ ảo. |
100 |
100 |
Các núm điều chỉnh cũ sau đây cũng hoạt động với chiến lược loại bỏ 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 độ trao đổi miễn phí dưới dạng tỷ lệ 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 để xem xét hệ thống khi thiếu không gian trao đổi. Nếu `lmkd` bị huỷ trong khi có quá nhiều dung lượng trong bộ nhớ hoán đổi, hãy giảm tỷ lệ phần trăm. Nếu `lmkd` kết thúc quá muộn, cho phép các lượt kết thúc OOM xảy ra, 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 chế độ gỡ lỗi trong khi điều chỉnh. | false |