我正在Docker中的Linux容器中运行Dotnet Core 2.2。
我尝试了许多不同的配置/环境选项,但我一直遇到内存不足的问题('docker events'报告了OOM)。
在生产环境中,我使用Ubuntu进行托管。对于开发环境,我在Windows上使用Docker的Linux容器(MobyLinux)。
我已经回到运行Web API模板项目,而不是我的实际应用程序。我只是简单地返回一个字符串,什么也没做。如果我从curl调用它约1,000次,容器将死亡。垃圾收集器似乎根本没有工作。
尝试在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
(重复约1,000次)
预期:对于一个非常基本的请求,RAM使用量保持较低。
实际情况:RAM使用量不断增加直至失败。
完整的Dockerfile:
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文件
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
=>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
我在Windows上运行Docker CE Engine 18.0.9.1,在Ubuntu上运行18.06.1。我还尝试了Dotnet Core 2.1。
我也在IIS Express中试过,这个进程的占用内存会达到大约55MB,这是通过多线程等操作不断测试得出的。
当所有操作都完成后,内存使用量会降至29-35MB左右。
docker run --name test --memory-reservation 128m -m 256m --memory-swap 256m -p 8000:80 webapp
命令。然后我从命令提示符中运行了循环:for /L %G in (1, 1, 1000) do (curl -X GET "http://localhost:8000/api/values/7" -H "accept: text/plain" --insecure)
。我运行了这个循环多次,容器从未死掉。 - Matt Thalman