hippo 데브옵스
2022. 7. 10. 01:24
2022. 7. 10. 01:24
- Linux 시스템의 디스크 I/O 사용량과 파일 시스템 및 inode 사용량을 모니터링
- Prometheus를 사용하여 Disk I/O를 확인 가능
- Prometheus는 메트릭 수집 시스템이며, node_exporter는 다양한 시스템 메트릭을 노출
- 디스크 I/O에 대한 개별 메트릭을 분석 → 디스크 성능, 디스크 사용량 및 애플리케이션에서 발생하는 I/O 대기 시간에 대한 중요한 정보를 제공
디스크 I/O
- Linux 시스템에서 디스크 I/O 메트릭은 파일 시스템에서 몇 개의 파일을 읽음으로써 모니터링 가능
- 디스크 또는 프로세스가 파일인 경우 지정된 시점에 연결된 메트릭을 저장하는 파일이 있음
Node exporter의 원시 디스크 통계
- Linux 시스템에서 node_exporter는 디스크 메트릭을 /proc/diskstats 파일에서 얻어옮
- /proc/diskstat 파일의 형식 → https://www.kernel.org/doc/Documentation/iostats.txt
- 각 prometheus 메트릭은 NewDiskstatsCollector의 소스 코드에서 볼 수 있듯이 해당 파일의 필드 중 하나에 직접 대응함
- prometheus 메트릭 값을 커널 소스 데이터와 일치시키는 것이 중요 → node_exporter는 몇 가지 크기 조정 요소를 제외하고 커널에서 반환된 원시 데이터를 추출함
- 커널이 여러 섹터를 반환하는 경우 node_exporter는 섹터 크기를 곱하여 바이트 수가 됨
- 커널이 시간을 밀리초 단위로 보고하는 경우 node_exporter는 0.001을 곱하여 초를 만듦
Node exporter의 I/O 메트릭 값
1. node_disk_reads_completed_total
2. node_disk_reads_merged_total
- field 2
- 서로 인접한 읽기를 효율성의 위해 병합하는 횟수를 표시
3. node_disk_writes_merged_total
- field 6
- 서로 인접한 쓰기를 효율성의 위해 병합하는 횟수를 표시
4. node_disk_discards_merged_total
- field 13
- 서로 인접한 읽기 및 쓰기는 효율성을 위해 병합될 수 있음
- 두 개의 4K 읽기는 궁극적으로 디스크에 전달되기 전에 하나의 8K 읽기가 될 수 있으므로 하나의 I/O로만 계산(및 대기열에 추가)
- node_disk_discards_merged_total 필드를 통해 읽기 및 쓰기 병합 작업이 얼마나 자주 수행되었는지 알 수 있음
5. node_disk_read_bytes_total
6. node_disk_read_time_seconds_total
- field 4
- 모든 읽기에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정
7. node_disk_writes_completed_total
8. node_disk_written_bytes_total
- field 7
- 성공적으로 쓰기가 완료된 총 바이트 수
9. node_disk_write_time_seconds_total
- field 8
- 모든 쓰기에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정
10. node_disk_io_now
- field 9
- 0으로 가야 하는 유일한 필드
- 요청이 request_queue 구조체에 제공되면 증가하고 완료되면 감소
11. node_disk_io_time_seconds_total
- field 10
- I/O를 수행하는 데 소요된 시간(초)
- node_disk_io_time_seconds_total 필드는 node_disk_io_now가 0이 아닌 한 증가
12. node_disk_io_time_weighted_seconds_total
- field 11
- I/O를 수행하는 데 소요된 가중치(초)
- I/O를 수행하는 데 소요된 시간(초)에 동시 I/O 요청 수를 곱한 값을 계산
- I/O 완료 시간과 누적될 수 있는 백로그(backlog)를 쉽게 측정 가능
13. node_disk_discards_completed_total
- field 12
- 성공적으로 완료된 총 폐기(discard) 수
14. node_disk_discarded_sectors_total
- field 14
- 성공적으로 폐기(discard)된 총 섹터 수
15. node_disk_discard_time_seconds_total
- field 15
- 모든 폐기(discard)에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정
16. node_disk_flush_requests_total
- field 16
- 성공적으로 완료된 총 플러시(flush) 요청 수
17. node_disk_flush_requests_time_seconds_total
- field 17
- 모든 플러시(flush) 요청에 소요된 총 시간(초)