Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

로우 메모리 킬러 데몬(lmkd)

Android 로우 메모리 킬러 데몬(lmkd) 프로세스는 실행 중인 Android 시스템의 메모리 상태를 모니터링하고 시스템 성능을 허용 수준에서 유지하기 위해 최소한의 필수 프로세스를 종료하여 많은 양의 메모리 수요에 대처합니다.

메모리 압력 정보

동시에 여러 프로세스를 실행하는 Android 시스템에서는 시스템 메모리가 소진되고 더 많은 메모리를 필요로 하는 프로세스가 눈에 띄게 지연될 수 있습니다. 시스템에서 메모리가 부족한 상태인 메모리 압력 상태에서는 중요하지 않은 프로세스를 제한하거나 종료하고, 중요하지 않은 캐시된 리소스 해제 프로세스를 요청하는 등의 조치를 통해 메모리를 확보해야 합니다.

지금까지 Android는 하드 코딩된 값에 따라 달라지는 강력한 메커니즘인 커널 내 lowmemorykiller 드라이버를 사용하여 시스템 메모리 압력을 모니터링했습니다. 커널 4.12에서는 lowmemorykiller 드라이버가 업스트림 커널에서 제거되었으며 userspace lmkd가 메모리 모니터링을 수행하고 종료 작업을 처리합니다.

사용자 공간 lmkd

사용자 공간 lmkd는 커널 내 드라이버와 동일한 기능을 구현하지만 기존 커널 메커니즘을 사용하여 메모리 부족을 감지하고 예측합니다. 이러한 메커니즘에는 커널 생성 vmpressure 이벤트 또는 PSI(압력 스톨 정보) 모니터를 사용하여 메모리 압력 수준에 대한 알림을 받고, 메모리 cgroup 기능을 사용하여 프로세스 중요도에 따라 각 프로세스에 할당된 메모리 리소스를 제한하는 것이 포함됩니다.

종료 전략

사용자 공간 lmkdvmpressure 이벤트 또는 PSI 모니터, 이벤트의 심각도와 기타 힌트(예: 스왑 사용률)를 기준으로 종료 전략을 지원합니다. 종료 전략은 메모리 부족 기기와 고성능 기기 간에 다릅니다.

  • 메모리가 부족한 기기에서는 시스템이 더 높은 메모리 압력을 정상 작동 모드로 허용해야 합니다.
  • 고성능 기기에서 메모리 압력은 비정상적인 상황으로 보고 전체 성능에 영향을 미치기 전에 해결해야 합니다.

ro.config.low_ram 속성을 사용하여 종료 전략을 구성할 수 있습니다. 자세한 내용은 RAM 부족 구성을 참조하세요.

사용자 공간 lmkd는 커널 내 lowmemorykiller 드라이버와 동일한 전략(즉 여유 메모리 및 파일 캐시 임계값)을 사용하여 종료를 결정하는 레거시 모드도 지원합니다. 레거시 모드를 사용하려면 ro.lmk.use_minfree_levels 속성을 true로 설정합니다.

사용자 공간 lmkd 사용

Android 9 이상 버전의 경우 커널 내 lowmemorykiller 드라이버가 감지되지 않으면 사용자 공간 lmkd가 활성화됩니다. 사용자 공간 lmkd에는 메모리 cgroup에 대한 커널 지원이 필요하므로 커널을 다음 구성 설정으로 컴파일해야 합니다.

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
    CONFIG_MEMCG=y
    CONFIG_MEMCG_SWAP=y
    

PSI(압력 스톨 정보)

Android 10 이상에서는 메모리 압력 감지를 위해 커널 PSI(압력 스톨 정보) 모니터를 사용하는 새로운 lmkd 모드를 지원합니다. 업스트림 커널의 pSI 패치 세트(4.9 및 4.14 커널로 백포트됨)는 메모리 부족으로 인해 작업이 지연되는 시간을 측정합니다. 이러한 지연은 사용자 환경에 직접적인 영향을 미치므로 메모리 압력 심각도를 결정하는 데 편리한 측정 항목입니다. 또한 업스트림 커널에는 권한 있는 사용자 공간 프로세스(예: lmkd)가 이러한 지연에 대한 임계값을 지정하고 임계값을 위반했을 때 커널에서 이벤트를 구독하도록 하는 PSI 모니터도 포함됩니다.

PSI 모니터와 vmpressure 신호

(메모리 압력 감지를 위해 커널에서 생성하고 lmkd)에서 사용하는) vmpressure 신호에는 종종 수 많은 거짓양성이 포함되어 있기 때문에 lmkd는 필터링을 수행해 메모리가 실제로 부족한지 확인해야 합니다. 이로 인해 불필요한 lmkd wakeup과 추가 컴퓨팅 리소스 사용이 발생합니다. PSI 모니터를 사용하면 메모리 압력을 더 정확하게 감지하고 필터링 오버헤드가 최소화됩니다.

PSI 모니터 사용

vmpressure 이벤트 대신 PSI 모니터를 사용하려면 ro.lmk.use_psi 속성을 구성합니다. 기본값은 true인데, 이 경우 PSI 모니터가 lmkd의 메모리 압력 감지 기본 메커니즘입니다. PSI 모니터에는 커널 지원이 필요하므로 커널은 PSI 백포트 패치를 포함하고 PSI 지원이 사용 설정된 상태(CONFIG_PSI=y)에서 컴파일되어야 합니다.

lmkd 구성

다음 속성을 사용하여 특정 기기에 대해 lmkd를 구성합니다.

속성 용도 기본값
ro.config.low_ram 메모리가 부족한 기기와 고성능 기기 간에 선택할 수 있습니다. false
ro.lmk.use_psi vmpressure 이벤트 대신 PSI 모니터를 사용합니다. true
ro.lmk.use_minfree_levels 사용 가능한 메모리 및 파일 캐시 임계값을 사용하여 프로세스 종료 결정을 내립니다(즉, 커널 내 lowmemorykiller 드라이버의 기능과 일치해야 함). false
ro.lmk.low 낮은 vmpressure 레벨에서 종료할 수 있는 프로세스에 대한 최소 oom_adj 점수입니다. 1001
(사용 중지됨)
ro.lmk.medium 중간 vmpressure 레벨에서 종료할 수 있는 프로세스에 대한 최소 oom_adj 점수입니다. 800
(캐시되거나 필수가 아닌 서비스)
ro.lmk.critical 심각한 vmpressure 레벨에서 종료할 수 있는 프로세스에 대한 최소 oom_adj 점수입니다. 0
(모든 프로세스)
ro.lmk.critical_upgrade 심각한 수준으로 업그레이드할 수 있습니다. false
ro.lmk.upgrade_pressure 시스템이 너무 많이 스왑되어 레벨이 업그레이드되는 최대 mem_pressure입니다. 100
(사용 중지됨)
ro.lmk.downgrade_pressure 아직 사용 가능한 메모리가 충분하기 때문에 vmpressure 이벤트가 무시되는 최소 mem_pressure입니다. 100
(사용 중지됨)
ro.lmk.kill_heaviest_task 적합한 모든 작업을 종료(빠른 결정)하는 대신 가장 적합한 작업을 종료합니다(최상의 결정). true
ro.lmk.kill_timeout_ms 수행될 추가 종료가 없는 경우 종료 후 경과된 기간입니다(ms). 0
(사용 중지됨)
ro.lmk.debug lmkd 디버그 로그를 사용 설정합니다. false

기기 구성의 예:

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