Я запускаю 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 МБ.