Контейнер Dotnet Core Docker пропускает ОЗУ в Linux и вызывает OOM - PullRequest
3 голосов
/ 10 мая 2019

Я запускаю Dotnet Core 2.2 в контейнере Linux в Docker.

Я перепробовал много разных вариантов конфигурации / среды - но я продолжаю возвращаться к той же проблеме нехватки памяти ('dockerEvents 'сообщает OOM).

В производстве я размещаю на Ubuntu.Для разработки я использую контейнер Linux (MobyLinux) в Docker в Windows.

Я вернулся к выполнению проекта шаблона веб-API, а не к моему настоящему приложению.Я буквально возвращаю строку и больше ничего не делаю.Если я позвоню примерно 1000 раз из curl, контейнер умрет.Сборщик мусора не работает вообще.

Попытался установить следующие переменные окружения в docker-compose:

DOTNET_RUNNING_IN_CONTAINER=true
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
ASPNETCORE_preventHostingStartup=true

Также попробовал следующее в docker-compose:

mem_reservation: 128m
mem_limit: 256m
memswap_limit: 256m

(это только заставляет его умирать быстрее)

Попытка установить следующее в true или false, без разницы:

ServerGarbageCollection

Я пытался вместо этого работать какКонтейнер Windows, это не OOM - но, похоже, он также не учитывает ограничения памяти.

Я уже исключил использование HttpClient и EF Core - поскольку я даже не использую их в своем примере,Я прочитал немного о прослушивании порта 443 как о проблеме - поскольку я могу оставить контейнер бездействующим весь день, если я проверю в конце дня - он израсходовал немного больше памяти (не огромное количество, но эторастет).

Пример того, что в моем API:

// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "You said: " + id;
}

Пример вызова с Curl:

curl -X GET "https://localhost:44329/api/values/7" -H  "accept: text/plain" --insecure

(повторяется 1000 раз или около того)

Ожидается: использование ОЗУ остается низким для очень примитивного запроса

Фактически: использование ОЗУ продолжает расти до сбоя

Полный файл Docker:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

docker-compose.yml

version: '2.3'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY-}webapplication1
    mem_reservation: 128m
    mem_limit: 256m
    memswap_limit: 256m
    cpu_percent: 25
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

docker-compose.override.yml

version: '2.3'

services:
  webapplication1:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44329
      - DOTNET_RUNNING_IN_CONTAINER=true
      - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
      - ASPNETCORE_preventHostingStartup=true
    ports:
      - "50996:80"
      - "44329:443"
    volumes:
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro

Я использую Docker CE Engine 18.0.9.1 для Windows и 18.06.1 для Ubuntu.Чтобы подтвердить - я также пытался в Dotnet Core 2.1.

Я также попробовал в IIS Express - процесс достигает 55 МБ, что буквально спамит его несколькими потоками и т. Д.

Когда все это сделано, оно уменьшается примерно до 29-35 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...