ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mysql InnoDB 에서 OS Cache 와의 관계
    개발/dbms 2020. 8. 3. 21:06

    정의


    innodb_flush_method 설정값에 따라 In-Memory 에서 On-Disk 로 데이터를 전송할때 OS Cache 를 어떻게 활용할것인지 변경된다.

     

     

    동작원리


     

     

     

    value 설명 log file open log file flush data file open data file flush
    fsync (default) InnoDB 가 data file  log file 를 fsync() 를 호출하여 플러시한다. default fsync() default fsync()
    O_DSYNC

    InnoDB 가 log file을 플러시 할때에는 O_SYNC 를 이용하여 flush 하고 data file 은 fsync() 를 호출하여 플러시한다.

    O_DSYNC 를 사용하기에는 몇몇 UNIX 시스템에서 문제가 있어서 O_SYNC 를 사용한다고 한다.

    O_SYNC O_SYNC default fsync()
    O_DIRECT

    InnoDB 가 O_DIRECT를 사용하여 data file 을 열고 fsync() 호출하여 데이터와 로그 파일 모두 플러시한다.

    (이 옵션은 일부 GNU/리눅스 버전, FreeBSD 및 Solaris에서 사용할 수 있다.)

    default fsync() O_DIRECT fsync()
    O_DIRECT_NO_FSYNC

    InnoDB 가 O_DIRECT 를 사용하여 data file 을 열고 flush 한다. 쓰기 작업 이후 fsync() 호출은 스킵한다.

    (kernel 과 file system이 발전하면서 몇몇 file system 에서는 O_DIRECT가 fsync() 없이도 metadata 까지 synchronize되는걸 보장한다고 해서 해당 옵션이 추가되었다고 함)

    default fsync() O_DIRECT skip fsync()

     

    fsync

    버퍼에 기록한 정보를 실제 디스크에 쓰는 함수

    sync / fsync / fdatasync 함수를 사용해서 디스크에 쓸수 있다.

    #include <unistd.h>
    void sync(void);
    int fsync(int fd);
    int fdatasync(int fd);

    위 코드에서 보면 sync 는 void 여서 return 값이 존재 하지 않는다. 즉 해당 함수실행이 끝났다고해서 디스크에 쓰여 졌다는 것을 보장할수 없고 충분한 시간이 흐른 뒤에는 디스크에 반영한다는 것은 보장한다.
    fsync 와 fdatasync 함수는 물리적인 디스크에 반영하고 난 후에 값을 반환한다. 반환값이 -1 이 아니면 성공이다. fdatasync 함수는 버퍼 내용을 디스크에 쓰는 것만 보장하지만 fsync 는 변경한 파일 속성등의 메타 데이터도 반영한다.

     

    O_DIRECT

    I/O시 kernel buffer에 caching하지 않고 바로 disk에 read/write하라는 설정
    이 옵션이 설정되면 성능이 많이 떨어질 수 있다. (InnoDB 에서 관리하는 메모리를 사용하기 때문에 Double buffering 을 없애고자 해서 사용하는 옵션)
    이 옵션이 설정되지 않으면, 프로그램에서 write 함수 argument 2번째에 넣어주면
     kernel이 데이터를 수신하자마자 바로 정상 return 하고 disk write는 kernel이 여유가 있거나 kernel buffer 최대 지연 시간이 도래하게되면 disk에 write 한다
    그러나 파일의 meta 정보(최종파일 access 시간 등)는 동기화를 바로 하지 않는다.

     

    O_SYNC

    O_DIRECT 와 같지만 파일의 meta 정보(최종파일 access 시간 등)도 동기화를 바로 한다.

     

    최적화


    O_DIRECT 를 사용하는 이유는 Double buffering (InnoDB buffer poll & OS cache 에 중복 쓰기 현상)을 막아 메모리를 효율적으로 사용하고자 함이다.

    InnoDB 는 Buffer Pool 이라는 고도화된 메모리 관리 영역을 가지고 있기때문에 Buffer Poll 과 OS Cache 두곳에 중복해 저장할 필요가 없다.

    (OS Cache 는 DB 전용으로 할당 된 캐시가 아니기 때문에 DB 작업 외에 작업시 언제든지 지워질수 있다. )

    공식 문서에도 무조건 어떤 설정이 좋다는 말이 없다. Buffer Pool 과 Redo log Size 를 적절하게 변경하고 테스트를 통하여 설치된 서버환경에 최적화된 설정값을 변경하자.

     

     

    Reference


    https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_method

    http://minsql.com/mysql/mysql-innodb_flush_method/

    https://man7.org/linux/man-pages/man2/open.2.html

    https://www.it-note.kr/19

    http://ehpub.co.kr/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-3-8-sync-fsync/

    https://www.mimul.com/blog/sysvar_innodb_flush_method/

    '개발 > dbms' 카테고리의 다른 글

    Mysql Undo Log 란  (0) 2020.08.03
    Mysql Redo Log 란  (0) 2020.08.03
    master 와 slave 의 쿼리실행 계획이 틀려진 이유는 ?  (0) 2019.09.17
    mysql 을 두개 설치해보자  (0) 2018.11.09
    Inoodb buffer pool 이란 ?  (0) 2018.11.09
Designed by Tistory.