-- <Mysql>
 
- MyISAM
Buffer pool 이 없어서 OS자체의 buffer cache 를 사용하며 OS 의 flush 메커니즘에 따라서 디스크에 쓰게된다.
MyISAM의 경우 Key_buffer 나 record_buffer, sort_buffer외에도 OS의 버퍼 캐시를 위해 충분한 메모리를 남겨 놓아야하겠습니다.
OS의 버퍼 캐시는 OS가 자동으로 사이즈를 동적으로 할당하며 free 명령어로 상태를 확인할 수 있습니다.


- InnoDB
InnoDB는 오라클처럼 별도의 데이타를 위한 읽기 쓰기 버퍼 메모리를 가지고 있으며, 그것이 innodb_buffer_pool_size입니다.
innodb_buffer_pool_size는 색인과 데이타에 대한 Cache 데이타를 가지고 있습니다.
그래서 MyISAM처럼 Key_buffer가 필요 없는겁니다.
보통 우리가 SQL쿼리로 질의를 수행하면 DBMS는 먼저 이 buffer_pool에서 데이타를 검색하고 없을 경우 디스크에서 읽어서 buffer_pool에 올려놓으며 이것을 \물리적인 읽기\ 라고 합니다.
반면에 이미 buffer_pool에 데이타가 존재하여 디스크를 직접 읽지 않아도 되는 경우를 \논리적 읽기\라고 합니다.
당연히 논리적 읽기가 더 빠르므로 buffer_pool의 사이즈를 크게 설정할 수록 유리합니다.
그러나 무한정 크기를 늘릴 경우 스와핑을 유발할 수 있으므로 자신의 현재 메모리에서 계산하여야 합니다. 적당한 사이즈는 자신의 메모리의 50%-80%입니다.
참고로 x86머신에서는 이 innodb_buffer_pool_size 를 2G이상 설정할 수없으니 참고 바랍니다.


-- <File>

방법들을 아래에 나열하겠습니다.

1) fopen()
c : 현재 파일에 대해 commit-to-disk 기능을 활성화한다.
ps. fflush() 는 commit-to-disk 값에 영향을 받는다.
(commit-to-disk 의 여부에 따라 disk 에 바로 쓰기가 되지 않을 수도 있다는 말?)

2) commode.obj 라이브러리를 링크한다.
commode.obj 가 링크되면 모든 파일에 대해 commit-to-disk 가 활성화 되는걸로
보여진다. ( fopen 시 'c' 옵션을 주지 않아도 되나? )

3) open

O_SYNC : 쓰기시 실제 쓰기가 완료될 때 까지 기다립니다. 즉, 물리적으로 쓰기 완료시에 복귀하게 됩니다.

O_DIRECT(since Linux 2.4.10) : 캐시사용을 최소화 하는듯 합니다. 일반적으로 이 옵션을 쓰면 퍼포먼스 저하가될 수 있지만 필요할 때가 있을듯 합니다.

4) fsync

파일단위의 데이터를 디스크에 동기화 시킨다. fflush 함수는 파일스트림에 대한 사항이고, fsync 는 파일디스크립터에 대한 사항입니다.

(파일단위 작업을 완료하고 디스크에 동기화 하는 방식으로 자주 쓰이는 함수입니다.)

5) sync

모든 파일에 대해 데이터를 디스크에 동기화 시킨다.(프로그램 종료시 등에서는 써볼만 할 듯 합니다.)

+ Recent posts