테스트 스위트에는 꽤 많은 메모리(약 11GB)를 소비하는 여러 테스트가 있습니다. 개발자 컴퓨터에서 이러한 테스트를 실행할 때는 일반적으로 문제가 되지 않지만 CI 컨텍스트에서는 사용 가능한 RAM이 많지 않은 컴퓨터에서 테스트 스위트가 실행되는 경우가 많습니다.
CI 호스트에 메모리가 부족하면 테스트 스위트가 OOMkiller에 의해 중지되고 실패합니다.
전체 테스트 모음이 완전히 실패하는 대신 호스트 특성에 따라 실행되는 테스트를 제한하고 싶습니다.
아이디어는 valgrind의 massif
도구를 사용하여 주어진 테스트가 소비할 메모리 양에 대한 대략적인 값을 얻은 다음 호스트에서 사용 가능한 메모리 양을 확인하고 이를 초과하는 테스트를 건너뛰는 것입니다.
하지만 "얼마나 많은 메모리를 사용할 수 있는지"를 알아내는 것이 결코 사소한 작업이 아니라는 직감이 듭니다.
- CI가 어떤 실행기에서 실행될지는 제어할 수 없습니다. 사용 가능한 RAM 용량이 다른 여러 실행기가 있을 수 있습니다.
- 달리는 사람의 경우 나는
root
통제력이 거의 없거나 전혀 없습니다.OOM 킬러그 자체 - 실행자는 임의의 클라우드 공급자(이 경우 OOMkiller를 제어하는 사람은 누구입니까? 컨테이너? 호스트?)에서 실행되는 도커 컨테이너일 가능성이 높습니다.
그냥 파싱하는 건 /proc/meminfo
좀 순진해 보이는데
- 그러면 컨테이너 내부에 여유 메모리가 제공되나요?
MemAvailable
좋은 옵션인 것 같지만 32GB RAM 데스크탑에서도 현재 사용 가능한 메모리는 10GB만 표시되며 여전히 리소스를 소비하는 프로세스를 실행할 수 있습니다.11GB메모리(afact는MemAvailable
사용 가능한 스왑 공간을 무시함)
분명히 시스템은 동적이며 테스트를 시작할 때 사용 가능한 메모리가 충분할 수 있지만 테스트가 실행되는 동안 다른 프로세스에서 메모리를 소비할 수 있으므로 여전히 메모리가 부족할 수 있습니다.
그래서: 이 문제를 어떻게 해결합니까? OOMkiller의 메모리 제한을 쿼리하는 방법이 있습니까?