innodb_flush_method | |
Command-Line Format | --innodb-flush-method=value |
System Variable | innodb_flush_method |
Scope | Global |
Dynamic | No |
SET_VAR Hint Applies | No |
Type | String |
Default Value (Unix) | O_DIRECT (미지원 시 fsync) |
Default Value (Windows) | unbuffered |
Valid Values (Unix) | fsync O_DSYNC littlesync nosync O_DIRECT O_DIRECT_NO_FSYNC |
Valid Values (Windows) |
unbuffered normal |
innodb_flush_method 시스템 변수는 InnoDB 데이터 파일과 로그 파일에 데이터를 플러시하는 데 사용되는 방법을 정의합니다.
유닉스 계열 시스템에서는 기본값이 O_DIRECT이며, O_DIRECT를 지원할 수 없는 환경에서는 기본값이 fsync가 됩니다.
윈도우 시스템에서는 기본값이 unbuffered입니다.
- fsync, 0
InnoDB는 fsync() 시스템 호출을 사용하여 데이터 파일과 로그 파일을 모두 플러시합니다.
- 설명: fsync()는 파일 시스템에서 데이터와 메타데이터 모두를 디스크에 플러시합니다.
- 용도: fsync()는 파일의 실제 데이터와 그 파일의 메타데이터(수정시간 등)을 디스크에 기록합니다. 데이터베이스에서 트랜잭션을 커밋하는 순간 데이터의 영속성을 보장합니다.
- 단점: 데이터뿐만 아니라 메타데이터도 함께 디스크에 플러시 되기 때문에 성능에 악영향을 미칠 수 있습니다. 대규모 트랜잭션에서 디스크 I/O가 많이 발생할 수 있습니다. - O_DSYNC, 1
InnoDB는 로그 파일을 열고 플러시하는 데 O_SYNC를 사용하며, fsync()를 사용하여 데이터 파일을 플러시합니다.
유닉스 환경에서 여러 문제가 발생했기 때문에 직접적으로 O_DSYNC를 사용하지 않습니다.
- 설명: O_DSYNC는 파일의 데이터만을 디스크에 플러시합니다. 메타데이터는 필요하지 않으면 플러시되지 않습니다.
- 용도: 데이터베이스에서 메타데이터 플러시를 피하고, 데이터만 디스크에 기록하여 성능을 최적화하려는 경우 사용됩니다.
- 단점: 메타데이터가 플러시되지 않기 때문에 파일 시스템의 일관성이 유지되지 않을 수 있습니다. 그러나 데이터의 영속성은 보장되므로 데이터베이스에서 성능이 중요한 경우 고려될 수 있습니다. - littlesync, 2
이 옵션은 내부 성능 테스트에 사용되며, 현재 지원되지 않습니다.
라이브 환경에서는 사용해서는 안 됩니다.
- 설명: littlesync는 MySQL에서 작은 크기의 I/O를 다룰 때, I/O 동기화가 불필요한 경우에 사용됩니다. 로그 파일 등 작은 파일에 대한 동기화에서 성능을 최적화하기 위해 사용됩니다.
- 용도: littlesync 는 주로 로그 파일과 같은 작은 I/O 작업에서 디스크 I/O 성능을 최적화하는 데 사용됩니다.
- 단점: 이 설정을 사용할 경우 일부 데이터 손실이 발생할 수 있으며, 로그 파일 동기화가 중요한 경우에는 적합하지 않을 수 있습니다. - O_DIRECT, 4
InnoDB는 데이터 파일을 열기 위해 O_DIRECT(또는 Solaris에서 directio())를 사용하며, fsync()를 사용하여 데이터 파일과 로그 파일을 모두 플러시합니다.
이 옵션은 일부 GNU/Linux 버전, FreeBSD, Solaris에서만 사용가능합니다.
- 설명: O_DIRECT는 디스크 I/O를 직접 처리하여, 운영 체제의 파일 시스템 캐시를 우회하도록 설정합니다. 데이터는 바로 디스크로 기록되고 운영 체제의 캐시를 사용하지 않습니다.
- 용도: O_DIRECT는 큰 데이터 파일을 처리하거나 성능 최적화가 중요한 환경에서 사용됩니다. 파일 시스템 캐시의 오버헤드를 줄이고, 디스크의 성능을 직접 활용할 수 있게 해줍니다.
- 단점: 캐시를 사용하지 않기 때문에 디스크에 직접 접근하는 방식은 I/O 성능에 큰 영향을 미칠 수 있으며, 특정 유형의 데이터베이스 작업에서는 성능이 떨어질 수 있습니다. - O_DIRECT_NO_FSYNC
InnoDB 스토리지 엔진은 I/O 플러시 시 O_DIRECT를 사용하지만, 쓰기 작업 후 fsync() 시스템 호출을 건너뛸 수 있습니다.
MySQL은 새 파일을 생성한 후 파일 크기를 늘리고, 파일을 닫은 후 fsync()를 호출하여 파일 시스템 메타데이터 변경 사항이 동기화되도록 합니다. 그러나 각 쓰기 작업 후에는 fsync() 시스템 호출을 건너뛸 수 있습니다.
- 설명: O_DIRECT_NO_FSYNC는 O_DIRECT와 비슷하지만, fsync() 시스템 호출을 사용하지 않으며 데이터만을 디스크에 플러시합니다. 즉, 메타데이터는 플러시하지 않고, 데이터만을 직접 디스크에 기록합니다.
- 용도: O_DIRECT_NO_FSYNC는 데이터베이스가 빠르게 디스크에 기록할 수 있도록 하며, 성능을 최적화할 수 있습니다. 그러나 메타데이터를 플러시하지 않기 때문에 데이터베이스의 영속성을 보장하는 데 어려움이 있을 수 있습니다.
- 단점: 이 방식은 메타데이터의 일관성을 보장하지 않기 때문에, 데이터가 디스크에 안전하게 기록되는 것을 확실히 보장하지 않습니다.
비교요약
옵션 | 설명 |
fsync | 데이터와 메타데이터를 디스크에 플러시 (안전하지만 성능 저하 가능) |
O_DSYNC | 데이터만 디스크에 플러시 (성능 향상, 메타데이터는 플러시하지 않음) |
littlesync | 작은 I/O에 대해 최적화된 동기화 방식 (로그 파일 등) *사용X |
O_DIRECT | 파일 시스템 캐시를 우회하고, 데이터를 직접 디스크에 기록 (성능 최적화) |
O_DIRECT_NO_FSYNC | O_DIRECT와 유사하나, fsync()를 사용하지 않음 (성능 향상, 메타데이터 플러시 없음) |
리두 로그 파일과 데이터 파일이 서로 다른 저장 장치에 있는 경우, 데이터 손실이 발생할 수 있습니다.
또한, 데이터 파일 쓰기가 배터리로 백업되지 않은 장치 캐시에서 플러시되기 전에 예기치 않은 종료가 발생할 가능성이 있습니다.
리두 로그 파일과 데이터 파일을 서로 다른 저장 장치에 배치하려는 경우 또는 데이터 파일이 배터리로 백업되지 않은 캐시가 있는 장치에 저장된 경우, O_DIRECT 사용을 권장합니다.
Windows 시스템에서 사용할 수 있는 innodb_flush_method 옵션은 다음과 같습니다.
- unbuffered, 0
InnoDB는 비버퍼링 I/O를 사용합니다.
(Windows에서 4K 섹터 하드 드라이브를 사용하는 경우, MySQL 서버는 unbuffered 설정을 지원하지 않습니다.
이 경우 innodb_flush_method=normal을 사용해야 합니다.)
- normal, 1
InnoDB는 버퍼링 I/O를 사용합니다.
각 설정이 성능에 미치는 영향은 하드웨어 구성과 워크로드에 따라 달라집니다.
최적의 설정값을 선택하려면 해당 환경에서 벤치마킹을 수행하는 것이 좋습니다.
또한, 설정별로 Innodb_data_fsyncs 상태 변수를 확인하면 전체 fsync() 호출 횟수(또는 innodb_use_fdatasync가 활성화된 경우 fdatasync() 호출 횟수)를 확인할 수 있습니다.
읽기 및 쓰기 작업의 비율에 따라 같은 설정값이라도 성능이 달라질 수 있습니다.
예를 들어, 하드웨어 RAID 컨트롤러와 배터리 백업이 포함된 쓰기 캐시가 있는 시스템에서는 O_DIRECT 설정이 InnoDB 버퍼 풀과 운영 체제 파일 시스템 캐시 간의 이중 버퍼링을 방지하는 데 도움이 될 수 있습니다.
반면, InnoDB 데이터 및 로그 파일이 SAN(Storage Area Network)에 위치한 일부 시스템에서는 기본값이나 O_DSYNC 설정이 읽기 위주의 워크로드(주로 SELECT 문을 실행하는 경우)에서 더 나은 성능을 제공할 수 있습니다.
항상 실제 운영 환경과 유사한 하드웨어 및 워크로드에서 이 설정을 테스트하는 것을 권장합니다.
MySQL :: MySQL 8.4 Reference Manual :: 17.14 InnoDB Startup Options and System Variables
MySQL :: MySQL 8.4 Reference Manual :: 17.14 InnoDB Startup Options and System Variables
dev.mysql.com
'Database > MySQL' 카테고리의 다른 글
[MySQL] InnoDB Cluster 3부작 : 2. Group Replication (2) - 구성하기 (0) | 2025.03.19 |
---|---|
[MySQL] InnoDB Cluster 3부작 : 1. Group Replication (1) - 개념 이해하기 (0) | 2025.03.17 |
[MySQL] binlog_format (0) | 2025.03.12 |
[MySQL] InnoDB I/O Capacity 설정 (0) | 2025.03.11 |
[MySQL] MHA 구성 (0) | 2025.03.10 |