MySQL innodb_flush_method
innodb_flush_method
InnoDB가 dafa files, log files로 data를 flush하는 방법
On Unix and Linux
- options
- fsync(default)
- O_DSYNC
- O_DIRECT
- O_DIRECT_NO_FSYNC
- 각 옵션별 logfile, data file flush method 표
Method | log file open | logfile flush | data file open | data file flush | 설명 |
---|---|---|---|---|---|
fsync | normal | fsync() | normal | fsync() | default |
O_DSYNC | O_SYNC | O_SYNC | normal | fsync() | 이름은 O_DSYNC인데 실제론 O_SYNC임. O_DSYNC를 쓰기에는 몇몇 Unix시스템에서 문제가 있었다고함. synchronized I/O로서, write작업시 hardware단까지 fsync함. |
O_DIRECT | normal | fsync() | O_DIRECT | fsync() | OS caching을 하지 않고 direct I/O로 innodb_buffer_pool에서 file로 I/O함. direct I/O을 지원하는 GNU/Linux versions, FreeBSD, and Solaris에서 사용가능 |
O_DIRECT_NO_FSYNC | normal | fsync() | O_DIRECT | skip fsync() | O_DIRECT와는 달리 flush를 위해서 fsync()함수를 호출하지 않음. 원래 O_DIRECT는 data를 file까지 direct하게 쓰지만 완전한 synchronous I/O를 보장하지는 않으므로, 내부적으로 flush를 위해서 fsync()를 호출했었는데, 이 옵션에서는 fsync()호출을 생략한다. 이는 file system type에 따라 적합 여부를 확인해야한다. (XFS에는 사용하면 안됨) |
- O_DIRECT, O_DIRCET_NO_FSYNC 부연설명
- O_DIRECT는 pache cache, buffer cache는 directly하게 write bypass하지만, inode cache, directory cache, metadata는 따로 fsync()를 호출해서 flush해줘야한다.
- kernel과 file system이 발전하면서, 몇몇 file system에서는 O_DIRECT가 fsync()없이도 metadata까지 synchronize되는 걸 보장한다. 그래서 InnoDB가 O_DIRECT_NO_FSYNC를 추가하게 된것이다.
- 각 옵션별 logfile, data file flush method 그림으로 이해하기
On Windows
- async_unbuffered
- 변경 불가능함
튜닝
- SAN 스토리지가 아니고, hardware RAID controller 와 battery-backed write cache(배터리로 캐쉬 보존 가능)가 있는 스토리지를 사용중이라면, O_DIRECT를 사용할 것을 고려할수 있다.
- O_DIRECT를 사용하면 double buffering(InnoDB buffer pool과 OS file system cache에 두번 캐쉬)을 하지 않기 떄문에 성능향상을 기대할 수 있다.