docker容器资源限制与容器内的dotnet应用线程限制

 更新时间:2025年09月11日 17:31:01   作者:IT杂人  
文章指出因docker-compose资源限制配置错误(如误将cpu设为0.5导致线程过多),引发redis超时问题,同时微服务中大key、热key等不合理操作加剧redis性能瓶颈,需优化代码和容器参数设置

docker容器资源限制

使用docker-compose管理容器

所以yml文件配置可以 增加

   deploy:
      resources:
        limits:
          cpus: "8"
          memory: 4096M
        reservations:
          cpus: "0.5"
          memory: 500M
  • limits=> cpus: “8” //cpu利用率最大限制:建议设置成实际cpu核数的一半以上,如果单核时,设置0.5即可
  • limits=> memory: “4096M” // 内存分配最大限制:按实际应用分配

另:–pids-limit 限制容器最大可用线程数,用于不可控的线程造成整个服务器挂掉,Tune container pids limit (set -1 for unlimited),在docker-compose.yml文件中不同版本格式不一样。

https://forums.docker.com/t/how-to-set-docker-compose-pids-limit/127609
- 在2.0版本中,是一个大节点配置,与container_name同级
  在portainer2.9.3也只支持如下配置
    pids_limit: 10
- 在3.0以上版本且docker-compse版本要大于1.29以上才支持
    deploy:
      resources:
        limits:
          pids: 10

dotnet程序线程限制

#应用编译目录下文件设置:xxx.runtimeconfig.json
{
  "runtimeOptions": {
    "tfm": "net5.0",
    "framework": {
      "name": "Microsoft.AspNetCore.App",
      "version": "5.0.0"
    },
    "configProperties": {
      "System.Threading.ThreadPool.MinThreads": 8
    }
  }
}

configProperties=>最小线程数:因为使用了容器,不便修改此文件 ,考虑到服务器一般是8核心上,默认写上8核。

对性能的影响

docker官方文档说明 :https://docs.docker.com/engine/reference/commandline/run/

1.通过容器启动时:由于对yml文件中的配置,limits理解错误,设置了0.5,以为是cpu利用率的50%,没发现是针对单核需要这样设置,导致dotnet后台程序线程数多了后,redis的一个使用场景经常报timeout;

2.本地调试时:不会报redis的timeout,也就是线程数可用,资源可用

原因

limits-cpu设置错误

代码质量还是有问题,导致大量线程产生

dotnet程序默认线程数设置问题

本地未发生线程不够的问题,是因为未被容器的限制参数影响

部分微服务在使用redis时,不合理的大key和热key及正则key,造成redis自身也有性能瓶颈,进而影响客户端的timeout

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker swarm快速部署redis分布式集群的详细过程

    docker swarm快速部署redis分布式集群的详细过程

    这篇文章主要介绍了docker swarm快速部署redis分布式集群,只需要通过docker-compose.yml文件和一个启动命令就完成redis分布式部署的方式,让其分别部署在不同机器上,并实现集群搭建,需要的朋友可以参考下
    2022-10-10
  • Docker Compose搭建Wordpress服务实现详解

    Docker Compose搭建Wordpress服务实现详解

    这篇文章主要为大家介绍了Docker Compose搭建Wordpress服务实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • deepin apt命令安装最新版本的docker的方法

    deepin apt命令安装最新版本的docker的方法

    这篇文章主要介绍了deepin apt命令安装最新版本的docker的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Docker容器无法停止删除的解决方案

    Docker容器无法停止删除的解决方案

    这篇文章主要介绍了Docker容器无法停止删除的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Docker 部署RocketMQ的详细操作

    Docker 部署RocketMQ的详细操作

    这篇文章主要介绍了Docker 部署RocketMQ的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 聊聊kubernetes1.20用containerd替换docker(shim)的问题

    聊聊kubernetes1.20用containerd替换docker(shim)的问题

    这篇文章主要介绍了kubernetes1.20用containerd替换docker(shim),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Docker compose up -d与Docker restart的区别

    Docker compose up -d与Docker restart的区别

    本文主要介绍了Docker compose up -d与Docker restart的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • docker-compose如何定义一个桥接网络,并为该网络配置一个IP地址池

    docker-compose如何定义一个桥接网络,并为该网络配置一个IP地址池

    在DockerCompose中定义桥接网络并配置IP地址池,可以实现服务的自动IP地址分配,通过定义网络、指定子网范围、设置网关和启用自动分配功能,可以轻松管理服务的网络配置,确保IP地址在子网范围内且不与其他网络冲突,以避免网络冲突
    2025-01-01
  • Docker安装mysql主从复制的实现步骤

    Docker安装mysql主从复制的实现步骤

    MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点,本文主要介绍了Docker安装mysql主从复制的实现步骤,感兴趣的可以了解一下
    2024-03-03
  • 在Docker中利用Tomcat快速部署web应用的方法示例

    在Docker中利用Tomcat快速部署web应用的方法示例

    这篇文章我们就来说一下怎么在docker中快速部署一个web应用。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01

最新评论