Błąd segmentacji w AWS Lambda
Podczas korzystania z AWS Lambda w kontenerze Linux i wielokrotnego wywoływania metody renderowania jednocześnie, czasami powoduje to następujący wyjątek.
Wyjątek:
Błąd: Środowisko uruchomieniowe zakończyło działanie z błędem: sygnał: błąd segmentacji Runtime.ExitError
Rozwiązania
Rozwiązaniem jest wywołanie metody GC.Collect po wyrenderowaniu dokumentu PDF. Ten problem zostal zglaszony na Amazon Linux 2023 z najnowszymi wersjami IronPDF; wczesniejsze wdrozenia korzystajace z .NET 6 i Amazon Linux 2 nie sa dotkniete.
// Create an instance of ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the HTML string to a PDF document
PdfDocument document = renderer.RenderHtmlAsPdf(htmlString);
// Explicitly trigger garbage collection to help manage memory usage
GC.Collect();
// Create an instance of ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the HTML string to a PDF document
PdfDocument document = renderer.RenderHtmlAsPdf(htmlString);
// Explicitly trigger garbage collection to help manage memory usage
GC.Collect();
' Create an instance of ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
' Render the HTML string to a PDF document
Dim document As PdfDocument = renderer.RenderHtmlAsPdf(htmlString)
' Explicitly trigger garbage collection to help manage memory usage
GC.Collect()
Renderowanie wieloprocesowe i bledy wstring_convert::from_bytes
Jeśli GC.Collect() nie rozwiązuje problemu, pierwotną przyczyną może być renderowanie wieloprocesowe lub ponowne użycie globalnego ChromePdfRenderer w ramach pojemnika Lambda. Powoduje to albo blad segmentacji, albo wyjatek C++:
Process runtime-1 exited: signal: segmentation fault
Error while generating PDF from HTML: 'wstring_convert::from_bytes'
Te bledy sa sporadyczne i moga pojawic sie dopiero po pierwszym lub drugim wywolaniu kontenera Lambda.
Rozwiązanie
Ustaw Installation.SingleProcess = true, przekieruj ścieżki do /tmp i stwórz nowy ChromePdfRenderer dla każdej operacji wywołania:
IronPdf.Installation.SingleProcess = true;
IronPdf.Installation.TempFolderPath = "/tmp";
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(htmlString);
IronPdf.Installation.SingleProcess = true;
IronPdf.Installation.TempFolderPath = "/tmp";
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(htmlString);
Imports IronPdf
IronPdf.Installation.SingleProcess = True
IronPdf.Installation.TempFolderPath = "/tmp"
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(htmlString)
Nie wywołuj Installation.Initialize() i nie przechowuj ChromePdfRenderer jako statyczną lub polową instancję. Trwaly renderer przenosi nieaktualny stan pamieci do kolejnych wywolan Lambda i powoduje awarie.
// Avoid: global renderer reuse
private readonly ChromePdfRenderer _renderer = new();
// Avoid: calling Initialize()
Installation.Initialize();
// Avoid: global renderer reuse
private readonly ChromePdfRenderer _renderer = new();
// Avoid: calling Initialize()
Installation.Initialize();

