Trình nền đóng các tiến trình bộ nhớ thấp

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