Promtail写入positions.yaml报错(too many open files)求助
问题场景
每日收集近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 = 100000fs.inotify.max_user_instances = 512fs.inotify.max_queued_events = 100000ulimit -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

