목차
1. 개요
innodb_io_capacity | innodb_io_capacity_max | |
Command-Line Format | --innodb-io-capacity=# | --innodb-io-capacity-max=# |
System Variable | innodb_io_capacity | innodb_io_capacity_max |
Scope | Global | Global |
Dynamic | Yes | Yes |
SET_VAR Hint Applies | No | No |
Type | Integer | Integer |
Default Value | 200 | 2 * innodb_io_capacity |
Minimun Value | 100 | 100 |
Maximum Value (Unix 64비트 환경) |
2**64-1 | 2**64-1 |
Maximum Value (Unix 64비트 외 환경) |
2**32-1 | 2**32-1 |
InnoDB 스토리지의 마스터 스레드와 그 외의 스레드는 백그라운드에서 다양한 작업을 수행합니다.
대부분의 작업은 버퍼 풀에서 더티 페이지를 플러시하고 체인지 버퍼에서 적절한 세컨더리 인덱스의 변경 사항을 기록하는 I/O와 관련된 작업입니다.
InnoDB는 이러한 작업이 서버의 정상 작동에 부정적인 영향을 미치지 않도록 수행합니다. 또한, 사용 가능한 I/O 대역폭을 추정하고, 가용 용량을 활용할 수 있도록 작업을 조정합니다.
innodb_io_capacity 변수는 InnoDB에서 사용할 수 있는 전체 I/O 용량을 나타냅니다. 이 값은 시스템이 초당 수행할 수 있는 I/O 작업 수(IOPS)와 대략적으로 일치하도록 설정해야 합니다. innodb_io_capacity는 InnoDB 스토리지 엔진에서 수행하는 백그라운드 작업이 처리할 수 있는 I/O 용량을 의미합니다.
이 백그라운드 작업에는 버퍼 풀에서 페이지를 플러시하고, 체인지 버퍼로부터 데이터를 병합하는 작업이 포함됩니다. innodb_io_capacity가 설정되면 InnoDB 스토리지 엔진은 설정된 값을 기반으로 백그라운드 작업을 위해 필요한 I/O 대역폭을 계산합니다.
innodb_io_capacity는 100 이상의 값으로 설정할 수 있으며, 기본값은 MySQL 8.0에서는 200, MySQL 8.4에서는 10,000입니다. 일반적으로 이 값을 100으로 설정할 경우, 최대 7200RPM의 가정용 하드 디스크 환경에 적합합니다. 더 빠른 HDD나 RAID 구성, SSD 환경에서는 더 높은 값을 설정해야 합니다.
innodb_io_capacity 값이 너무 낮으면 백그라운드 작업이 원활하게 처리되지 못하고 지연될 수 있으므로 적절한 값을 선택해야 합니다. 그러나 값이 너무 높으면 데이터가 버퍼 풀과 체인지 버퍼에서 너무 빠르게 제거되어 캐싱의 이점을 누리지 못할 수 있습니다.
I/O 처리 성능이 요구되는 바쁜 환경에서는 서버가 쓰기 작업을 원활하게 수행할 수 있도록 innodb_io_capacity 값을 크게 설정하는 것이 좋습니다. 일반적으로 InnoDB I/O를 처리하는 드라이브 수에 따라 값을 증가시킬 수 있으며, 여러 개의 디스크를 사용하거나 SSD 환경에서는 높은 값을 설정하는 것이 좋습니다.
그러나 innodb_io_capacity를 100,000에 가깝게 설정하는 것은 가능하지만, 큰 값에 적합한 성능을 보장하지는 않습니다. 일반적으로 20,000을 초과하는 값을 설정하는 것은 성능 저하의 원인이 innodb_io_capacity의 낮은 값 때문이라는 확신이 없이는 권장되지 않습니다.
만약 innodb_io_capacity 값을 20,000 이상으로 설정하고 싶거나, 플러시 작업이 급증할 때만 높은 값을 적용하고 싶다면 innodb_io_capacity를 처리량에 따라 자동으로 증가시키는 innodb_io_capacity_max 값을 늘리는 것이 좋습니다.
innodb_io_capacity는 쓰기 작업에 큰 영향을 미칩니다. 대규모 쓰기 작업이 많은 환경에서는 높은 설정값을 적용하는 것이 좋지만, 작은 쓰기 작업이 주로 발생하는 환경에서는 낮은 설정값으로도 충분합니다.
innodb_io_capacity 설정은 개별 버퍼 풀 인스턴스에 적용되는 것이 아니라 전체 버퍼 풀에 공통으로 적용됩니다. 예를 들어, 버퍼 풀 인스턴스가 8개인 환경에서 innodb_io_capacity를 8,000으로 설정하면 각 버퍼 풀에는 1,000(innodb_io_capacity / innodb_buffer_pool_instances)의 innodb_io_capacity가 할당됩니다.
innodb_io_capacity 값은 MySQL 옵션 파일(my.cnf, my.ini)에서 설정할 수 있으며, SET GLOBAL 문을 사용하여 운영 중인 데이터베이스에서도 값을 바꿀 수 있습니다.
-- innodb_io_capacity를 10000으로 설정
SET GLOBAL innodb_io_capacity = 10000;
2. 체크포인트에서 I/O Capacity 설정값 무시
innodb_flush_sync 변수는 기본적으로 활성화되어 있으며, 체크포인트에서 I/O 활동이 급증할 때 innodb_io_capacity 설정이 무시되도록 합니다.
innodb_io_capacity 및 innodb_io_capacity_max 설정에서 정의된 I/O 속도를 따르려면 innodb_flush_sync를 비활성화해야 합니다.
innodb_flush_sync 값은 MySQL 옵션 파일(my.cnf 또는 my.ini)에서 설정할 수 있으며, 실행 중에 SET GLOBAL 문을 사용하여 변경할 수도 있습니다. 이 경우 글로벌 시스템 변수를 설정할 수 있는 SYSTEM_VARIABLES_ADMIN 권한이 필요합니다.
3. I/O Capacity 설정값 계산
만약 플러시 작업이 지연되면, InnoDB는 innodb_io_capacity 변수에서 정의된 값보다 더 높은 IOPS(초당 입출력 작업 수)플러시를 수행할 수 있습니다. 이러한 상황에서 InnoDB 백그라운드 작업이 수행할 수 있는 최대 IOPS를 제한하는 변수가 innodb_io_capacity_max입니다.
서버 시작 시 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(SATA, NVMe, PCle)의 경우 2500 이상의 높은 값을 고려할 수 있습니다.
innodb_io_capacity 설정과 마찬가지로, innodb_io_capacity_max 값도 가능한 한 낮게 유지하는 것이 좋습니다.
다만, 너무 낮을경우 InnoDB가 충분한 IOPS 속도를 확보하지 못하게 되므로 너무 낮게 설정해서는 안 됩니다.
또한, innodb_io_capacity_max는 쓰기 워크로드를 고려하여 조정해야 합니다. 대규모 쓰기 작업이 많은 시스템에서는 더 높은 값을 설정하는 것이 유리할 수 있으며, 작은 쓰기 워크로드가 있는 시스템에서는 낮은 값으로도 충분할 수 있습니다.
innodb_io_capacity_max는 innodb_io_capacity 값보다 낮은 값으로 설정할 수 없습니다.
SET 문을 사용하여 innodb_io_capacity_max 값을 DEFAULT로 설정하면, innodb_io_capacity_max는 허용된 최대값( 2 * innodb_io_capacity )으로 설정됩니다.
또한, innodb_io_capacity_max 설정은 모든 버퍼 풀 인스턴스에 적용되며, 각각의 개별 버퍼 풀 인스턴스에 할당되는 값이 아닙니다.
MySQL :: MySQL 8.0 Reference Manual :: 17.8.7 Configuring InnoDB I/O Capacity
MySQL :: MySQL 8.0 Reference Manual :: 17.8.7 Configuring InnoDB I/O Capacity
17.8.7 Configuring InnoDB I/O Capacity The InnoDB master thread and other threads perform various tasks in the background, most of which are I/O related, such as flushing dirty pages from the buffer pool and writing changes from the change buffer to the a
dev.mysql.com
'Database > MySQL' 카테고리의 다른 글
[MySQL] InnoDB Cluster 3부작 : 2. Group Replication (2) - 구성하기 (0) | 2025.03.19 |
---|---|
[MySQL] InnoDB Cluster 3부작 : 1. Group Replication (1) - 개념 이해하기 (0) | 2025.03.17 |
[MySQL] binlog_format (0) | 2025.03.12 |
[MySQL] innodb_flush_method (O_DIRECT, O_DSYNC, fsync) (0) | 2025.03.11 |
[MySQL] MHA 구성 (0) | 2025.03.10 |