.NET용 AWS SDK의 놀라운 콜드 스타트 ​​페널티

3778 단어 dotnetserverlessaws
이 게시물은 .NET용 AWS SDK 초기화 시 성능 패널티에 대한 경각심을 일깨우는 내용입니다.

.NET을 사용하는 모든 AWS Lambda 함수에서 발생하는 시작 세금입니다. 다행스럽게도 무료인 INIT 단계에서 발생시키는 것은 간단합니다. 그러나 콜드 스타트 ​​중에는 피할 수 있는 방법이 없습니다. 초기화 오버헤드가 훨씬 낮아야 한다고 생각하지 않을 수 없습니다.

이 벤치마크에서 코드는 생성자에서 S3 클라이언트를 초기화한다는 점을 제외하면 기본 함수와 거의 동일합니다.

using System.IO;
using System.Threading.Tasks;
using Amazon.S3;

namespace Benchmark.AwsSdk {

    public sealed class Function {

        //--- Fields ---
        private IAmazonS3? _s3Client;

        //--- Constructors ---
        public Function() {

            // initialize S3 client
            _s3Client = new AmazonS3Client();
        }

        //--- Methods ---
        public async Task<Stream> ProcessAsync(Stream request) {
            return Stream.Null;
        }
    }
}


콜드 스타트 ​​기간



다음 표는 1,024MB, 1,769MB 및 5,120MB의 3가지 메모리 구성과 함께 .NET 6, Tiered Compilation 및 ReadyToRun을 사용한 새로운 측정을 보여줍니다.

.NET용 AWS SDK를 초기화하면 콜드 스타트 ​​기간에 120ms 이상의 패널티가 추가됩니다. 초기화는 INIT 단계에서 발생하므로 메모리 구성에 관계없이 영향은 동일하게 유지됩니다.


건축물
메모리 크기
계층
레디투런
PreJIT
초기화
감기 사용
총 콜드 스타트
패널티


암64
1024MB


아니요
380.461
41.773
422.234
147.21

암64
1769MB


아니요
377.036
29.365
406.401
141.856

암64
5120MB


아니요
349.227
28.428
377.655
136.467

x86_64
1024MB


아니요
344.643
29.678
374.321
128.797

x86_64
1769MB


아니요
339.3
23.058
362.358
122.975

x86_64
5120MB


아니요
325.178
22.468
347.646
124.422


잠재적 원인



AWS SDK for .NET 에 대한 코드를 보면 느린 초기화의 원인이 endpoints.js 파일인 것 같습니다. 이 700KB 이상의 메갈로돈 JSON 파일은 AWS SDK가 초기화될 때마다 구문 분석됩니다. 이는 AWS Core 어셈블리에서 발생하므로 이 패널티는 모든 AWS 서비스 클라이언트에서 발생합니다.

향후 AWS 팀에서 이 문제를 수정하기를 바랍니다. 우둔한 평신도로서 나는 끝점 정의가 해당 패키지에 속할 것으로 예상합니다. 또한 현재 AWSSDK.Core.dll 어셈블리 크기가 눈에 띄게 1.5MB이므로 더 작은 Lambda 배포 패키지를 생성합니다!

무엇 향후 계획



다음 게시물에서는 Lambda 함수와 함께 최상위 문을 사용할 때의 영향을 벤치마킹합니다. Lambda 코드를 작성하는 이 새로운 방법은 미학적으로 보기 좋지만 숨겨진 비용이 있습니까?

좋은 웹페이지 즐겨찾기