AWS IoT Greengrass V2의 Lambda가 곧 죽기 때문에 할당된 메모리를 추가했습니다

전제 조건

  • 랩베리피에 AWS IoT Greengrass V2를 가져와 Lambda
  • 를 이동합니다.
  • 람다는'지속 시간이 긴 람다'(Long-Lived Lambda)

  • 발생 현상(스토리지 할당을 늘리는 계기)


  • 라떼 파이 위에 람보를 올려놓고 조금 있으면 죽어


  • 라떼파에 들어가서 일지/greengrass/v2/logs를 보면 status가 broken이에요.
  • greengrass.log
    2021-12-22T05:26:32.793Z [INFO] (lambda-function-lifecycle) com.aws.greengrass.status.FleetStatusService: fss-status-update-published. Status update published to FSS. {serviceName=FleetStatusService, currentState=RUNNING}
    2021-12-22T05:26:32.798Z [INFO] (pool-2-thread-30) com.aws.greengrass.lambdamanager.UserLambdaService: Shutdown initiated. {serviceInstance=0, serviceName=lambda-function, currentState=BROKEN}
    2021-12-22T05:26:37.182Z [INFO] (pool-2-thread-29) com.aws.greengrass.lambdamanager.LambdaRequestHandler: get-work-item. Get work operation got interrupted. {arn=arn:aws:lambda:ap-northeast-1:000000000000:function:lambda-function:48}
    2021-12-22T05:26:37.612Z [INFO] (pool-2-thread-30) com.aws.greengrass.lambdamanager.UserLambdaService: generic-service-shutdown. {serviceInstance=0, serviceName=lambda-function, currentState=BROKEN}
    
    lambda 로그
    2021-12-22T05:26:36.268Z [INFO] (pool-2-thread-21) lambda-function: Caught SIGTERM. Stopping runtime.. {serviceInstance=0, serviceName=lambda-function, currentState=BROKEN}
    2021-12-22T05:26:37.586Z [INFO] (pool-2-thread-21) lambda-function: Tearing down overlay tmpfs mounts. {serviceInstance=0, serviceName=lambda-function, currentState=BROKEN}
    
  • lambda 작업 기간vmstat,io의bi는 매우 크다.즉, SD 카드에 대한 읽기가 많이 발생
  • # vmstat 5
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa 
     1  1   1280  95244 172028 423852    0    0  8930    15 1238 2658 16 15 59 10  0
     1  1   1280  95276 172036 423608    0    0 16782   126 1744 4032 15 20 44 22  0
     1  1   1280  96324 172036 423480    0    0 18354     1 1560 3543 14 19 40 27  0
    

    람바다 사망의 원인


    Lambda가 사용할 수 있는 메모리가 부족합니다!!
    Greengrass를 이동하는 JVM(Java 가상기)의 메모리도 부족합니다!!

    대응 방법(스토리지 할당 증가 방법)


    다음 두 가지가 필요합니다.
  • 모바일 Greengrass에 사용할 JVM(Java 가상기)의 메모리 증가
  • Lambda 사용 가능한 스토리지 증가
  • JVM 메모리 할당 증가 방법


    디버그를 만들 때 aws.greengrass.Nucleus 구성 요소 설정에 다음 내용을 추가하십시오. (통합 설정 표시줄에 쓰기)
  • 스토리지의 최대 한계는 128MB입니다.숫자를 변경하면 변경할 수 있습니다.
  • 결합 설정
    { "jvmOptions": "-Xmx128m" }
    

    주의

  • Nucleus는 필수 구성 요소이기 때문에 디버깅할 때 지정하지 않아도 설치할 수 있지만 이 설정에 가입하기 위해서는 명확하게 지정하십시오.
  • 을 지정할 때 Nucleus 버전이 다른 구성 요소의 의존 관계에 큰 영향을 미친다는 것을 주의하십시오.특히 LegacySubscriptionRouter와의 관계에 주의해야 합니다.
  • 인용하다


    https://docs.aws.amazon.com/ja_jp/ja_jp/greengrass/v2/developerguide/configure-greengrass-core-v2.html#jvm-tuning

    Lambda 메모리 할당을 늘리는 방법


    두 가지 방법이 있다.그 중 한 쪽에서 실시하세요.본질적으로 둘 다 같다.

    Lambda 어셈블리를 제작할 때(버전을 제작할 때) 설정


    용기 파라미터의 비망록 크기를 늘리면 됩니다

    디버그 시 구성 요소 설정을 통해 비망록 크기 지정


    디버그를 만들 때, Lambda 구성 요소 설정에 다음 내용을 추가하십시오. (통합 설정 표시줄에 쓰기)
  • 다음은 스토리지 할당96MB입니다.
  • 결합 설정
    {"containerParams": {"memorySize": 96000}}
    

    기타


    greengrass 디버그 로그를 발표하는 방법

    aws.greengrass.Nucleus 구성 요소의 설정에 다음 내용을 추가하면 디버그 로그가 출력되기 때문에 조사에 진전이 있을 것입니다.
    결합 설정
    {"logging": {"level": "DEBUG"}}
    

    감상으로 불리는 불평

  • 세상에 그린라스 V2의 정보는 너무 적다.
  • Broken이 되는 원리는classmethod이 있다는 보도다.
    https://dev.classmethod.jp/articles/greengrass-v2-lambda-compoent-broken/
  • 메모리가 부족하지만 OS의 양도를 봐도 메모리에 문제가 없다는 것은 어렵다.
  • IO Reedit는class10의SD카드의 보증치를 넉넉히 초과하여 파일 접근만 의심합니다.
  • 람다의 메모리 분배만 늘리면 지옥은 아무것도 바뀌지 않는다.제일 먼저 시도해 봤지만 결국 죽어버렸고'기억이랑 상관없어?'
  • JavaVM의 스토리지 할당을 모릅니다...
  • 톱니바퀴에서 직접 같은 코드를 실행해도 재현되지 않기 때문에 그린라스에서 디버깅을 하지 않으면 확인할 수 없어 번거롭다.
  • 괜찮은 debug 도구를 원합니다.
  • 좋은 웹페이지 즐겨찾기