You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promtail写入positions.yaml报错(too many open files)求助

Promtail运行数小时后报"too many open files"错误(已调整inotify/ulimit仍未解决)

问题场景

每日收集近3GB日志,在aarch64架构VM上运行Promtail(未容器化),与Loki部署在同一主机。运行数小时后出现以下报错:

Jul 07 14:54:53 ip-127.0.0.1 promtail-linux-arm64[74099]: level=error ts=2023-07-07T14:54:53.188346106Z caller=positions.go:179 msg="error writing positions file" error="open/local/promtail/.promtail_positions.yaml3507440037425283515: too many open files"
Jul 07 14:54:58 ip-127.0.0.1 promtail-linux-arm64[74099]: level=error ts=2023-07-07T14:54:58.078325647Z caller=positions.go:179 msg="error writing positions file" error="open /local/promtail/.promtail_positions.yaml6187472917671051760: too many open files"

已提前调整以下参数,但问题复现:

  • fs.inotify.max_user_watches = 100000
  • fs.inotify.max_user_instances = 512
  • fs.inotify.max_queued_events = 100000
  • ulimit -n 1000000

排查与解决方法

1. 验证Promtail进程的实际文件句柄限制

执行cat /proc/<promtail_pid>/limits,查看Max open files项的实际值。如果不是设置的1000000,说明限制未生效:

  • 若用systemd管理Promtail,编辑服务文件(如/etc/systemd/system/promtail.service),添加以下配置后重启服务:
    [Service]
    LimitNOFILE=1000000
    
  • 若直接启动Promtail,需确保启动前已设置ulimit,或修改/etc/security/limits.conf并重启系统:
    * soft nofile 1000000
    * hard nofile 1000000
    

2. 优化positions文件写入配置

报错显示生成了带随机后缀的positions临时文件,说明写入逻辑可能频繁创建文件导致句柄泄漏。调整配置减少写入频率:

positions:
  filename: /local/promtail/.promtail_positions.yaml
  sync_period: 1m  # 延长同步周期,默认可能为10s

同时确认/local/promtail/目录权限正确,Promtail进程拥有读写权限。

3. 检查日志采集的文件句柄占用

用lsof -p <promtail_pid>查看Promtail打开的所有文件,确认是否有大量未关闭的日志文件:

  • 若存在大量已归档的日志文件未被释放,在scrape_config中添加文件生命周期限制:
    scrape_configs:
    - job_name: your_job_name
      static_configs:
      - targets: [localhost]
        labels:
          __path__: /path/to/your/logs/*.log
      # 自动关闭超过7天的日志文件
      max_age: 7d
      # 定期刷新文件列表
      file_sd_configs:
      - files: [/path/to/your/logs/*.log]
        refresh_interval: 1m
    

4. 升级Promtail到最新稳定版

部分旧版本Promtail存在positions文件写入的句柄泄漏bug,升级到官方最新稳定版(如2.x系列)可修复此类问题。

5. 调整系统全局文件句柄限制

执行sysctl fs.file-max查看系统全局文件句柄上限,若数值过低,设置并生效:

echo "fs.file-max = 2000000" >> /etc/sysctl.conf
sysctl -p

内容的提问来源于stack exchange,提问作者ranjith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:34