InnoDB (5GB 데이터베이스) 만 사용하는 8GB RAM 전용 MySQL 서버에 대한 최상의 MySQL 캐시 설정


20

성능을 위해 MySQL을 설정할 때 꽤 멍청한 놈입니다. 그리고 솔직히 MySQL에서 성능의 마지막 부분을 짜기위한 미세 조정에 대해 걱정하지 않지만 최상의 결과를 제공하는 가장 중요한 것은 캐시 / 버퍼를 올바르게 설정하는 것입니다.

스토리지 엔진으로 InnoDB 만 사용하여 일을 단순하게 유지하려고 노력했습니다. 그리고 MySQL 전용 서버가 있습니다. 8GB의 RAM이 있는데 성능을 최대화하려면 어떻게 할당해야합니까? 최고의 성능을 위해 전체 데이터베이스를 메모리에 맞출 수 있기를 원합니다. 데이터베이스는 약 5GB입니다. 이것이 가능한가?

쿼리 캐시에 얼마나 많은 메모리를 할당해야합니까? InnoDB 버퍼 풀은 얼마입니까? 컴퓨터의 나머지 부분 (예 : 비 MySQL 관련 프로세스)은 얼마입니까? 기타.

MyISAM을 사용하지 않기 때문에 키 캐시에 많은 메모리를 넣을 필요가 없습니까?

답변:


25

데이터베이스 자체에 대해 많이 알지 못하면 어렵습니다. 알아야 할 몇 가지 도구가 있습니다.

전체 데이터베이스를 메모리에 저장하는 방법 데이터베이스에서 변경을 수행하는 모든 쿼리는 디스크에서 쓰기가 수행 될 때까지 열린 상태로 유지됩니다. 디스크의 병목 현상을 피할 수있는 유일한 방법은 쓰기 캐시가있는 디스크 컨트롤러입니다.

기본값에서 다음과 같이 변경합니다.

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

그런 다음 상황이 어떻게 진행되는지 살펴보고 위에서 언급 한 도구의 출력을 기반으로 다른 것을 시도해보십시오. 또한 Munin 또는 Cacti 와 같은 모니터링 도구를 사용하여 트렌드를 그래프로 작성하여 실제로 처리중인 워크로드 유형을 확인합니다. 개인적으로 Munin과 함께 제공되는 MySQL 플러그인에 대한 훌륭한 경험이 있습니다.


감사합니다.이 기회를 통해 새로운 것을 배울 수 있는지 살펴 보겠습니다.
billmalarky

@billmalarky serverfault에 오신 것을 환영합니다! :) 답변이 만족 스러우면 질문을 올바르거나 올바른 것으로 표시해야합니다.
Kvisle

mysqltuner.pl 추천을위한 +1 !!!
RolandoMySQLDBA

@Kvisle 환영합니다! 나는 한동안 스택 오버 플로우에 있었지만 (몇 달 동안 ...) 나는 serverfault를 처음 사용합니다. 나는 실제로 voxel.net으로 호스트하고 그들의 호스팅 호스팅 (IE 시스템 지원)은 정말 훌륭하지만 외부보기를 찾는 것이 적절할 것이라고 생각했기 때문에 이것에 대해 이야기 할 때 완전한 도구처럼 들리지 않습니다.
billmalarky

1
@Kvisle 또한 정답을 표시하지만 좋은 브레인 스토밍을 얻기 위해 약간 끓이기를 원합니다.
billmalarky

9

당신이 함께 갈 수 있어야 IMHO

innodb_buffer_pool_size=5G

서버 OS에 충분한 양의 RAM과 DB 연결을위한 메모리가있는 RAM의 62.5 %

@kvisle은 mysqltuner.pl을 사용하는 것이 좋습니다. 이 스크립트는 join_buffer_size, sort_buffer_size, read_buffer_size 및 read_rnd_buffer_size 전용으로 RAM의 양을 판단하는 데 탁월합니다. 함께 추가 된 4 개의 버퍼에 max_connections를 곱합니다. 이 답변은 정적 버퍼 (innodb_buffer_pool_size + key_buffer_size)에 추가됩니다. 합산 합계가보고됩니다. 그 합이 RAM의 80 %를 초과하면 버퍼 크기를 줄여야합니다. mysqltuner.pl은 이와 관련하여 매우 도움이 될 것입니다.

모든 데이터가 InnoDB이므로 key_buffer_size (MyISAM 인덱스 용 키 캐시 버퍼)를 매우 낮게 만들 수 있습니다 (64M 권장).

다음은 권장 크기 innodb_buffer_pool_size를 계산하기 위해 DBA StackExchange에서 작성한 게시물 입니다.

업데이트 2011-10-15 19:55 EDT

5GB의 데이터가 있다는 것을 알고 있다면 첫 번째 권장 사항은 정상입니다. 그러나 한 가지를 추가하는 것을 잊었습니다.

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

로그 파일 크기는 InnoDB 버퍼 풀의 25 % 여야합니다.

업데이트 2011-10-16 13:36 EDT

25 % 규칙은 두 개의 로그 파일 사용을 엄격하게 기반으로합니다. 여러 개의 innodb 로그 파일을 사용할 수 있지만 일반적으로 두 개가 가장 효과적입니다.

다른 사람들은 25 %를 사용하여 표현했습니다

그러나 모든 공정성에서, 원래 InnoBase Oy 회사의 누군가는 더 큰 InnoDB 버퍼 풀을 가지고 있기 때문에 25 % 규칙을 사용하지 않는다고 표현했습니다 .

당연히, 많은 양의 RAM이 있으면 25 % 규칙이 작동하지 않습니다. 실제로 2 개의 로그 파일 만 사용하여 허용되는 가장 큰 innodb_log_file_size는 2047M입니다. 로그 파일의 결합 된 크기는 4G (4096M)보다 작아야하기 때문입니다.

사례 : 내 고용주의 클라이언트 중 하나에 RAM이 192GB 인 DB 서버가 있습니다. 48G 로그 파일을 가질 방법이 없습니다. innodb 로그 파일, 최대 2047M에 최대 파일 크기를 사용합니다. 내 대답에 대한 @Kvisle의 의견은 단순히 두 개의 로그 파일로 자신을 제한 할 필요가 없다는 링크를 제공합니다. N 개의 로그 파일이 있으면 총 4G를 가질 수 없습니다. 내 25 % 규칙은 완벽한 세상에 있습니다 (8GB 이하의 DB 서버).


고마워, 나는 확실히 mysqltuner.pl을 사용할 것이다. 그러나 데이터베이스가 비어있는 경우에도 스크립트가 여전히 정확합니까? 모든 테이블과 스키마가 올바르게 설정되었지만 실제 데이터는 없습니다. 필자는 현재 전용 서버에서 사용할 크기 (예 : DB가 커지면 전용 서버로 전환 할 것)보다 5gb를 예제 크기로 사용했습니다. 현재 데이터베이스가 비어 있습니다 (시작하지 않은 새로운 사이트입니다).하지만 사전 실행을 통해 스케일링을 처리하도록 mysql을 조정하고 싶습니다.
billmalarky

내 답변을 업데이트했습니다 !!!
RolandoMySQLDBA

"InnoDB 버퍼 풀의 25 % 여야합니다"에 대해 언급하고 싶습니다. 100 % 사실이 아니기 때문입니다. 읽기 dev.mysql.com/doc/refman/5.0/en/... 더 정교한 대답. 성능면에서는 기본 크기보다 약간 큰 크기를 늘리는 데 도움이되지만 최대 값을 지정할 필요는 없습니다.
Kvisle

롤란도, 도와 주셔서 감사합니다. 이 스레드를 참조로 책갈피에 추가했습니다. 또한 지금은 mysqltuner 스크립트를 사용하고 있습니다.
billmalarky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.