16GB RAM을 갖춘 QuadCore 시스템에서 MySQL을 최대한 활용하는 방법은 무엇입니까?


10

과학적인 데이터 분석을 위해 워크 스테이션에서 MySQL 5.5 서버를 실행하고 있으며 성능 측면에서 최대한 활용하기 위해 MySQL을 구성하는 방법이 궁금합니다. 필자가 일반적으로 실행하는 쿼리 유형에는 10-20 개의 테이블 조인이 포함되며 예외없이 전혀 1 분에서 몇 분 정도 실행될 수 있습니다. 동시에 데이터베이스에 액세스하는 사용자는 거의 없습니다 (최대 5 명). 2.2GHz 듀얼 코어 및 4GB RAM을 갖춘 Lenovo Thinkpad T61에서 수동으로 선택한 구성 요소가있는 다음의 새로운 시스템으로 서버를 옮겼습니다.

  • Intel i7 3770, 4x 3.4GHz (@ 4x3.7GHz에서 실행)
  • Z77 칩셋
  • 16GB의 DDR3 1600 RAM
  • Windows 7 Prof 64 비트
  • Windows 및 MySQL 서버는 Intel 520 시리즈 SSD 드라이브에서 실행됩니다.

첫 번째 테스트 (두 컴퓨터에서 동일한 쿼리를 실행)는 새로운 테스트의 속도가 확실히 향상되었지만 쿼리에는 여전히 많은 시간이 걸리며 더 많은 향상이 예상되었습니다. 문제의 쿼리는 상당히 최적화되어 있습니다. 즉, 모든 테이블에는 "확장 된 설명"으로 사용되는 적절한 키가 있습니다.

이제 현재 MySQL 설정으로 : 먼저 오래 전에 MyISAM에서 Innodb로 옮겼 음을 언급해야합니다.

my.ini 일부 조정 (예 : 기본 설정에서 출발) :

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

누군가 위의 숫자 또는 내가 모르는 추가 설정을 변경할 것을 제안하고 싶습니다.

도움이 되신 의견에 감사드립니다.

스티브

편집 : 10-20 테이블에서 조인과 관련된 두 가지 쿼리가 있으며 Lenovo 노트북과 새 PC에서 쿼리를 실행했습니다. 쿼리 # 1은 새 컴퓨터에서 3m36s를 사용했고 랩톱에서는 9m11s를 사용했습니다. 쿼리 # 2는 워크 스테이션에서 22.5 초, 랩톱에서 48.5 초를 차지했습니다. 따라서 실행 속도는 대략 2-2.5 배 향상되었습니다. 워크 스테이션에서는 RAM의 50 %조차 사용되지 않았습니다. Windows 작업 관리자가보고 한대로 4 개의 코어에서 평균 CPU로드는 약 13 %에 불과했습니다. 코어 별로드 (Core Temp에 의해보고 된대로)는 ONE 코어의 경우 약 25-40 % 였고 다른 코어의 경우 <= 10 %였으며 이는 MySQL이 단일 쿼리에 여러 코어를 사용하지 않음을 나타냅니다. .


서버로드를 보여 주므로 메모리, io, CPU로드 등을 확인하십시오.

몇 가지 테스트를 실행하고 Windows 작업 관리자의 의견을 다시보고합니다 (또는 더 나은 도구를

문제가 어디에 있는지 첫 번째 표시로 충분합니다.

통계를 추가했습니다.

2
또한 Percona 마법사를 사용하여 tools.percona.com/wizard
Stephen Senkomago Musoke

답변:


5

MySQL 5.5를 실행하고 있으므로 여러 코어에 액세스하도록 InnoDB 구성을 고려할 수 있습니다

사용해야 할 설정은 다음과 같습니다.

innodb_thread_concurrency 는 InnoDB가 열린 상태로 유지할 수있는 동시 스레드 수의 상한을 설정합니다. 이 설정에 가장 적합한 라운드 수는 (2 X CPU 수) + 디스크 수입니다. 업데이트 : Percona NYC Conference에서 직접 배웠을 때 InnoDB Storage Engine이 실행중인 환경에 가장 적합한 스레드 수를 찾도록 경고하려면이를 0으로 설정해야합니다.

innodb_concurrency_tickets 는 동시성 검사를 무시할 수없는 스레드 수를 설정합니다. 이 한계에 도달하면 스레드 동시성 검사가 다시 표준이됩니다.

innodb_commit_concurrency 는 커밋 할 수있는 동시 트랜잭션 수를 설정합니다. 기본값은 0이므로 설정하지 않으면 여러 트랜잭션을 동시에 커밋 할 수 있습니다.

innodb_thread_sleep_delay 는 InnoDB 대기열에 다시 들어가기 전에 InnoDB 스레드가 휴면 될 수있는 시간 (밀리 초)을 설정합니다. 기본값은 10000 (10 초)입니다.

innodb_read_io_threadsinnodb_write_io_threads (MySQL 5.1.38 이후)는 읽기 및 쓰기를 위해 지정된 수의 스레드를 할당합니다. 기본값은 4이고 최대 값은 64입니다.

innodb_replication_delay 는 슬레이브에 스레드 지연을 부과하여 innodb_thread_concurrency에 도달합니다.

다음은 MySQL 5.5에 대한 과거 게시물과 InnoDB의 다중 코어 활성화입니다.


2

Percona Leading MySQL 컨설턴트는 MySQL 구성 마법사를 제공합니다 . my.cnf/my.ini시스템 구성에 따라 구성 할 수 있습니다 .

또한 Percona 사람들은 " High Performance MySQL " 이라는 책을 발표했습니다 . 세 번째 버전은 최근에 릴리스되었으며 튜닝에 대해 자세히 설명합니다.


이 값들이 좋은 성능을 위해 제안하는 것입니까, 아니면 내가 입력 한 것을 뱉어 줍니까?
OpenCoderX

1

메모리 사용량 : http://mysql.rjweb.org/doc.php/memory를 참조 하십시오 (대부분의 튜너 블은 문제와 충분히 차이가 없습니다.)

max_heap_table_size = 4000M이 위험합니다! 4 명의 사용자가 필요하면 RAM이 부족하고 스와핑 된 것입니다. 스와핑은 사실상 무엇보다 성능을 저하시킵니다.

몇 초 이상 걸린 쿼리 : 개선을 위해 연구해야합니다. SHOW CREATE TABLE을 제공하십시오. 테이블 상태 표시; 선택 설명


0

otger 옵션도 고려할 수 있습니다. FreeBSD의 PostgreSQL과 같은. 그러나 Windows에서 Linux로 연결하면 성능이 향상됩니다.

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