diff --git a/content/blog/k8s/promtail/index.md b/content/blog/k8s/promtail/index.md new file mode 100644 index 00000000..bdf0250e --- /dev/null +++ b/content/blog/k8s/promtail/index.md @@ -0,0 +1,186 @@ +--- +title: "promtail too many open files" +date: 2024-08-08T23:18:40+09:00 +lastmod: 2024-08-08T23:18:45+09:00 +slug: "" +description: "" +keywords: [] +tags: ["devops", "kubernetes", "monitoring", "promtail"] +--- + +{{< toc >}} + +  + +## 개요 + +로그 수집대상인 EC2에서 `"filetarget.fsnotify.NewWatcher: too many open files"` 에러가 발생하는 경우 해결방법. + +크게 2가지 방법이 있고, 2가지 방법 모두 적용하는 걸 권장합니다. + +  + +## 환경 + +### 로그 수집대상 + +loki의 통상적인 로그 수집대상은 파드지만 이 시나리오의 경우 standalone으로 구동되는 EC2 인스턴스였습니다. + +- **로그 수집대상**Target: EC2, amd64, Ubuntu 20.04.5 LTS +- **수집하는 로그**Logs to scrape: the ec2_sd_configs located in `/var/log/**.log`, the journal located in `/var/log/journal` +- **설치된 로그수집 데몬**: Promtail v2.0.0 (controlled by systemd) + +  + +### 로그 저장소 + +- **EKS v1.28** +- **loki-distributed**: [chart 0.79.2](https://github.com/grafana/helm-charts/tree/main/charts/loki-distributed) (loki v2.9.8) + +  + +## 문제점 + +promtail에서 `filetarget.fsnotify.NewWatcher: too many open files` 에러가 발생하면, 로그 파일을 더 이상 열 수 없어 로그 수집이 중단됩니다. 이는 Loki로의 로그 전달에 실패하여 로그 데이터가 누락될 수 있습니다. + +  + +## 해결방법 + +> 앞으로 설명하는 모든 조치 작업은 `sudo -s` 명령어를 통해 `root` 계정으로 전환한 후 수행하거나, `sudo` 명령어를 앞에 붙여서 root 권한으로 실행해야 정확한 결과를 얻을 수 있습니다. + +### LimitNOFILE + +promtail 프로세스에서 inotify를 얼마나 점유하는지 확인합니다. + +```bash +$ sudo lsof | grep inotify | tr -s ' ' | cut -f1,2 -d" " | sort | uniq -c | sort + 25550 promtail- 2965164 +``` + +  + +조치 전에 File descriptor와 관련된 커널 파라미터도 조회합니다. + +```bash +$ sysctl fs.inotify +fs.inotify.max_queued_events = 16384 +fs.inotify.max_user_instances = 1024 +fs.inotify.max_user_watches = 59498 +``` + +제 경우 문제 해결에 위 커널 파라미터 3개에 대한 값 변경은 필요하지 않았습니다. + +  + +공식문서 [Run the Promtail client on AWS EC2](https://grafana.com/docs/loki/latest/send-data/promtail/cloud/ec2/)에 나와있는 방법 그대로 EC2에 promtail을 설치한 후, systemd 데몬을 구성했습니다. + +promtail 데몬의 설정파일인 `promtail.service`를 열고 `500000`으로 설정합니다. + +```yaml +# /etc/systemd/system/promtail.service +[Service] +... +LimitNOFILE=500000 +``` + +  + +`LimitNOFILE` 설정이 추가된 `promtail.service` 설정파일의 내용은 다음과 같습니다. + +```yaml +# /etc/systemd/system/promtail.service +[Unit] +Description=Promtail + +[Service] +User=root +WorkingDirectory=/opt/promtail/ +ExecStartPre=/bin/sleep 30 +ExecStart=/opt/promtail/promtail-linux-amd64 --config.file=./ec2-promtail.yaml +SuccessExitStatus=143 +TimeoutStopSec=10 +Restart=on-failure +RestartSec=5 +LimitNOFILE=500000 + +[Install] +WantedBy=multi-user.target +``` + +  + +변경된 설정을 적용하기 위해 `promtail` 데몬을 reload 한후, 다시 시작합니다. + +```bash +systemctl daemon-reload +systemctl restart promtail.service +``` + +  + +promtail 데몬에 `LimitNOFILE` 설정이 맞게 적용되었는지 확인합니다. + +```bash +$ systemctl show promtail.service -p LimitNOFILE +LimitNOFILE=500000 +``` + +  + +데몬이 구동중인 시간동안 `too many open files` 에러가 지속 발생하는지 다시 관측합니다. + +```bash +# Continue to monitor whether the too many open files error occurs again. +watch -d -n2 "systemctl status promtail -l" +``` + +  + +`LimitNOFILE`을 `500000`으로 설정한 후, promtail이 사용하는 inotify 개수가 110418개로 증가된 걸 확인할 수 있습니다. + +```bash +$ sudo lsof | grep inotify | tr -s ' ' | cut -f1,2 -d" " | sort | uniq -c | sort + 110418 promtail- 3040317 +``` + +5 ~ 10초에 한 번씩 발생하던 `too many open files` 에러도 promtail 데몬에서 더 이상 출력되지 않았습니다. + +  + +### sync interval 완화시키기 + +기본값이 10초인 target sync 간격과 positions 업데이트 간격을 30초로 늘리는 것도 같이 병행합니다. 이는 너무 과도한 Disk I/O 유발을 방지하고 부하를 줄일 수 있습니다. + +```yaml +# /opt/promtail/ec2-promtail.yaml +... +positions: + filename: /opt/promtail/positions.yaml + sync_period: 30s # default: 10s + +target_config: + sync_period: 30s # default: 10s +``` + +  + +## 마치며 + +systemd 즉 리눅스 커널에 걸쳐있는 문제이긴 하지만 프롬테일 문서에는 어떠한 단서도 제공해주지 않아 이틀을 삽질했던 리눅스 커널 관련 이슈였습니다. + +공식 promtail 설치 가이드에는 이 문제에 대한 어떠한 언급도 없는 점이 아쉽습니다. [Run the Promtail client on AWS EC2](https://grafana.com/docs/loki/latest/send-data/promtail/cloud/ec2/) 페이지에 구체적인 해결방법 또는 팁을 추가 해달라는 목적으로 [Document feedback](https://github.com/grafana/loki/issues/13809)을 올렸는데 빨리 받아들여졌으면 좋겠습니다. + +  + +## 관련자료 + +**Loki docs** +[Run the Promtail client on AWS EC2](https://grafana.com/docs/loki/latest/send-data/promtail/cloud/ec2/) + +**Loki github** +[failed to create target - too many open files, ulimit -n 1048576 #1153](https://github.com/grafana/loki/issues/1153) +[Document feedback](https://github.com/grafana/loki/issues/13809) + +**Blog** +[Dealing with too many open files](https://www.robustperception.io/dealing-with-too-many-open-files/)