클라우드 모니터링, 서버 모니터링, DB 모니터링, 네트워크 관리, 웹 애플리케이션 성능 모니터링, 통합로그관리, ITSM을 단일 플랫폼에서 관리, 브레인즈컴퍼니의 소식을 전합니다.
Filebeat는 Elastic Stack에서 사용하는 경량(light-weight) 데이터 수집기로 logstash 대비 상대적으로 리소스(CPU와 RAM)를 상당히 적게 소모한다는 장점이 있습니다. 또, Filebeat는 간단한 필터 기능도 제공합니다. 하지만 말 그대로 간단한 필터 기능이라 한번에 대용량의 파일을 관리해야 하는 경우 호스트 서버에 부담이 갈 정도로 많은 리소스를 사용할 수 있습니다. 따라서 브레인즈컴퍼니가 운영하는 통합로그관리 에이전트는 호스트의 서버 환경에 따라 filebeat 에이전트의 설정 파일을 수정해서 안정성을 제공하고 있습니다.
본 내용은 Filebeat 리소스 점유율이 높을 때 트러블슈팅 관련 설정 수정사항입니다.
수정에 필요한 기본 파일 위치
linux : /etc/filebeat/filebeat.yml
docker: /usr/share/filebeat/filebeat.yml
filebeat 프로세스 메모리 확인하는 방법
top -d 1 | egrep "PID|filebeat"
수정에 앞서 filebeat의 메인 컴포넌트인 harvester의 개념을 간략하게 설명하겠습니다.
하나의 harvester는 하나의 파일을 읽어드립니다. harvester가 실행 중인 경우 파일을 한 줄씩 읽습니다. 각 파일 당 하나의 harvester가 실행됩니다.
상단의 이미지를 보면 filebeat의 컴포넌트인 input과 harvester가 보입니다. 또한 filebeat이 harvester를 관리하며 어느 파일을 읽을지 관리하는걸 알 수 있습니다.
harvester가 실행 중인 경우 파일 설명자(File Descriptor) 열린 상태로 유지됩니다. 이는 파일이 삭제되거나 파일명이 변경된다 하더라도 파일을 계속 읽게 해줍니다. 하지만 파일 설명자는 harvester가 닫힐 때까지 디스크 공간을 예약합니다.
1. filebeat.inputs:
2. - type: filestream
3. id: my-filestream-id
4. paths:
5. - /var/log/system.log
6. - /var/log/wifi.log
7. - type: filestream
8. id: apache-filestream-id
9. paths:
10. - "/var/log/apache2/*"
11. fields:
12. apache: true
13. fields_under_root: true
<filebeat에서 제공하는 input example>
파일비트가 설정된 filebeat_inputs의 path에 있는 파일들의 갱신 여부를 체크하는 주기입니다. 너무 길게 설정하면 한번에 많은 파일들을 수집하게 됩니다. 반대로 너무 짧게 설정하면 스캔을 너무 잦게 해서 CPU점유율이 올라갑니다. 적당한 조절이 필요합니다.
기본값은 10초입니다. Scan_frequeny가 동작하는 방식은 아래와 같습니다.
harvester 읽기 종료 또는 파일 삭제 → scan_frequency 만큼 대기 → 파일 갱신 확인 → 파일 갱신 시 새 harvester 시작
2. backoff
Backoff 옵션은 파일비트가 얼마나 더 적극적으로 크롤링 하는지 지정합니다. 기본값은 1인데 1일 경우 새 줄이 추가될 경우 1초마다 확인한다는 의미입니다.
Backoff가 동작하는 방식은 아래와 같습니다.
harvester 읽기 종료 또는 파일 삭제 → scan_frequency만큼 대기 → 파일 갱신 확인 → 파일 갱신 시 새 harvester 시작 → 파일 갱신 시 Backoff 시간 마다 다시 확인
3. max_procs
파일비트에서 동시에 사용 가능한 최대의 cpu코어의 숫자를 설정합니다. 예를 들어32 CPU코어 시스템에서 max_procs를 1로 설정한다면 cpu사용률은 3.2%(1/32)를 넘지 않습니다.
max_procs 설정돼 있으면 harvester가 아무리 많이 생성돼도 cpu의 코어 수만큼 CPU를 점유합니다.
4. harvester_limit
harvester의 수가 OS가 감당할 수 있는 파일 핸들러 개수를 초과할 때 사용합니다.
한 input마다 설정되므로 inputs이 5개 선언돼 있으면 해당 input 컴퍼넌트의 harvester 개수 최대치는 5개입니다.
기본값은 0인데, 0일 경우 harvester가 무제한으로 생성 가능합니다. 리소스 관리 최적화에도 유용한데 예를 들어, input1이 input2보다 파일 개수가 3배 많고 중요성이 높을 때 3배 높은 값을 설정하는 것이 좋습니다.
harvester에 의해 파일이 수집되고 있을 때, EOF(End of File)에 도달하는 즉시 파일을 닫습니다.
파일이 계속 갱신된다면 데이터가 유실될 수 있는 여지가 있습니다.
[참조]
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html
개발4그룹에서 로그매니저 및 Zenius AI를 개발하고 있습니다.