当前位置: 首页 > news >正文

Docker在欧拉系统上内核参数优化实践

系列文章目录

Docker在欧拉系统上内核参数优化实践


文章目录

  • 系列文章目录
  • 前言
  • 欧拉系统默认内核参数
    • 进程与内存管理
    • 文件系统与IO
    • 网络相关参数
    • 内核调度与性能
    • 查看与修改方法
    • 注意事项
  • Docker容器的默认内核参数
    • 内核命名空间隔离
    • 内核参数控制
    • 安全相关参数
    • 查看与修改方法
  • 针对高并发业务场景,Docker容器优化参数
    • 资源限制与分配
    • 网络性能优化
    • 存储I/O优化
    • 容器启动参数
    • 编排工具配合
    • 监控与调优
    • 参数详解
      • --ulimit nofile=65536:65536
      • --ulimit nproc=65536:65536
      • --log-driver=json-file
      • --log-opt max-size=50m
      • --log-opt max-file=10
      • 典型应用场景
      • 注意事项
    • 症状:ping丢包验证,执行命令dmesg 中频繁出现 conntrack: table full, dropping packet
    • 注意事项


前言

国产欧拉系统在国内企业开始普及,Dcoker部署也支持很好,关于内核参数优化这块分享一下。也是遇到了很多坑后的积累。


欧拉系统默认内核参数

欧拉系统(openEuler)作为基于Linux的企业级操作系统,其默认内核参数继承并优化了Linux内核的默认配置,同时针对服务器场景进行了调整。以下是关键参数的分类说明:


进程与内存管理

  • vm.swappiness:默认值通常为60,表示系统倾向于使用交换分区(swap)的程度。服务器场景可能调整为10以下以减少交换。
  • vm.overcommit_memory:默认为0,允许内核在估算内存分配时适度超售。数据库场景可能设为1禁止超售。
  • vm.dirty_ratiovm.dirty_background_ratio:分别默认为20%10%,控制脏页写入磁盘的阈值。

文件系统与IO

  • fs.file-max:默认值通常为8192或更高,表示系统最大文件句柄数。高并发场景需调至65535以上。
  • vm.dirty_expire_centisecs:默认为3000(30秒),定义脏页在内存中保留的最长时间。
  • fs.aio-max-nr:异步IO请求数上限,默认值通常为65536,适合高IO负载服务。

网络相关参数

  • net.ipv4.tcp_syncookies:默认为1,启用SYN洪水攻击防护。
  • net.ipv4.tcp_max_syn_backlog:默认128,定义半连接队列大小,高并发需增至2048
  • net.core.somaxconn:默认为128,调整监听队列长度,建议设为1024以上。
  • net.ipv4.tcp_tw_reuse:默认为0,启用(设为1)可加速TIME-WAIT状态端口重用。

内核调度与性能

  • kernel.sched_migration_cost_ns:默认值影响任务迁移决策,欧拉可能针对NUMA架构优化。
  • kernel.numa_balancing:默认为1,启用NUMA平衡,适用于多核服务器。
  • kernel.pid_max:进程ID上限,默认32768,容器环境下可调高。

查看与修改方法

  • 查看当前值
    sysctl -a | grep <参数名>
    
  • 临时修改
    sysctl -w <参数名>=<>
    
  • 永久生效
    编辑/etc/sysctl.conf,添加或修改参数后执行:
    sysctl -p
    

注意事项

  • 参数优化需结合具体负载测试,避免盲目调整。
  • 关键参数(如vm.swappiness)的默认值可能因欧拉版本或衍生发行版(如麒麟OS)略有差异。
  • 生产环境建议通过/etc/sysctl.d/目录分模块管理配置。

Docker容器的默认内核参数

Docker容器默认使用宿主机的内核,但通过命名空间(namespaces)和控制组(cgroups)实现隔离。以下是关键的内核参数及其默认行为:

内核命名空间隔离

  • PID命名空间:每个容器有独立的进程树,默认启用。
  • Network命名空间:每个容器拥有独立的网络栈(IP、端口、路由等)。
  • Mount命名空间:容器内的文件系统挂载点与宿主机隔离。
  • UTS命名空间:容器可以有自己的主机名和域名。
  • IPC命名空间:进程间通信(如System V IPC)隔离。
  • User命名空间:默认禁用,需手动启用以实现UID/GID映射。

内核参数控制

  • net.ipv4.ip_forward:默认为1,允许容器间网络通信。
  • net.core.somaxconn:默认值通常为128,影响容器内服务的连接队列大小。
  • vm.swappiness:默认值为60,容器继承宿主机设置(可通过--memory-swappiness调整)。

安全相关参数

  • Capabilities:默认限制容器权限,仅保留部分能力(如CHOWNNET_BIND_SERVICE等)。
  • Seccomp:默认启用过滤系统调用,配置文件位于/etc/docker/seccomp/default.json
  • AppArmor/SELinux:若宿主机启用,默认加载Docker的AppArmor/SELinux策略。

查看与修改方法

  • 查看宿主机内核参数:
    sysctl -a
    
  • 修改容器内核参数(需特权模式):
    docker run --privileged -it ubuntu sysctl -w <parameter>=<value>
    
  • 通过--sysctl覆盖特定参数(Docker 17.06+):
    docker run --sysctl net.core.somaxconn=1024 nginx
    

针对高并发业务场景,Docker容器优化参数

资源限制与分配

通过--cpus限制容器CPU使用量,避免单个容器耗尽主机资源。例如--cpus=2表示限制容器最多使用2个CPU核心。
使用--memory限制内存,例如--memory=4g限制容器内存为4GB。配合--memory-swap控制交换空间,防止内存溢出导致性能下降。

网络性能优化

选择高性能网络模式,如--network=host直接使用主机网络栈,减少NAT开销,适合延迟敏感型应用。
调整TCP内核参数:--sysctl net.core.somaxconn=1024增加连接队列长度,--sysctl net.ipv4.tcp_tw_reuse=1加速TIME_WAIT连接复用。

存储I/O优化

对磁盘密集型应用,使用--mount type=tmpfs,target=/cache将临时数据挂载到内存文件系统。
避免使用默认存储驱动,优先选择overlay2并配置--storage-opt overlay2.override_kernel_check=true以提升文件操作效率。

容器启动参数

设置--restart=always确保容器异常退出后自动重启,结合--health-cmd配置健康检查。
通过--ulimit nofile=65535调整文件描述符上限,应对高连接数场景。

编排工具配合

在Kubernetes中配置resources.requests/limits实现资源预留与硬限制。
使用HorizontalPodAutoscaler根据CPU/内存指标自动扩缩容,配合affinity规则分散容器部署节点。

监控与调优

集成cAdvisorPrometheus监控容器资源使用率,动态调整参数。
定期分析docker stats输出,识别CPU/内存瓶颈,针对性优化。

参数详解

docker run 命令用于启动容器,以下参数用于配置容器的资源限制和日志管理:

–ulimit nofile=65536:65536

设置容器内进程的打开文件描述符(file descriptor)的软限制和硬限制均为 65536。

  • nofile 表示最大文件打开数。
  • 第一个值(65536)是软限制(容器内进程可自行调整,但不能超过硬限制)。
  • 第二个值(65536)是硬限制(系统管理员设置的绝对上限)。

–ulimit nproc=65536:65536

设置容器内用户的最大进程数(软限制和硬限制均为 65536)。

  • nproc 表示单个用户可创建的进程数。
  • 超过限制可能导致 fork 失败或 bash: fork: retry: Resource temporarily unavailable 错误。

–log-driver=json-file

指定容器日志的驱动为 json-file,即日志以 JSON 格式存储到文件中。

  • 默认日志驱动,适合本地开发和调试。
  • 替代方案:syslogjournaldfluentd 等。

–log-opt max-size=50m

设置单个日志文件的最大大小为 50MB。

  • 当日志文件达到 50MB 时,Docker 会自动滚动(rotate)日志。

–log-opt max-file=10

设置保留的日志文件数量上限为 10 个。

  • 超过数量限制时,最旧的日志文件会被删除。
  • 结合 max-size,总日志量最多为 50MB × 10 = 500MB

典型应用场景

  • 高并发服务:通过 nofilenproc 调整限制,避免资源耗尽。
  • 日志管理:限制日志文件大小和数量,防止磁盘空间被占满。

注意事项

  • 修改 ulimit 需确保宿主机内核支持(如 fs.nr_openpid_max)。
  • 生产环境建议使用集中式日志系统(如 ELK、Fluentd)替代本地文件日志。

症状:ping丢包验证,执行命令dmesg 中频繁出现 conntrack: table full, dropping packet

  • 临时修改
  1. 增加条目上限
sysctl -w net.netfilter.nf_conntrack_max=2000000
  1. 缩短超时时间
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1800  # 30分钟
  • 永久生效
vi /etc/sysctl.conf
# 末尾追加
net.netfilter.nf_conntrack_max=2000000
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1800  # 30分钟
# 保存
sysctl -p

代码示例:启动优化后的容器

docker run -d \--name highload_app \--cpus=2 \--memory=4g \--network=host \--sysctl net.core.somaxconn=1024 \--mount type=tmpfs,target=/cache \--ulimit nofile=65536:65536 \--ulimit nproc=65536:65536 \--log-driver=json-file \--log-opt max-size=50m \--log-opt max-file=10  \--restart=always \your_image:latest

注意事项

  • 默认参数可能因Docker版本或宿主机OS不同而变化。
  • 修改内核参数需谨慎,可能影响容器稳定性或安全性。
  • 生产环境中建议通过编排工具(如Kubernetes)统一管理参数。

文章转载自:

http://NgynkhSW.kwpnx.cn
http://RKjJFfmo.kwpnx.cn
http://JwioIRcG.kwpnx.cn
http://8RSkzG2n.kwpnx.cn
http://CYT5MwGe.kwpnx.cn
http://zGclOLz7.kwpnx.cn
http://YFx2ZMj6.kwpnx.cn
http://52e51Yrj.kwpnx.cn
http://Gn6myaWD.kwpnx.cn
http://sPXbBSLb.kwpnx.cn
http://CIBWbEdh.kwpnx.cn
http://5IxLFqci.kwpnx.cn
http://GE0WvuYV.kwpnx.cn
http://7JnQsBYi.kwpnx.cn
http://ziDtF6Cq.kwpnx.cn
http://gGbmSZFW.kwpnx.cn
http://W4ckH4MJ.kwpnx.cn
http://bkuzmLXo.kwpnx.cn
http://46EYrk3O.kwpnx.cn
http://mqkklvmJ.kwpnx.cn
http://PKIY0dmV.kwpnx.cn
http://XHAzieKK.kwpnx.cn
http://kMxrG9zv.kwpnx.cn
http://wvJ1olaB.kwpnx.cn
http://GvJcsa0T.kwpnx.cn
http://FP7IpkWv.kwpnx.cn
http://rHecek0D.kwpnx.cn
http://aUf6D5vz.kwpnx.cn
http://javVh3At.kwpnx.cn
http://YHP2446e.kwpnx.cn
http://www.dtcms.com/a/386348.html

相关文章:

  • 【Linux系列】查询磁盘类型
  • 机械革命笔记本电脑重装Windows系统详细教程
  • RustFS vs MinIO:深入对比分布式存储的性能、功能与选型指南
  • GLSL 版本与应用场景详解
  • QNX与Linux的详细对比分析
  • PHP 并发处理与进程间通信深度解析
  • 洛谷 下楼梯 动态规划
  • 仓颉编程语言青少年基础教程:class(类)(上)
  • MySQL数据库(五)—— Mysql 备份与还原+慢查询日志分析
  • 可迭代对象、迭代器对象
  • GEO 优化系统开发:内容优化策略的技术设计与落地实践​
  • leetcode347.前k个高频元素
  • GPU 服务器:为科研算力需求保驾护航
  • 解决Cursor 远程ssh连不上服务器的问题
  • AR技术赋能火灾防控:消防员的“透视眼”与“预测脑”
  • 佩京ar虚拟互动换装软件+换装一体机
  • 11 神经网络研究的一些问题
  • Python快速入门专业版(三十二):匿名函数:lambda表达式的简洁用法(结合filter/map)
  • MATLAB中基于 S-V模型进行毫米波信道建模与仿真
  • 深入分析LangSmith使用及自动化评估
  • fastapi 中间件的使用
  • 2025最新超详细FreeRTOS入门教程:第十九章 FreeRTOS与中间件集成(TCPIP、MQTT、文件系统)
  • Vue2实战场景:图表组件 + Grid 布局
  • Linux:基于阻塞队列的生产者消费模型
  • springboot+vue (ruoyi-vue前后端分离)集成钉钉登录
  • 从单一辅助到深度协作!GPT-5-Codex 改写软件开发工作流
  • JavaScript——document对象
  • 图观 流渲染场景编辑器
  • 探索大语言模型(LLM):Windows系统与Linux系统下的Ollama高级配置(修改模型地址、Service服务以及多卡均衡调用)
  • PowerBI实战-制作带有同比及趋势线的双柱状图