최적의 MySQL InnoDB 버퍼 풀 인스턴스 수


13

서버 특성

  • 총 시스템 RAM : 8GB
  • CPU 코어 수 : 6
  • DB에 약 2GB의 데이터가 있습니다.
  • InnoDB 버퍼 풀 크기를 4GB로 설정했습니다.

어떤게 더 좋아:

  • Innodb 버퍼 풀 인스턴스가 1로 설정 되었습니까?
  • Innodb 버퍼 풀 인스턴스가 2 (각각 2GB)로 설정 되었습니까?
  • Innodb 버퍼 풀 인스턴스가 4 (각각 1GB)로 설정 되었습니까?
  • Innodb 버퍼 풀 인스턴스가 8로 설정 됨 (기본 설정)

따라서 버퍼 풀 인스턴스와 관련하여 "이런 InnoDB 버퍼 풀 크기가 큰 경우 인스턴스를 사용하거나 OS 스왑이 발생"하는 이유를 잘 모르겠습니다.


"InnoDB 버퍼 풀 크기가 클 때 인스턴스를 사용하거나 OS 스왑이 발생하는 위치"는 어디에서 얻었습니까?
Rick James

총 BUFFER_POOL에 대한 RAM의 70 % "MySQL은 이외의 물건"을위한 공간을 뺀 관계없이 인스턴스의 수, 잘해야한다.
Rick James

나는 그들이 모두 "힙에서 쏜"것으로 생각되는 한, 어떤 대답도 받아 들일 수 없다. 누군가 궁금한 점이 있다면 4G 버퍼 풀 크기와 2 인스턴스를 사용했으며 데비안 8.1에서 약 60 쿼리 / 초로 약 mysql을 실행하는 동일한 컴퓨터에서 php-fpm + nginx를 실행하는 8G의 총 메모리로 매우 잘 작동합니다.
Adergaard

답변:


7

MySQL 5.5로 돌아 가면 이것도 같은 생각입니다.

그 기간 동안 내가 배운 것은 다음과 같습니다. 버퍼 풀이 설치된 RAM의 절반보다 크고 innodb_buffer_pool_instances 가 1 (기본값 5.5)이면 스왑의 위협은 항상 임박했습니다.

나는 전에 이것을 논의했다 : 버퍼 풀 인스턴스의 크기와 수에 관한 경험이 있습니까? . 이 게시물에서 162GB 버퍼 풀이있는 서버에 192GB RAM이있는 클라이언트의 예를 언급했습니다. 때 innodb_buffer_pool_instances가 1이고, 교환이 일어났다. innodb_buffer_pool_instances 를 2로 설정하면 상황이 좋아졌습니다.

귀하의 경우, 버퍼 풀이 정확히 절반이므로 1의 값이 정상일 수 있습니다. 나는 그것을하지 않을 것입니다. 2로 설정했습니다.

MySQL 5.6의 기본값은 8이므로 더 이상 생각할 필요가 없습니다.

나는 이것을 말할 것이다 : akuzminsky의 대답은 가장 높은 원칙을 가진다 . 내 대답은 과거 경험 (좋은 것과 나쁜 것)을 기반으로 엉덩이에서 촬영하는 것입니다.


절대 안돼! 스와핑은 풀 인스턴스가 아닌 할당 된 메모리 양에 따라 다릅니다.
Rick James

기본값이 8이라는 것을 아는 것이 좋습니다. 그러나 4로 줄이거 나 16으로 늘린 경우의 차이점은 무엇입니까? 메모리 / 스토리지 위약금이나 혜택이 있습니까? 내가 여기있는 유일한 이유는 mysqltuner가 innodb_buffer_pool_instances (= 1)를 권장하지만 항상 권장 사항을 신뢰하는 것은 아닙니다. 물론, 나는 문제가없고 단지 궁금하다.
PJ Brunet

@PJBrunet InnoDB 버퍼 풀이 RAM의 절반보다 작 으면 InnoDB 버퍼 풀 인스턴스는 1로 남겨 둘 수 있습니다.
RolandoMySQLDBA

6

버퍼 풀 뮤텍스 경합을 피하기 위해 버퍼 풀 인스턴스 수를 늘려야합니다.

버퍼 풀 크기가 8GB이면 버퍼 풀 뮤텍스 경합이 나타날 것입니다.

업데이트 0 :

원래 질문에서 총 메모리는 8GB 였지만 대답에 8Gb 버퍼 풀을 언급했습니다. 버퍼 풀은 8GB보다 작아야합니다. 4GB는 좋은 시작처럼 들리지만 스왑이 발생하지 않도록하십시오.

업데이트 1 :

// Yasufumi의 슬라이드에서 (최근의 MySQL 버전에서는 출력이 약간 다를 수 있음)

버퍼 풀 뮤텍스에 경합이 있는지 확인하려면 SHOW ENGINE INNODB STATUS피크 시간 동안 수십 개의 샘플을 수집하십시오 .

그런 다음 쉘 스 니펫을 사용하여 집계하십시오.

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

다음과 같은 출력을 제공합니다.

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

버퍼 풀 뮤텍스 대기 수가 많으면 여러 버퍼 풀 인스턴스를 고려해야합니다. ~ 48G보다 작은 버퍼 풀에서는 경합이 발생하지 않습니다.


1
그러나 8GB RAM에만 8G buffer_pool 이 없습니다 !
Rick James

어떤 dbsize, 즉 innodb 버퍼 풀 크기에서 인스턴스에 대해 생각하기 시작할 입니까? 나는 당신의 대답이 상대적으로 작은 수준에서 하나 이상을 가질 이유가 없다는 것을 해석합니다 . 옳은? 이것에 대한 소스가 있습니까? MySQL 문서에는 "멀티 기가 바이트"라고 나와 있는데, 이는 나에게있어 표현을 표현하는 매우 퍼지 방법입니다. 사실, 2GB의 멀티하지만 나는 생각한다 ... 그들이 그보다 더 큰 데이터 세트를 참조
Adergaard

2

OS에 "swappiness"를 1로 설정하십시오. 문제는 지나치게 공격적인 OOM 일 수 있습니다.


0

동시에 실행하려는 최대 MySQL 스레드 수와 일치하도록 이것을 설정하는 것이 좋습니다. 나는 코어 수를 사용합니다.

또한 이 번호를 설정 innodb_read_io_threads하고 innodb_write_io_threads일치시킵니다.

경우 innodb_buffer_pool_instances너무 낮은, 당신의 스레드 가능성이 세마포어 대기에 갇혀 얻을 수 있습니다. 이렇게하면 시스템이 사용 중이더라도 CPU와 I / O가 모두 유휴 상태 인 것처럼 보이고 응용 프로그램 대기 시간이 길어집니다.

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