Błąd segmentacji w AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English

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()
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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();
$vbLabelText   $csharpLabel
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 19,936,792 | Wersja: 2026.7 właśnie wydany
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPdf
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.