mysql innodb_buffer_pool_size의 크기는 얼마나됩니까?


170

크기가 약 5GB 인 InnoDB 테이블 만 사용하는 바쁜 데이터베이스가 있습니다. 데이터베이스는 SSD 디스크를 사용하여 데비안 서버에서 실행되며 때로는 최대 연결 수를 800으로 설정하여 서버를 포화시키고 분쇄하기도합니다. 초당 평균 쿼리는 약 2.5K입니다. 따라서 가능한 최대 연결 공간을 확보하기 위해 메모리 사용을 최적화해야합니다.

innodb_buffer_pool_size가 총 메모리의 최대 % 80이어야한다는 제안을 보았습니다. 반면에 나는 튜닝 프라이머 스크립트 에서이 경고를받습니다.

Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G

내 현재 innodb 변수는 다음과 같습니다.

| innodb_adaptive_flushing                          | ON                                                                                                                     |
| innodb_adaptive_hash_index                        | ON                                                                                                                     |
| innodb_additional_mem_pool_size                   | 20971520                                                                                                               |
| innodb_autoextend_increment                       | 8                                                                                                                      |
| innodb_autoinc_lock_mode                          | 1                                                                                                                      |
| innodb_buffer_pool_instances                      | 1                                                                                                                      |
| innodb_buffer_pool_size                           | 20971520000                                                                                                            |
| innodb_change_buffering                           | all                                                                                                                    |
| innodb_checksums                                  | ON                                                                                                                     |
| innodb_commit_concurrency                         | 0                                                                                                                      |
| innodb_concurrency_tickets                        | 500                                                                                                                    |
| innodb_data_file_path                             | ibdata1:10M:autoextend                                                                                                 |
| innodb_data_home_dir                              |                                                                                                                        |
| innodb_doublewrite                                | ON                                                                                                                     |
| innodb_fast_shutdown                              | 1                                                                                                                      |
| innodb_file_format                                | Antelope                                                                                                               |
| innodb_file_format_check                          | ON                                                                                                                     |
| innodb_file_format_max                            | Antelope                                                                                                               |
| innodb_file_per_table                             | ON                                                                                                                     |
| innodb_flush_log_at_trx_commit                    | 2                                                                                                                      |
| innodb_flush_method                               | O_DIRECT                                                                                                               |
| innodb_force_load_corrupted                       | OFF                                                                                                                    |
| innodb_force_recovery                             | 0                                                                                                                      |
| innodb_io_capacity                                | 200                                                                                                                    |
| innodb_large_prefix                               | OFF                                                                                                                    |
| innodb_lock_wait_timeout                          | 50                                                                                                                     |
| innodb_locks_unsafe_for_binlog                    | OFF                                                                                                                    |
| innodb_log_buffer_size                            | 4194304                                                                                                                |
| innodb_log_file_size                              | 524288000                                                                                                              |
| innodb_log_files_in_group                         | 2                                                                                                                      |
| innodb_log_group_home_dir                         | ./                                                                                                                     |
| innodb_max_dirty_pages_pct                        | 75                                                                                                                     |
| innodb_max_purge_lag                              | 0                                                                                                                      |
| innodb_mirrored_log_groups                        | 1                                                                                                                      |
| innodb_old_blocks_pct                             | 37                                                                                                                     |
| innodb_old_blocks_time                            | 0                                                                                                                      |
| innodb_open_files                                 | 300                                                                                                                    |
| innodb_purge_batch_size                           | 20                                                                                                                     |
| innodb_purge_threads                              | 0                                                                                                                      |
| innodb_random_read_ahead                          | OFF                                                                                                                    |
| innodb_read_ahead_threshold                       | 56                                                                                                                     |
| innodb_read_io_threads                            | 4                                                                                                                      |
| innodb_replication_delay                          | 0                                                                                                                      |
| innodb_rollback_on_timeout                        | OFF                                                                                                                    |
| innodb_rollback_segments                          | 128                                                                                                                    |
| innodb_spin_wait_delay                            | 6                                                                                                                      |
| innodb_stats_method                               | nulls_equal                                                                                                            |
| innodb_stats_on_metadata                          | ON                                                                                                                     |
| innodb_stats_sample_pages                         | 8                                                                                                                      |
| innodb_strict_mode                                | OFF                                                                                                                    |
| innodb_support_xa                                 | ON                                                                                                                     |
| innodb_sync_spin_loops                            | 30                                                                                                                     |
| innodb_table_locks                                | ON                                                                                                                     |
| innodb_thread_concurrency                         | 4                                                                                                                      |
| innodb_thread_sleep_delay                         | 10000                                                                                                                  |
| innodb_use_native_aio                             | ON                                                                                                                     |
| innodb_use_sys_malloc                             | ON                                                                                                                     |
| innodb_version                                    | 1.1.8                                                                                                                  |
| innodb_write_io_threads                           | 4                                                                                                                      |

관련성있는 참고 사항 : Drupal (별도의 웹 서버에 위치)에서 데이터베이스에 큰 게시물 (예 : 10KB 이상)을 삽입하려고하면 영원히 지속되고 페이지가 올바르게 반환되지 않습니다.

이것과 관련하여 최적의 성능을 위해 innodb_buffer_pool_size가 무엇인지 궁금합니다. 이 시나리오에이 매개 변수 및 기타 매개 변수를 최적으로 설정하기위한 제안에 감사드립니다.

답변:


252

귀하의 innodb_buffer_pool_size는 엄청나 다. 로 설정했습니다 20971520000. 19.5135GB입니다. 5GB의 InnoDB 데이터 및 인덱스 만 있다면 약 8GB 만 있어야합니다. 이것조차도 너무 높을 수 있습니다.

여기 당신이해야 할 일이 있습니다. 먼저이 쿼리를 실행

SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

이를 통해 모든 InnoDB 데이터 및 인덱스를 기준으로 RIBPS, 권장 InnoDB 버퍼 풀 크기가 60 % 추가로 제공됩니다.

예를 들어

mysql>     SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
    ->     (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    ->     FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
|     8 |
+-------+
1 row in set (4.31 sec)

mysql>

이 출력으로 /etc/my.cnf에서 다음을 설정합니다

[mysqld]
innodb_buffer_pool_size=8G

다음, service mysql restart

다시 시작한 후, 1-2 주 동안 mysql을 실행하십시오. 그런 다음이 쿼리를 실행하십시오.

SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;

이것은 현재 InnoDB 버퍼 풀에있는 InnoDB 데이터가 얼마나 많은 실제 GB 메모리를 사용하고 있는지 알려줍니다.

나는 이것에 대해 전에 작성했다 : innodb_buffer_pool을 설정하고 왜 ..?

DataGB일주일 동안 재구성, 재시작 및 대기하지 않고 지금 바로이 쿼리를 실행할 수 있습니다 .

이 값 DataGB은 InnoDB 버퍼 풀이 + (innodb_change_buffer_max_size에 지정된 백분율)의 크기와 더 유사합니다. 나는 이것이 당신이 지금 예약 한 20000M보다 훨씬 적을 것이라고 확신합니다. RAM 절약은 다음과 같은 다른 것들을 튜닝하는데 사용될 수 있습니다

주의 사항 # 1

주의해야 할 사항은 다음과 같습니다. 때때로 InnoDB는 innodb_buffer_pool_size 값보다 10 % 더 추가로 필요할 수 있습니다 . 다음은 MySQL 설명서에 나와있는 내용입니다.

이 값을 크게 설정할수록 테이블의 데이터에 액세스하는 데 필요한 디스크 I / O가 줄어 듭니다. 전용 데이터베이스 서버에서이 값을 시스템 실제 메모리 크기의 최대 80 %로 설정할 수 있습니다. 이러한 다른 문제가 발생하면이 값을 축소 할 수 있도록 준비하십시오.

실제 메모리 경쟁으로 인해 운영 체제에서 페이징이 발생할 수 있습니다.

InnoDB는 버퍼 및 제어 구조를위한 추가 메모리를 예약하여 할당 된 총 공간이 지정된 크기보다 약 10 % 더 큽니다.

주소 공간은 연속적이어야합니다. 이는 특정 주소에서로드되는 DLL이있는 Windows 시스템에서 문제가 될 수 있습니다.

버퍼 풀을 초기화하는 시간은 크기에 대략 비례합니다. 대규모 설치에서는이 초기화 시간이 중요 할 수 있습니다. 예를 들어 최신 Linux x86_64 서버에서 10GB 버퍼 풀을 초기화하는 데 약 6 초가 걸립니다. 8.9.1 절 . “InnoDB 버퍼 풀”을 참조하십시오 .

경고 # 2

나는 당신의 다음 값을 참조하십시오 my.cnf

| innodb_io_capacity                                | 200 |
| innodb_read_io_threads                            | 4   |
| innodb_thread_concurrency                         | 4   |
| innodb_write_io_threads                           | 4   |

이 숫자는 InnoDB가 여러 코어에 액세스하는 것을 방해합니다

다음을 설정하십시오 :

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

나는 DBA StackExchange에서 전에 이것에 대해 썼다.

방금 더 간결한 수식을 사용하여 ServerFault에서 이와 같은 질문에 대답했습니다 .

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;

1
이 위대한 게시물에 감사드립니다! 로 시작하는 공식 SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...은 MySQL 5.7에서 다음 오류를 생성합니다. " 'INFORMATION_SCHEMA.GLOBAL_STATUS'기능이 비활성화되었습니다. 'show_compatibility_56'설명서를 참조하십시오 ." 우연히 업데이트 된 버전을 원하십니까?
Benjamin

307 RIBPS와 264G를 얻습니다. 그것은 307GB의 RAM이 필요하다는 것을 의미합니까?
E_Blue

264G와 비슷합니다. 그러나 충분한 RAM이 있어야합니다. 그렇지 않으면 시스템에서 실행되는 다른 것에 따라 RAM의 80 %를 mysql에 제공하십시오.
sjas

2
내가 읽은 가장 큰 게시물! ~ 3GB 정도의 ~ 데이터베이스가 있습니다. 답변 / 기사와 링크 속도를 읽은 후 링크 속도가 최대 2 배가되었습니다
fat_mike

4
@ Benjamin : MySQL 5.7.6부터 information_schema가 performance_schema로 병합되었습니다. 따라서 쿼리에서 "information_schema"를 "performance_schema"로 변경하면 작동합니다. 출처 : dev.mysql.com/doc/refman/5.7/en/status-table.html
Ralph Bolton

11

이 같은? 사용 SHOW VARIABLES하여 SHOW GLOBAL STATUS:

식 : innodb_buffer_pool_size / _ram
의미 : InnoDB buffer_pool에 사용 된 RAM의 %
권장 범위 : 60 ~ 80 %

식 : Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
의미 : 디스크에 적중 해야하는 읽기 요청
권장 범위 : 0-2 %
범위를 벗어난 경우 수행 할 작업 : 충분한 경우 innodb_buffer_pool_size 증가 램.

식 : Innodb_pages_read / Innodb_buffer_pool_read_requests
의미 : 디스크에 도달 해야하는 읽기 요청
권장 범위 : 0-2 %
범위를 벗어난 경우 수행 할 작업 : 충분한 RAM이 있으면 innodb_buffer_pool_size를 늘리십시오.

식 : Innodb_pages_written / Innodb_buffer_pool_write_requests
의미 : 디스크에 적중 해야하는 쓰기 요청
권장 범위 : 0-15 %
범위를 벗어난 경우 수행 할 작업 : innodb_buffer_pool_size 확인

표현식 : Innodb_buffer_pool_reads / Uptime
의미 :
권장 범위 읽기 : 0-100 / 초.
범위를 벗어난 경우 수행 할 작업 : innodb_buffer_pool_size를 늘리십시오.

표현 : (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
의미 : InnoDB I / O
권장 범위 : 0-100 / 초.
범위를 벗어난 경우 수행 할 작업 : innodb_buffer_pool_size를 늘리십시오.

표현 : Innodb_buffer_pool_pages_flushed / Uptime
의미 : 쓰기 (플러시)
권장 범위 : 0-100 / 초.
범위를 벗어난 경우 수행 할 작업 : innodb_buffer_pool_size를 늘리십시오.

식 : Innodb_buffer_pool_wait_free / Uptime
의미 : buffer_pool에 사용 가능한 페이지가없는 경우를 나타냅니다. 즉, 모든 페이지가 더럽습니다.
권장 범위 : 0-1 / 초
범위를 벗어난 경우 수행 할 작업 : 먼저 innodb_buffer_pool_size가 합리적으로 설정되어 있는지 확인하십시오. 여전히 문제가 발생하면 innodb_max_dirty_pages_pct를 줄이십시오.


좋은 의견을 보내 주셔서 감사합니다. 어떤 innodb_buffer_pool_size값을 지정합니까? 실제 크기 또는 구성된 크기?
joker

1
@joker- innodb_buffer_pool_size최대 크기를 나타냅니다. 일반적인 서버에서 "버퍼 풀"은 작게 시작하지만 해당 최대 크기로 빠르게 커져서 그대로 유지됩니다. 참고 : RAM보다 크거나 더 가까운 경우 스왑이 발생하여 성능이 저하됩니다.
Rick James

7

귀하의 제목은 innodb_buffer_pool_size에 대해 묻지 만 실제 문제는 아닌 것 같습니다. (Rolando는 왜 너무 크게 설정했는지에 대해 언급했습니다.)

최대 연결 수 = 800을 설정하여 때로는 포화 상태로 서버를 정지하고 갈기 시작했습니다.

확실하지 않습니다. "Sleep"모드의 800 명의 사용자는 시스템에 거의 영향을 미치지 않습니다. 활성 스레드 800 개는 재앙이됩니다. 얼마나 많은 스레드가 "실행 중"입니까?

스레드가 서로를 차단하고 있습니까? 교착 상태 등에 대한 힌트는 엔진 INNODB 상태 표시를 참조하십시오.

느린 로그에 쿼리가 표시됩니까? 그것들을 최적화합시다.

어떤 버전을 사용하고 있습니까? XtraDB (InnoDB의 드롭 인 대체)는 여러 코어를 사용하는 것이 더 좋습니다. 5.6.7은 더 나은 일을합니다.

innodb_buffer_pool_instances-이것을 8로 변경합니다 (20G buffer_pool을 가정). Mutex 경합이 약간 줄어 듭니다.

I / O 바운드입니까 아니면 CPU 바운드입니까? 답변에 따라 솔루션이 크게 다릅니다.

SSD-모든 로그 파일이 비 SSD 드라이브에있는 것이 더 좋습니다.


6

더 많은 메모리가 항상 더 좋지만 내 경험상 대부분의 경우 버퍼 풀 크기는 데이터 크기에 맞지 않아야합니다. 대부분의 테이블은 백업 테이블과 같이 대부분 비활성 상태이므로 innodb 버퍼 풀 크기는 데이터 크기에 적합해야합니다.

활성 페이지에 지정하는 시간 프레임은 성능에 영향을 주지만 더 큰 버퍼 크기에 대해 더 많은 성능을 얻지 못하는 최적의 지점이 있습니다. 에 의해 추정 / 계산 / 측정 할 수 있습니다show engine innodb status

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.