K8s容器内DPDK应用生成截断core文件 如何延长内核转储收集时长
问题场景
在Kubernetes集群的容器内运行DPDK应用,应用发生段错误崩溃时生成的core文件存在截断问题。
已确认信息
- ulimit -c 已设置为unlimited
- 存储设备无磁盘空间不足问题
- 预期生成的core文件大小约为10GB,仅极少情况能得到完整core文件
- 内核代码追踪确认
fs/coredump.c中的dump_interrupted函数返回true,判定为core生成过程被中断 - 运行环境:CentOS 7,内核版本为3.10.0-693.2.2.rt56.623.el7.x86_64(实时内核)
解决方案
1. 调整内核core生成超时参数
你所用的3.10版本实时内核默认设置了core dump的超时时间,大体积core写入时容易触发超时被中断:
- 临时生效:在Kubernetes节点的宿主机上执行命令
sysctl -w kernel.core_timeout=300,参数单位为秒,可根据磁盘写入速度调整到足够写完10GB文件的数值(比如5~10分钟)。
注意:该参数必须在宿主机层面修改,容器内部修改不生效,core文件生成逻辑由宿主机内核执行 - 永久生效:将
kernel.core_timeout=300写入/etc/sysctl.conf文件,执行sysctl -p命令加载配置即可永久生效。
2. 调整coredump内核线程调度优先级
实时内核环境下,DPDK应用通常会配置高优先级实时调度策略,可能抢占内核coredump线程的运行资源,导致写入超时:
执行命令 chrt -f -p 99 $(pidof kcore_dump) ,将内核coredump线程设置为最高优先级的FIFO调度策略,避免被其他实时进程抢占。
3. 解除容器cgroup资源限制
Kubernetes Pod的CPU、IO限流配置可能导致coredump写入时带宽不足,触发超时:
修改DPDK应用对应的Pod配置,去掉resources下的CPU、IO限制项,或单独调高对应Pod的IO优先级,保证core写入时的IO带宽。
4. 替代方案:使用用户态coredump工具
如果内核原生coredump逻辑无法满足需求,可以使用google-coredumper等用户态core捕获工具,绕过内核的超时逻辑,直接在应用崩溃时由用户态程序完成core文件写入,无内核超时限制。
内容的提问来源于stack exchange,提问作者Prahlada Herle
相关产品推荐
相关产品推荐

