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_ratio
和vm.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:默认限制容器权限,仅保留部分能力(如
CHOWN
、NET_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
规则分散容器部署节点。
监控与调优
集成cAdvisor
或Prometheus
监控容器资源使用率,动态调整参数。
定期分析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 格式存储到文件中。
- 默认日志驱动,适合本地开发和调试。
- 替代方案:
syslog
、journald
、fluentd
等。
–log-opt max-size=50m
设置单个日志文件的最大大小为 50MB。
- 当日志文件达到 50MB 时,Docker 会自动滚动(rotate)日志。
–log-opt max-file=10
设置保留的日志文件数量上限为 10 个。
- 超过数量限制时,最旧的日志文件会被删除。
- 结合
max-size
,总日志量最多为50MB × 10 = 500MB
。
典型应用场景
- 高并发服务:通过
nofile
和nproc
调整限制,避免资源耗尽。 - 日志管理:限制日志文件大小和数量,防止磁盘空间被占满。
注意事项
- 修改
ulimit
需确保宿主机内核支持(如fs.nr_open
和pid_max
)。 - 生产环境建议使用集中式日志系统(如 ELK、Fluentd)替代本地文件日志。
症状:ping丢包验证,执行命令dmesg 中频繁出现 conntrack: table full, dropping packet
- 临时修改
- 增加条目上限
sysctl -w net.netfilter.nf_conntrack_max=2000000
- 缩短超时时间
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)统一管理参数。