프로덕션 환경 중 하나에는 RedHat 클러스터에서 두 개의 인스턴스가 실행되고 하나는 클러스터와 연결된 하나의 프로덕션 인스턴스가 있습니다.
인스턴스 1이 차지하는 24G InnoDB 버퍼 풀과 인스턴스 2가 차지하는 12G가있는 125G 기본 메모리가 있으며 이는 RedHat 클러스터와 관련이 없습니다. 데이터 및 트랜잭션 로그는 모두 ext3 파일 시스템이있는 LVM 디스크 파티션에 있습니다.
성능 향상 및 더 나은 I / O 처리량을 위해로 변경 innodb_flush_method
하기 로 결정했습니다 O_DIRECT
.
MySQL 문서를 참조하십시오.
InnoDB 데이터 및 로그 파일이 SAN에있는 경우 간단한 명령문의 성능 을 3 배 저하시킬 수 있는 설정
innodb_flush_method
이O_DIRECT
있습니다SELECT
.
고성능 MySQL Ver 2 및 3을 참조하면 InnoDB 개발자는를 사용하여 버그를 발견했다고 언급했습니다 innodb_flush_method=O_DSYNC
. O_SYNC
과 O_DSYNC
비슷 fsync()
하고 fdatasync()
: O_SYNC
반면, 동기화 데이터와 메타 데이터를 O_DSYNC
동기화 데이터뿐만.
그 모든 것이 조언없이 많은 설명처럼 보이면 다음 조언이 있습니다.
Unix와 유사한 운영 체제를 사용하고 RAID 컨트롤러에 배터리 지원 쓰기 캐시가있는 경우을 사용하는 것이 좋습니다
O_DIRECT
. 그렇지 않은 경우O_DIRECT
응용 프로그램에 따라 기본값 또는 아마도 최선의 선택 일 것입니다.
인터넷 검색, 나는이있어 벤치 마크 보고서 :에 O_DSYNC
대O_DIRECT
벤치 마크 보고서 : ==================== 1B 행 복합 트랜잭션 테스트, 64 스레드 * SAN O_DIRECT : 읽기 / 쓰기 요청 : 31560140 (초당 8766.61) * SAN O_DSYNC : 읽기 / 쓰기 요청 : 5179457 (초당 1438.52) * SAN fdatasync : 읽기 / 쓰기 요청 : 9445774 (2623.66 / 초) * 로컬 디스크 O_DIRECT : 읽기 / 쓰기 요청 : 3258595 (초당 905.06) * 로컬 디스크 O_DSYNC : 읽기 / 쓰기 요청 : 3494632 (970.65 / 초) * 로컬 디스크 fdatasync : 읽기 / 쓰기 요청 : 4223757 (초당 1173.04)
그러나 O_DIRECT
이중 캐싱을 비활성화하여 I / O 처리량을 향상시킬 수있는 OS 수준 캐시를 비활성화합니다.
O_DIRECT
오히려 함께가는 것이 좋 O_DSYNC
습니까? 이 두 가지 옵션은 약간 혼동됩니다. 특히 프로덕션 환경에서 데이터, 읽기 / 쓰기에 영향을 미치지 않으면 서 I / O 처리량을 높이고 성능을 향상시킬 수있는 옵션은 무엇입니까? 개인적인 경험에 근거한 더 나은 제안이 있습니까?
게시물 에서 Rolando Update를 볼 수 있습니다 .
여전히이 두 매개 변수에 약간의 혼란이 있습니다. 를 사용하여 대부분의 프로덕션 구성 템플릿을
O_DIRECT
볼 수있는 곳에서는 권장하는 곳을 보지 못했습니다O_DSYNC
.
체계
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server 릴리즈 5.5
- 배터리 쓰기 캐시가있는 Raid Controller가있는 DELL DRAC 512MB
- 배터리 백업 장치 (BBU)가 장착 된 Dell PERC 컨트롤러 H700.
추가 정보
mysql>은 'innodb_thread_concurrency'와 같은 변수를 보여줍니다; + --------------------------- + ------- + | Variable_name | 가치 | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 행 세트 (0.00 초) mysql>은 'innodb_read_io_threads'와 같은 변수를 보여줍니다; 빈 세트 (0.00 초) mysql>은 'innodb_write_io_threads'와 같은 변수를 보여줍니다; 빈 세트 (0.00 초)
우리는 기본 플러그인을 사용하고 있으므로 InnoDB 상태에서 정보를 게시했습니다.
mysql> PLUGIN_NAME이 '% innodb %'이고 PLUGIN_TYPE이 'STORAGE ENGINE'\ G 인 플러그인에서 SELECT * FROM *************************** 1. 행 *********************** ******* PLUGIN_NAME : InnoDB PLUGIN_VERSION : 1.0 PLUGIN_STATUS : 활성 PLUGIN_TYPE : 스토리지 엔진 PLUGIN_TYPE_VERSION : 50151.0 PLUGIN_LIBRARY : NULL PLUGIN_LIBRARY_VERSION : NULL PLUGIN_AUTHOR : 이노베이스 OY PLUGIN_DESCRIPTION : 트랜잭션, 행 수준 잠금 및 외래 키 지원 PLUGIN_LICENSE : GPL 1 행 세트 (0.00 초)