Our team has done comparisons in a Windows based environment vs a Unix environment.
Several dozen requests cause the service to run out of memory in the Unix environment, but this does not occur in the Windows based environment.
Code snippet:
[HttpPost]
public async Task<IActionResult> MemLeakSample(IFormFile formFile)
{
using MemoryStream sourceDocument = new MemoryStream();
await formFile.CopyToAsync(sourceDocument);
List<string> images = new List<string>();
using Document pdfDoc = new Document(sourceDocument);
int docPageCount = pdfDoc.Pages.Count;
for (int pageCount = 1; pageCount <= docPageCount; pageCount++)
{
using (MemoryStream memStream = new MemoryStream())
{
using Page page = pdfDoc.Pages[pageCount];
Rectangle pageRect = page.GetPageRect(true); // Get page size respecting page orientation
JpegDevice jpegDevice = new JpegDevice(Convert.ToInt16(pageRect.Width), Convert.ToInt16(pageRect.Height), new Resolution(72), 25);
// Convert a particular page and save the image to stream
jpegDevice.Process(page, memStream);
// Convert to byte array, and then to base 64 image url
images.Add("data:image/jpeg;base64," + Convert.ToBase64String(memStream.ToArray()));
}
}
return this.Ok(images);
}
Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
COPY DocumentService ./
RUN dotnet restore
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/sdk:3.1
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 5000/tcp
EXPOSE 80
ENV ASPNETCORE_URLS http://*:5000
RUN apt-get update && apt -y install libgdiplus && ln -s libgdiplus.so gdiplus.dll && apt-get install -y libc6-dev && apt -y install apache2 && apt-get install -y supervisor && a2enmod headers && a2enmod proxy && a2enmod proxy_http && a2enmod deflate
ADD DocumentService/docker/service.conf /etc/apache2/sites-available/
ADD DocumentService/docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN rm /etc/apache2/sites-available/000-default.conf && cp /etc/apache2/sites-available/service.conf /etc/apache2/sites-available/000-default.conf
ENTRYPOINT ["/usr/bin/supervisord"]