Tar 包部署 3.2.3.0 后,迁移 data 和 log 目录后,报错: DND ERROR failed to create dnode since Resource temporarily unavailable

【TDengine 使用环境】
生产环境

【TDengine 版本】

centos7.9 tdengine3.2.3.0

【部署方式】容器/非容器部署

非容器部署

【集群节点数】

【集群副本数】

【描述业务影响】

【问题复现路径/shan】做过哪些操作出现的问题

【遇到的问题:问题现象及影响】

【资源配置】

【报错完整截图】

  • “Resource temporarily unavailable” 对应 Linux errno 11(EAGAIN),是内核资源受限时的典型返回值。

  • taosd 在初始化 dnode(创建 vnode 工作线程、RPC 线程、内存池等)时,某个系统资源申请被拒绝,导致 dnode 创建失败。常见于:

  • 线程/进程数超限(最常见):pthread_create 返回 EAGAIN

  • 文件描述符耗尽:open/socket 返回 EAGAIN 或 EMFILE

  • 内存映射失败:mmap 返回 EAGAIN(vm.max_map_count 过小或内存不足)

排查步骤

1. 确认当前进程实际限制

# 查看 taosd 进程的实际限制

cat /proc/<taosd_pid>/limits

# 查看当前用户会话限制

ulimit -a

  1. 核对系统参数是否满足 TDengine 要求

根据运维知识库(TD-20260420113302),TDengine 部署前要求:

  • nproc soft/hard = 65536(用户最大进程/线程数)

  • nofile soft/hard = 1048576(最大打开文件数)

  • stack soft/hard = 65536(线程栈 KB)

  • fs.nr_open、fs.file-max = 1048576

  • net.ipv4.ip_local_port_range = 10000-65534

3. 重点检查几个常见坑

# 进程/线程数限制(ulimit -u 与 cgroup 双重生效)

ulimit -u

cat /sys/fs/cgroup/pids.max 2>/dev/null

# 文件描述符

ulimit -n

sysctl fs.file-max fs.nr_open

# 内存映射数量(vnode 多时容易踩到)

sysctl vm.max_map_count

  • systemd 部署时,/etc/security/limits.conf 对服务不生效,必须同时配置:

  • Docker/K8s 部署时,容器自身的 pids-limit、ulimits、max_map_count 都要检查,宿主机调优不代表容器内生效。

  • cgroup v2 的 pids.max 若过小,也会导致线程创建失败。

4. 修复配置

# /etc/security/limits.conf

* soft nproc 65536

* hard nproc 65536

* soft nofile 1048576

* hard nofile 1048576

* soft stack 65536

* hard stack 65536

# /etc/sysctl.conf

fs.file-max = 1048576

fs.nr_open = 1048576

vm.max_map_count = 262144 # 若确认是 mmap 问题

sysctl -p

改完后重启 taosd 服务,再观察日志确认 dnode 状态变为 Ready:

SHOW DNODES;

验证

修复后执行:

systemctl restart taosd

tail -f /var/log/taos/taosd.log # 观察 dnode 启动日志

并在 taos 命令行执行 SHOW DNODES;,确认新节点状态为 Ready 而不是 Offline。

另外补充两点:如果日志中同时出现大量 cannot allocate memory,要检查物理内存与 supportVnodes 配置是否匹配;如果只有 create dnode 这一步失败而其他节点正常,优先怀疑该新节点主机的资源限制,而非集群本身问题。