MySQL 최대 메모리 사용량


111

Linux 서버에서 MySQL이 사용하는 메모리 양에 대한 상한을 설정하는 방법을 알고 싶습니다.

현재 MySQL은 모든 새로운 쿼리가 요청 될 때마다 메모리를 계속 차지하므로 결국 메모리가 부족합니다. MySQL에서 그 양 이상을 사용하지 않도록 제한하는 방법이 있습니까?


4
MySQL은 "모든 새로운 쿼리에 대해 메모리를 차지하지 않고 결국 고갈됩니다". 메모리 사용량은 그보다 훨씬 더 복잡합니다.
Rick James

답변:


183

MySQL의 최대 메모리 사용량은 하드웨어, 설정 데이터베이스 자체 에 따라 크게 달라집니다 .

하드웨어

하드웨어는 분명한 부분입니다. 더 많은 RAM이 더 즐겁고 더 빠른 디스크 ftw . 하지만 월간 또는 주간 뉴스 레터를 믿지 마십시오. MySQL은 선형 적으로 확장되지 않습니다. Oracle 하드웨어에서도 마찬가지입니다. 그것보다 약간 까다 롭습니다.

결론은 : 대한 추천 무엇을위한 엄지 손가락의 어떤 일반적인 규칙이없는 당신의 MySQL의 설치가. 그것은 모두 현재 사용이나 예상에 달려 있습니다.

설정 및 데이터베이스

MySQL은 동작을 최적화하기 위해 수많은 변수와 스위치를 제공합니다. 문제가 발생하면 정말 앉아서 (f'ing) 매뉴얼을 읽어야합니다.

데이터베이스의 경우 몇 가지 중요한 제약 사항이 있습니다.

  • 테이블 엔진 ( InnoDB,, MyISAM...)
  • 크기
  • 지수
  • 용법

stackoverflow에 대한 대부분의 MySQL 팁은 중요한 설정이라고하는 5-8 개에 대해 알려줍니다. 우선, 모든 것이 중요하지는 않습니다. 예를 들어 InnoDB에 많은 리소스를 할당하고 InnoDB를 사용하지 않는 것은 이러한 리소스가 낭비되기 때문에 의미가 없습니다.

또는-많은 사람들이 max_connection변수 를 높이라고 제안합니다. 글쎄요, max_connections필요하다면 MySQL이 더 많은 리소스를 할당 할 것이라는 의미이기도 합니다. 더 확실한 해결책은 DBAL에서 데이터베이스 연결을 닫거나 wait_timeout해당 스레드를 해제 하기 위해 값을 낮추는 것 입니다.

내 표류를 잡으시면 읽고 배울 것이 정말 많습니다.

엔진

테이블 엔진은 매우 중요한 결정입니다. 많은 사람들이 초기에이를 잊어 버린 다음 갑자기 MyISAM전체 애플리케이션을 잠그고 차단하는 30GB 크기의 테이블 과 싸우게됩니다 .

나는 MyISAM이 짜증 난다고 말하는 것은 아니지만 InnoDB거의 또는 거의 빠르게 응답하도록 조정할 수 있으며 MyISAM행 잠금과 같은 것을 제공하는 UPDATE반면 MyISAM전체 테이블은 작성 될 때 잠급니다.

자신의 인프라에서 MySQL을 자유롭게 실행할 수 있다면 Percona 서버 를 확인하는 것이 좋습니다. Facebook 및 Google (빠르게 알고있는)과 같은 회사의 많은 기여를 포함하고 있으며 Percona의 자체 드롭도 포함되어 있기 때문입니다. 교체에있어 InnoDB,라고 XtraDB.

percona-server (및 -client) 설정 (Ubuntu)에 대한 내 요점을 참조하십시오. http://gist.github.com/637669

크기

데이터베이스 크기는 매우 중요합니다. 믿거 나 말거나 Intarwebs의 대부분의 사람들은 대규모 MySQL 설정을 처리 한 적이 없지만 실제로는 존재합니다. 어떤 사람들은 "PostgreSQL !!! 111 사용"과 같은 말을하기도하지만 지금은 무시합시다.

결론은 크기를 고려하여 하드웨어에 대한 결정이 내려져야한다는 것입니다. 1GB RAM에서 80GB 데이터베이스를 빠르게 실행할 수는 없습니다.

지수

그것은 아닙니다 : 많을수록 더 즐겁습니다. 필요한 인덱스 만 설정하고으로 사용량을 확인해야 EXPLAIN합니다. 거기에 MySQL EXPLAIN은 실제로 제한되어 있지만 시작입니다.

제안 된 구성

이것들 my-large.cnfmy-medium.cnf파일들에 대해-나는 그것들이 누구를 위해 작성되었는지조차 모릅니다. 직접 굴려보세요.

튜닝 입문서

좋은 시작은 튜닝 입문서 입니다. 의 출력을 취합니다 (당신이 리눅스가 필요합니다 힌트)이 떠들썩한 파티 스크립트의 SHOW VARIABLESSHOW STATUS희망 유용한 추천으로 랩합니다. 서버가 얼마 동안 실행 된 경우이를 기반으로 할 데이터가 있으므로 권장 사항이 더 좋습니다.

튜닝 입문서는 마법의 소스가 아닙니다. 변경을 제안하는 모든 변수를 계속 읽어야합니다.

독서

mysqlperformanceblog 를 추천하고 싶습니다 . 모든 종류의 MySQL 관련 팁에 대한 훌륭한 리소스입니다. 그리고 그것은 MySQL뿐만 아니라 적절한 하드웨어에 대해 많이 알고 있거나 AWS에 대한 설정을 권장합니다.이 사람들은 수년과 수년간의 경험을 가지고 있습니다.

물론 또 다른 훌륭한 리소스는 planet-mysql 입니다.


에 대해 잘 모르겠습니다 tuning primer. 어떻게 비교 mysqltuner합니까?
greg0ire

38

다음 설정을 사용합니다.

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

다음 사양을 가진 서버의 경우 :

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
나는 당신 (그리고 당신이 연결하는 저자)이 query_cache_size 및 query_cache_limit를 잘못된 방식으로 가지고 있다고 생각합니다. MySQL에 1MB 캐시를 할당하되 128MB보다 큰 쿼리는 넣지 마십시오. dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
AGTB

나는 max_connections를 낮출 것입니다. 사용할 엔진을 결정하고 둘 다에 많은 공간을 할당하지 않습니다.
Rick James

19

데이터베이스 메모리 사용량은 복잡한 주제입니다. MySQL의 성능 블로그는 질문을 포함하는의 좋은 일을하고, 목록은 "예약"메모리에 상당히 실용적이지 왜 많은 이유를.

정말 엄격한 제한을 적용하려면 그렇게 할 수 있지만 기본 제공 설정이 없으므로 OS 수준에서 수행해야합니다. Linux에서는 ulimit를 사용할 수 있지만이를 적용하려면 MySQL이 시작되는 방식을 수정해야합니다.


가장 좋은 해결책은 일반적인 MySQL 메모리 설정을 조합하면 일반적으로 MySQL 설치에서 메모리 사용량이 낮아 지도록 서버를 조정하는 것입니다. 이것은 물론 데이터베이스의 성능에 부정적인 영향을 미칠 수 있지만 조정할 수있는 일부 설정 my.ini은 다음 과 같습니다.

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

나는 거기에서 시작하여 원하는 결과를 얻을 수 있는지 확인합니다. MySQL 메모리 설정 조정에 대한 많은 기사 가 있습니다 .


편집하다:

일부 변수 이름 은 MySQL의 최신 5.1.x 릴리스에서 변경되었습니다 .

예를 들면 :

table_cache

현재 :

table_open_cache

2
안녕하세요! 답변 해 주셔서 감사합니다. 사람들이 인용하는 방정식은 다음과 같습니다. key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Total Memory. 다음을 설정했습니다 : key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120, 서버의 총 메모리는 512M입니다. 그러나 많은 쿼리 후에 사용 가능한 메모리가 12M까지 낮아졌고 향후 사용량에 따라 계속 줄어들 것입니다. 이것이 왜 그렇고 예방할 수있는 이유가 있습니까? 감사!

아니면 서버의 총 메모리 (512M)가 아니라 사용 가능한 메모리 (예 : 모든 OS 관련 및 기타 프로그램을로드 한 후 사용 가능한 메모리)를 고려해야합니까?

1
RAM에 저장할 수있는 임시 테이블의 크기를 늘리려는 의도로 tmp_table_size를 수정하려는 경우 max_heap_table_size도 늘려야합니다. MySQL은 최소 두 개를 사용하므로 ...
Dave Rix

1
@TimothyMilsud-그와 같은 공식은 실제로 작동하지 않습니다. 그리고 대부분의 서버는 수식에 너무 많은 RAM이 사용되고 있다고 주장 할 때 매우 잘 실행됩니다.
릭 제임스

19

mysqld.exe는 RAM에서 480MB를 사용했습니다. 이 매개 변수를 my.ini에 추가 한 것을 발견했습니다.

table_definition_cache = 400

메모리 사용량을 400,000 + kb에서 105,000kb로 줄였습니다.


어떤 섹션 아래에 있습니까? 나는 그것을 나의 것에 추가했고 서비스는 시작을 거부했다.
구문 오류

신경 쓰지 마세요. [wampmysqld] 아래로 옮겼고 훌륭하게 작동하고 사용하던 메모리를 크게 줄였습니다. 프로세스에서 내 로컬 호스트 페이지로드를 가속화했을 수도 있다고 생각합니다.
구문 오류

기본 및 최소값은 400이지만 귀하의 경우 400보다 높은 이유는 무엇입니까?
Wadih M.

5

에서 /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

256MB 메모리가있는 서버에서 잘 작동합니다.


table_definition_cache= 0 인 이유는 무엇 입니까? 약간의 설명이 좋을 것입니다. 그리고 당신은 기본적으로 ... 같은 효과 쿼리를 캐싱 있지 않은 경우 query_cache_type = 0:
Khom Nazid

0

docker mysql 컨테이너를 최적화하려는 경우 아래 명령이 도움이 될 수 있습니다. mysql 도커 컨테이너를 기본 480MB에서 100MB까지 실행할 수있었습니다.

docker run -d -p 3306 : 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql : / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password

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