innodb_flush_method 와 File I / O

4691 단어 직장레저MySQL
전환 하 다http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/
innodb_flush_method 와 File I / O
 
도 방 은 에서 실험 측면 에서 fdatasync, O 를 비교 했다.DSYNC 와 ODIRECT 의 성능 차이.본 고 는 linux / Unix "파일 I / O" (unbuffered I / O) 의 측면 에서 innodb 를 해석 하고 자 합 니 다.flush_method 는 MySQL 의 I / O 에 어떻게 영향 을 줍 니까?【 부록 1 】
innodb_flush_log_at_trx_commt 매개 변 수 는 로그 파일 이 언제 write, flush 인지 확인 합 니 다.innodb_flush_method 는 로그 와 데이터 파일 을 어떻게 쓰 는 지, flush 를 확인 합 니 다.Linux 에서 innodbflush_method 는 다음 과 같은 값 을 취 할 수 있 습 니 다: fdatasync, ODSYNC, O_DIRECT, 그럼 이 세 값 은 각각 파일 쓰기 에 어떻게 영향 을 줍 니까?우선 리 눅 스 의 파일 I / O 가 어떻게 작 동 하 는 지 알 아야 한다.먼저 Linux / Unix 파일 I / O 의 전형 적 인 예 를 살 펴 보 자. (Linux 2.6.24 테스트, gcc 컴 파일)

/**
	A test about syscall of File I/O
	Author:supu@TaobaoDBA
	[email protected] http://orczhou.com http://www.taobaodba.com
*/

#include   "stdlib.h"           /* for exit */
#include   "unistd.h"           /* for write fdatasync*/
#include    "fcntl.h"           /* for open  */
int main(void){
	int fd;
	if((fd=open("/home/zzx/test.file",O_WRONLY|O_APPEND|O_DSYNC))<0){
		exit(1);
        }
        char buff[]="abcdef";
        if(write(fd,buff,6)!= 6){
                exit(2);
        }
        if(fdatasync(fd)==-1){
                exit(3);
        }
        exit(0);
}

프로그램 은 일반적인 파일 I / O 작업 의 세 가지 과정 을 설명 합 니 다. open, write, fdatasync 는 각각 파일 열기, 파일 쓰기, flush 작업 (파일 캐 시 를 디스크 에 긁 습 니 다) 입 니 다.
1. 오픈 단계
open("test.file",O_WRONLY|O_APPDENT|O_SYNC))
시스템 호출 Open 은 이 프로 세 스 의 파일 설명자 fd [부록 2] 입 니 다.여기 O 를 사 용 했 어 요.WRONLY|O_APPDENT|O_SYNC 파일 열기:
O_WRONLY 는 우리 가 파일 에 데 이 터 를 써 야 한 다 는 것 을 알려 주 는 '쓰기' 방식 으로 열 었 다 고 밝 혔 다.
O_APPDENT 는 커 널 에 '추가' 방식 으로 파일 을 쓰 라 고 알려 준다.
O_DSYNC 는 파일 에 데 이 터 를 기록 할 때 데이터 가 디스크 에 기록 되 었 을 때 만 기록 작업 이 완료 되 었 다 고 커 널 에 알려 주 었 다.와 ODSYNC 와 같은 파일 표지, 그리고 OSYNC,O_RSYNC,O_DIRECT。
O_SYNC 비 ODSYNC 는 더욱 엄격 합 니 다. 데이터 가 디스크 에 기록 되 었 을 뿐만 아니 라 해당 하 는 데이터 파일 의 속성 (예 를 들 어 파일 길이 등) 도 업데이트 가 완료 되 어야 write 작업 이 성공 한 것 입 니 다.가시 OSYNC 비교 ODSYNC 는 조작 을 많이 해 야 한다.
O_RSYNC 는 파일 을 읽 을 때 이 파일 의 OS cache 가 디스크 에 모두 flush 되 어야 한다 고 표시 합 니 다 [부록 3].
하면, 만약, 만약...DIRECT 가 파일 을 열 면 읽 기 / 쓰기 동작 이 OS cache 를 건 너 뛰 고 device (disk) 에서 직접 읽 기 / 쓰기 합 니 다.OS cache 가 없어 서 ODIRECT 는 파일 의 순서 읽 기와 쓰기 의 효율 을 떨 어 뜨 린 다.

2. Write 단계
write(fd,buf,6)
open 으로 파일 을 열 어 파일 설명 자 를 얻 은 후에 write 함 수 를 호출 하여 데 이 터 를 기록 할 수 있 습 니 다. write 는 앞의 open 매개 변수 에 따라 다 릅 니 다.
3. Flush 단계
fdatasync(fd) == -1
write 작업 후, 우 리 는 fdatasync 를 호출 하여 파일 데이터 flush 가 disk 에 있 는 지 확인 했다.fdatasync 가 되 돌아 온 후에 데이터 가 디스크 에 기록 되 었 다 고 볼 수 있 습 니 다.이와 같은 flush 함수 에는 fsync, sync 도 있다.
Fsync 와 fdatasync 의 차 이 는 O 와 같다.SYNC 와 ODSYNC 의 차이.
Sync 함 수 는 OS cache 에 있 는 파일 의 데 이 터 를 쓰기 대기 열 에 배열 하고 디스크 를 썼 는 지 확인 하지 않 기 때문에 sync 는 사용 할 수 없습니다.
파일 이 열 리 는 과정 을 무시 합 니 다. 보통 '파일 쓰기' 는 두 단계 가 있 습 니 다. 하 나 는 write 를 호출 하 는 것 입 니 다. 우 리 는 데이터 쓰기 단계 (사실은 open 의 매개 변수 영향) 라 고 부 릅 니 다. fsync (또는 fdatasync) 를 호출 하 는 것 을 flush 단계 라 고 부 릅 니 다.
MySQL 로 돌아 가기, 인자 Innodbflush_method (Linux) 는 Fdatasync, O 로 설정 할 수 있 습 니 다.DSYNC、O_DIRECT。이 세 개의 인자 가 프로그램 MySQL 이 로그 와 데이터 파일 에 어떻게 영향 을 미 치 는 지 봅 시다.
 
Open log
Flush log
Open datafile
Flush data
Fdatasync
 
fsync()
 
fsync()
O_DSYNC
O_SYNC
 
 
fsync()
O_DIRECT
 
fsync() O_DIRECT
Fsync()
fdatasync 는 안전 하 다 고 여 겨 집 니 다. MySQL 에 서 는 항상 fsync 를 사용 하여 flush 데 이 터 를 사용 하기 때 문 입 니 다.O 사용DSYNC 는 위험 합 니 다. 일부 OS 는 이 매개 변수 O 를 무시 합 니 다.SYNC。
우 리 는 O 를 보 았 다.DIRECT 는 fdatasync 와 유사 하지만 O_DIRECT 데이터 파일 을 엽 니 다.대량의 무 작위 기록 작업 이 라면 O_DIRECT 효율 이 높 아 질 것 이라는 데이터 가 있다.하지만 순차 적 기록 과 읽 기 효율 은 떨어진다.그래서 O 를 사용 합 니 다.DIRECT 는 신중 해 야 합 니 다.

좋은 웹페이지 즐겨찾기