2016-07-13 58 views
15

128MBのメモリのみで構成されたAWS Lambda関数がSNS(それ自体がS3によってトリガーされる)によってトリガーされ、S3からファイルをダウンロードします。私の機能でLambdaのAmazonS3Clientを作成する際のOutOfMemoryError

、私は次のようしている:

public class LambdaHandler { 

    private final AmazonS3Client s3Client = new AmazonS3Client(); 

    public void gdeltHandler(SNSEvent event, Context context) { 
     System.out.println("Starting"); 
     System.out.println("Found " + eventFiles.size() + " event files"); 
    } 

私はコメントアウトと私はAmazonS3Clientの創造に孤立しているのOutOfMemoryErrorを取得していますので、このポストからロジックのすべてを除外しましたオブジェクト。私がそのオブジェクトを取り出したとき、私はエラーを取得しません。上のコードとまったく同じ結果がOutOfMemoryErrorになります。

私は128MBのメモリを関数に割り当てましたが、実際には資格情報を取得してAmazonS3Clientオブジェクトをインスタンス化するだけでは十分ではありませんか?

私は同様の結果を得AmazonS3Clientコンストラクタに

new EnvironmentVariableCredentialsProvider() 

など

new InstanceProfileCredentialsProvider() 

を与えてみました。

AmazonS3Clientオブジェクトを作成すると、単にメモリが増えますか?以下は

スタックトレースです:

Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace at com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder.build(BeanDeserializerBuilder.java:347) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:242) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:409) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:358) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:265) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:245) at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143) at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:439) at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:1588) at com.fasterxml.jackson.databind.ObjectReader.(ObjectReader.java:185) at com.fasterxml.jackson.databind.ObjectMapper._newReader(ObjectMapper.java:558) at com.fasterxml.jackson.databind.ObjectMapper.reader(ObjectMapper.java:3108)

私はInstanceProfileCredentialsProviderまたはEnvironmentVariableCredentialsProviderを提供しようとすると、私は次のスタックトレースを取得:

Exception in thread "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace at lambdainternal.AWSLambda.(AWSLambda.java:62) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94) Caused by: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.makeRequestHandler(EventHandlerLoader.java:421) at lambdainternal.EventHandlerLoader.getTwoLengthHandler(EventHandlerLoader.java:777) at lambdainternal.EventHandlerLoader.getHandlerFromOverload(EventHandlerLoader.java:802) at lambdainternal.EventHandlerLoader.loadEventPojoHandler(EventHandlerLoader.java:888) at lambdainternal.EventHandlerLoader.loadEventHandler(EventHandlerLoader.java:740) at lambdainternal.AWSLambda.findUserMethodsImmediate(AWSLambda.java:126) at lambdainternal.AWSLambda.findUserMethods(AWSLambda.java:71) at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:219) at lambdainternal.AWSLambda.(AWSLambda.java:60) ... 3 more START RequestId: 58837136-483e-11e6-9ed3-39246839616a Version: $LATEST END RequestId: 58837136-483e-11e6-9ed3-39246839616a REPORT RequestId: 58837136-483e-11e6-9ed3-39246839616a Duration: 15002.92 ms Billed Duration: 15000 ms Memory Size: 128 MB Max Memory Used: 50 MB
2016-07-12T14:40:28.048Z 58837136-483e-11e6-9ed3-39246839616a Task timed out after 15.00 seconds

EDIT 1私が割り当てられたメモリを増やした場合機能は192MBにもなりますが、奇妙なことですが、クラウドウォッチログで59MBのメモリしか使用しないという報告はありますが、うまく動作します。私は単に残りの記憶を失っていますか?

+1

に128からラムダに割り当てられたメモリを増やしてみ? 私は、ジャックソンの原因であるクラスの読み込みのために、メタメモリの部分がオーバーロードされていると思います。メタ空間は全メモリの割合です。したがって、全体のjvmメモリを増やすと、メタスペースはOutOfMemoryErrorをスローする前に、より多くのメモリを使用して動作します。 メモリのメタスペース部分を増やすことができればいいでしょう。 (-XX:MaxMetaspaceSize = 512m)可能であれば、jacksonを調整する別の解決策がありますか? メタスペースの説明:https:// plumbr。eu/outofmemoryerror/metaspace –

+0

私が気付いている解決策はありません... – Brooks

答えて

12

ラムダ関数内でAWS Java SDKを使用しているときにこれを観察しています。 メタスペースから出るかもしれないAWSクライアント(同期または非同期)のいずれかを作成すると思われます。

これはAmazonHttpClientの作成やリクエストハンドラチェーンの動的ロード(AmazonEc2Client#init()プライベートメソッドの一部)など、Amazon Clientがインスタンス化時に実行していることが原因であると考えています。

報告されたメモリ使用量はヒープ自体のものですが、メタスペースは含まれていない可能性があります。 AWSフォーラムにはいくつかのスレッドがありますが、AWSからの回答はありません。

+1

もう1つ注目すべきことは、192MBの割り当てで、うまく動作しますが、最初のラムダ実行ではスピンアップしてインスタンス化するのに10秒以上かかりますAmazonS3Clientをインスタンス化するために、AmazonS3Clientをインスタンス化するために、AmazonS3Clientを1時間以内に1時間以内に実行する必要があります。しかし、1時間後には、キャッシュを落として再認証を10秒以上繰り返しているようです。 – Brooks

+0

はい、キープ・アライブ・メカニズムが現れているようです。私はこれ以上掘り下げる時間がなかったが、私はメモリの占有面積を減らす方法を検討している。実際に使用されていない依存関係を削除して、「オプション」としてマークされていない可能性があります。 – AlexejK

2

は、このための解決策を見つけるか256メガバイト

+3

元の質問に対して私が行った編集に注意してください。記憶を増やす​​ことはそれを修正したが、大きな質問をした。 – Brooks

関連する問題