[MySQL][InnoDB] I/O설정
- Databases/MySQL
- 2020. 6. 2.
■ 백그라운드 InnoDB I/O 스레드 수 구성
InnoDB는 백그라운드 스레드를 사용하여 다양한 유형의 I/O 요청을 처리합니다. innodb_read_io_threads(prefetcher) 및 innodb_write_io_threads(cleaner) 구성 매개 변수를 사용하여 데이터 페이지에서 I/O를 읽고 쓰는 서비스를 제공하는 백그라운드 스레드 수를 구성 할 수 있습니다. 이 매개 변수는 각각 읽기 및 쓰기 요청에 사용되는 백그라운드 스레드 수를 나타냅니다. 지원되는 모든 플랫폼에서 유효합니다. MySQL 옵션 파일 (my.cnf 또는 my.ini)에서 이러한 매개 변수의 값을 설정할 수 있습니다. 동적으로 값을 변경할 수 없습니다. 이 매개 변수의 기본값은 4이며 허용 가능한 값의 범위는 1-64입니다.
하이 엔드 시스템에서 InnoDB의 확장 성을 높이기 위해 이 옵션의 설정을 적절하게 맞추어 주는것이 중요합니다. 각 백그라운드 스레드는 최대 256 개의 보류중인 I/O 요청을 처리 할 수 있습니다. 백그라운드 I/O의 주요 소스는 미리 읽기 요청입니다. InnoDB는 대부분의 백그라운드 스레드가 똑같이 작동하는 방식으로 들어오는 요청에 대해 로드 밸런스를 시도합니다. 또한 InnoDB는 요청을 통합할 가능성을 높이기 위해 읽기 요청을 동일한 범위에서 동일한 스레드로 할당하려고 시도합니다. 고급 I/O를 가진 시스템이 있고 SHOW ENGINE INNODB STATUS 출력에서 읽기 요청 보류중인 64 개 이상의 innodb_read_io_threads가 표시되면 innodb_read_io_threads의 값을 증가시켜 성능을 향상시킬 수 있습니다.
Linux 시스템에서 InnoDB는 기본적으로 비동기 I/O 가진 시스템을 사용하여 데이터 파일 페이지에 대한 미리 읽기 및 쓰기 요청을 수행하므로 InnoDB 백그라운드 스레드가 이러한 유형의 I/O 요청을 처리하는 방식이 변경됩니다.
■ 리눅스에서 비동기 I/O사용하기
InnoDB는 Linux에서 비동기 I/O 서브 시스템 (기본 AIO)을 사용하여 데이터 파일 페이지에 대한 미리 읽기 및 쓰기 요청을 수행합니다. 이 동작은 Linux 시스템에만 적용되며 기본적으로 활성화되는 innodb_use_native_aio 구성 옵션에 의해 제어됩니다. 다른 유닉스 계열 시스템에서 InnoDB는 동기식 I/O 만 사용합니다. 역사적으로 InnoDB는 Windows 시스템에서 비동기 I/O 만 사용했습니다. Linux에서 비동기 I/O 서브 시스템을 사용하려면 libaio 라이브러리가 필요합니다.
동기 I/O를 사용하면 쿼리 스레드가 I/O 요청을 큐에 대기하고 InnoDB 백그라운드 스레드는 큐마다 요청을 한 번에 하나씩 검색하여 각각에 대해 동기 I/O 호출을 수행합니다. I/O 요청이 완료되고 I/O 호출이 리턴되면 요청을 처리하는 InnoDB 백그라운드 스레드가 I/O 완료 루틴을 호출하고 다음 요청을 처리하기 위해 리턴합니다. 병렬로 처리 할 수있는 요청 수는 n이며, 여기서 n은 InnoDB 백그라운드 스레드 수입니다. InnoDB 백그라운드 스레드 수는 innodb_read_io_threads 및 innodb_write_io_threads에 의해 제어됩니다.
네이티브 AIO를 사용하면 쿼리 스레드가 I/O 요청을 운영 체제로 직접 디스패치하므로 백그라운드 스레드 수에 의해 부과되는 한계가 제거됩니다. InnoDB 백그라운드 스레드는 I/O 이벤트가 완료된 요청을 알리기 위해 대기합니다. 요청이 완료되면 백그라운드 스레드가 I/O 완료 루틴을 호출하고 I/O 이벤트 대기를 재개합니다.
기본 AIO의 장점은 일반적으로 SHOW ENGINE INNODB STATUS\G 출력에서 보류중인 많은 읽기 / 쓰기를 표시하는 I/O 바운드 시스템의 확장 성입니다. 원시 AIO를 사용할 때 병렬 처리가 증가하면 I/O 스케줄러의 유형 또는 디스크 어레이 제어기의 특성이 I/O 성능에 더 큰 영향을 미칩니다.
I/O 바운드 시스템에 대한 네이티브 AIO의 잠재적 단점은 운영 체제에 한 번에 디스패치되는 I/O 쓰기 요청 수를 제어 할 수 없다는 것입니다. 병렬 처리를 위해 운영 체제로 디스패치 된 I/O 쓰기 요청이 너무 많으면 I/O 활동 및 시스템 기능의 양에 따라 I/O 읽기 부족이 발생할 수 있습니다.
OS의 비동기 I/O 하위 시스템에 문제가있어 InnoDB가 시작되지 않으면 innodb_use_native_aio=0으로 서버를 시작할 수 있습니다. InnoDB가 tmpdir 위치, tmpfs 파일 시스템 및 tmpfs에서 비동기 I/O를 지원하지 않는 Linux 커널의 조합과 같은 잠재적인 문제를 감지하면 시작중에 이 옵션을 자동으로 비활성화 할 수도 있습니다.
■ InnoDB I/O 용량 설정
InnoDB 마스터 스레드 및 기타 스레드는 백그라운드에서 다양한 작업을 수행하며, 버퍼 풀에서 더티 페이지를 플러시하고 변경 버퍼에서 적절한 보조 인덱스로 변경 내용을 쓰는 등의 대부분은 I/O 관련 작업입니다. InnoDB는 서버의 정상적인 작동에 부정적인 영향을 미치지 않는 방식으로 이러한 작업을 수행하려고 시도합니다. 사용 가능한 I/O 대역폭을 추정하고 사용 가능한 용량을 활용하도록 활동을 조정합니다.
innodb_io_capacity 변수는 InnoDB에 사용 가능한 전체 I/O 용량을 정의합니다. 대략 시스템이 초당 IOPS(I/O)를 수행 할 수있는 I/O 조작 수로 설정해야합니다. innodb_io_capacity가 설정되면 InnoDB는 설정된 값을 기반으로 백그라운드 작업에 사용 가능한 I/O 대역폭을 추정합니다.
innodb_io_capacity를 100 이상의 값으로 설정할 수 있습니다. 기본값은 200입니다. 일반적으로 약 100의 값은 최대 7200RPM의 하드 드라이브와 같은 소비자 수준 저장 장치에 적합합니다. 빠른 하드 드라이브, RAID 구성 및 SSD (솔리드 스테이트 드라이브)는 더 높은 속도와 안정성을 제공합니다. 물론 환경파라미터도 더 높게 설정하여 성능을 끌어올릴 수 있습니다.
이상적으로는 설정을 실용적으로 낮게 유지하지만 백그라운드 활동이 뒤쳐 질 정도로 낮지는 않습니다. 값이 많이 높으면 버퍼 풀에서 데이터가 제거되고 빠른 버퍼 변경에 대한 캐싱으로 상당한 이점을 얻을수 있습니다. 더 높은 I/O 속도가 가능한 사용량이 많은 시스템의 경우 서버가 높은 행변경 비율과 관련된 백그라운드 유지 보수 작업을 서버가 처리하도록 돕기 위해 더 높은 값을 설정할 수 있습니다. 일반적으로 InnoDB I/O에 사용되는 드라이브 수에 따라 값을 늘릴 수 있습니다. 예를 들어, 여러 디스크 또는 SSD를 사용하는 시스템에서 가치를 높일 수 있습니다.
기본 설정인 200은 일반적으로 저가형 SSD에 충분합니다. 예를들어 I/O 버스 연결이 더 높은 고급 SSD의 경우, 1000과 같은 더 높은 설정을 할수도 있습니다. 개별 5400 RPM 또는 7200 RPM 드라이브가있는 시스템의 경우 값을 100으로 낮출 수 있습니다. 이는 약 100 IOPS를 수행 할 수 있는 구형 디스크 드라이브에서 사용 가능한 초당 I/O작업(IOPS) 비율을 나타냅니다.
백만정도의 높은 값을 지정할 수 있지만 실제로는 너무 큰 값을 사용한다고 해서 많은 장점이 있지 않습니다. 일반적으로 낮은 값이 작업 부하에 충분하지 않은 경우가 아니면 20000보다 큰 값은 권장되지 않습니다.
innodb_io_capacity를 튜닝 할 때 쓰기 워크로드를 고려해볼 수 있습니다. 쓰기 작업량이 많은 시스템은 설정이 높을수록 유리합니다. 쓰기 작업량이 적은 시스템에는 설정이 낮을 수 있습니다.
innodb_io_capacity 설정은 버퍼당 풀 인스턴스 설정이 아닙니다. 사용 가능한 I/O 용량은 플러시 활동을 위해 버퍼풀 인스턴스간에 균등하게 분배됩니다.
MySQL 옵션파일 (my.cnf 또는 my.ini)에서 innodb_io_capacity 값을 설정하거나 글로벌 시스템 변수를 설정하기에 충분한 권한이 필요한 SET GLOBAL 문을 사용하여 런타임시 값을 수정할 수 있습니다.
▶ 검사 점에서 I/O 용량 무시
기본적으로 사용되는 innodb_flush_sync 변수는 검사 점에서 발생하는 I/O 활동 버스트 동안 innodb_io_capacity 설정이 무시되도록 합니다. innodb_io_capacity 설정으로 정의된 I/O 비율을 준수하려면 innodb_flush_sync를 비활성화합니다.
MySQL 옵션파일 (my.cnf 또는 my.ini)에서 innodb_flush_sync 값을 설정하거나 런타임시 전역 시스템 변수를 설정하기에 충분한 권한이 필요한 SET GLOBAL 문을 사용하여 값을 수정할 수 있습니다.
▶ I/O 최대 용량 구성
플러싱 활동이 뒤처지면 InnoDB는 innodb_io_capacity변수에 의해 정의된 것보다 더 높은 초당 I/O 작업 속도 (IOPS)로 더 적극적으로 플러시 할 수 있습니다. innodb_io_capacity_max 변수는 이러한 상황에서 InnoDB 백그라운드 작업이 수행하는 최대 IOPS 수를 정의합니다.
시작시 innodb_io_capacity 설정을 지정하고 innodb_io_capacity_max에 값을 지정하지 않으면 innodb_io_capacity_max의 기본값은 innodb_io_capacity 값의 최소 두배이며 최소값은 2000입니다.
innodb_io_capacity_max를 구성 할 때 innodb_io_capacity의 두배가 좋은 출발점이 되는 경우가 많습니다. 기본값 2000은 SSD 또는 둘 이상의 일반 디스크 드라이브를 사용하는 워크로드를 위한 것입니다. SSD 또는 다중 디스크 드라이브를 사용하지 않고 너무 많은 플러시를 허용할 수 있는 워크로드에는 2000의 설정이 너무 높을 수 있습니다. 단일 일반 디스크 드라이브의 경우 200과 400 사이의 설정을 권장합니다. 고급 버스 연결 SSD의 경우 2500과 같은 더 높은 설정을 고려하세요. innodb_io_capacity 설정과 마찬가지로 InnoDB는 innodb_io_capacity 설정을 넘어서 IOPS 속도를 충분히 확장 할 수 없을 정도로 낮게 설정하세요.
innodb_io_capacity_max를 조정할 때 쓰기 워크로드를 고려해보아야 합니다. 쓰기 작업량이 많은 시스템은 설정이 높을수록 도움이 될 수 있습니다. 쓰기 작업량이 적은 시스템에는 설정이 낮을 수 있습니다.
innodb_io_capacity_max는 innodb_io_capacity 값보다 낮은 값으로 설정할 수 없습니다.
SET 문을 사용하여 innodb_io_capacity_max를 DEFAULT로 설정하면 (SET GLOBAL innodb_io_capacity_max = DEFAULT) innodb_io_capacity_max를 최대 값으로 설정합니다.
innodb_io_capacity_max 한계는 모든 버퍼 풀 인스턴스에 적용됩니다. 버퍼 풀 인스턴스당 설정이 아닙니다.
※도움이 되셨다면 광고클릭 한번 부탁드립니다.※
'Databases > MySQL' 카테고리의 다른 글
[MySQL][InnoDB] 테이블 압축 (0) | 2020.06.13 |
---|---|
[MySQL][InnoDB] 옵티마이저 통계 설정 (0) | 2020.06.05 |
[MySQL][InnoDB] 스레드 동시성 설정 (0) | 2020.06.02 |
[MySQL][InnoDB] Buffer Pool 플러싱(Flushing) (0) | 2020.05.31 |
[MySQL][InnoDB] 버퍼풀 설정 (2) | 2020.05.27 |