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

系列文章目录

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



前言

国产欧拉系统在国内企业开始普及,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)统一管理参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞瑞绮绮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值