首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure函数主机在没有触发的情况下用OutOfMemoryException死掉

Azure函数主机在没有触发的情况下用OutOfMemoryException死掉
EN

Stack Overflow用户
提问于 2019-09-18 11:30:01
回答 2查看 4.9K关注 0票数 1

快速版本:为什么我的函数在5分钟后不做任何事情就把它杀死了?

我有一个Azure函数,它使用nClam扫描blob文件中的病毒。它似乎工作得很好,但突然间它就会杀死它自己,甚至在触发任何水滴之前!它将在使用OutOfMemoryException 5分钟后关闭:

代码语言:javascript
复制
[18/9/2019 10:33:33] Host initialized (405ms)
[18/9/2019 10:33:33] Host started (812ms)
[18/9/2019 10:33:33] Job host started
Hosting environment: Production
Content root path: D:\git\TopoAPI\Antivirus\bin\Debug\netcoreapp2.1
Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.
[18/9/2019 10:33:38] Host lock lease acquired by instance ID '000000000000000000000000C913FBA0'.
[18/9/2019 10:38:46] An unhandled exception has occurred. Host is shutting down.
[18/9/2019 10:38:46] Microsoft.WindowsAzure.Storage: Exception of type 'System.OutOfMemoryException' was thrown. System.Private.CoreLib: Exception of type 'System.OutOfMemoryException' was thrown.
[18/9/2019 10:38:46] Stopping host...
[18/9/2019 10:38:46] Stopping JobHost
[18/9/2019 10:38:46] Job host stopped
[18/9/2019 10:38:46] Host shutdown completed.
Application is shutting down...

下面是我的扫描blob触发功能:

代码语言:javascript
复制
[FunctionName("scanImports")]
        public static async Task Scan([BlobTrigger("imports/{newBlobName}", Connection = "BlobConnectionstring")]CloudBlockBlob newBlob, string newBlobName, ILogger log, ExecutionContext context)
        {
            var config = new ConfigurationBuilder().SetBasePath(context.FunctionAppDirectory).AddJsonFile("local.settings.json", optional: true, reloadOnChange: true).AddEnvironmentVariables().Build();

            var clamClient = new ClamClient(config["ContainerAddress"], int.Parse(config["ContainerPort"]));
            var blobFileStream = await newBlob.OpenReadAsync();

            using (var memoryStream = new MemoryStream())
            {
                await blobFileStream.CopyToAsync(memoryStream);
                var result = await clamClient.SendAndScanFileAsync(memoryStream.ToArray());
                bool isClean = result.InfectedFiles == null || result.InfectedFiles.Count == 0;

                // Check if newBlob is infected. If infected, move to quarantineBlob
                if (!isClean)
                {
                    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(config["blobConnectionstring"]);
                    CloudBlobClient client;
                    CloudBlobContainer container;
                    CloudBlockBlob quarantineBlob;

                    client = storageAccount.CreateCloudBlobClient();
                    container = client.GetContainerReference(config["QuarantineBlobName"]);

                    await container.CreateIfNotExistsAsync();

                    quarantineBlob = container.GetBlockBlobReference(newBlobName);
                    quarantineBlob.Properties.ContentType = newBlob.Properties.ContentType;

                    await quarantineBlob.UploadFromStreamAsync(memoryStream);
                    await newBlob.DeleteAsync();
                }
            }
        }

更新1:主机与OutOfMemoryException正好在5分钟后死亡。我试图延长功能超时,这并没有什么不同。在此期间,进程将不断使用5-8%的cpu,并且在它死前,进程将使用超过1500 MB的内存。

更新2: --如果我从函数中删除所有代码,只留下一个log.info()语句,主机在使用OutOfMemoryException 5分钟后仍然会关闭它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-23 10:15:54

造成我的问题的原因是我试图触发的blob中包含了100.000+文件。微软将其定义为高标度

所以我的代码实际上没有问题。它只是,如果我试图触发一个“高规模”blob,那么我的代码将只做分配内存和死亡。

票数 2
EN

Stack Overflow用户

发布于 2019-09-18 19:33:09

默认情况下,Azure函数的寿命为5分钟。在那之后,它会自杀的。

如果您在azure上承载了azure函数,那么在host.json中您可以将functionTimeout值设置为更高的值

指示所有函数的超时时间。 在无服务器消费计划中,有效范围为1秒至10分钟,默认值为5分钟。 在计划中,没有总体限制,默认取决于运行时版本。 在2.x版本中,计划的默认值是30分钟。 在1.x版本中,它是null,表示没有超时。它不能被设定为无限。如果我们没有显式地设置这个值,它将接受默认的30分钟值。

https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json#functiontimeout

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57991758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档