16 GBのRAMを搭載したQuadCoreマシンでMySQLを最大限に活用する方法は?


10

科学的データ分析のためにワークステーションでMySQL 5.5サーバーを実行していますが、パフォーマンスを最大限に活用するためにMySQLを構成する方法を考えています。私が通常実行するクエリの種類には、10〜20のテーブルの結合が含まれ、非常に長く実行できます。1〜数分は例外ではありません。同時にデータベースにアクセスするユーザーはごくわずかです(最大5人)。2.2 GHzのデュアルコアと4 GBのRAMを搭載したLenovo Thinkpad T61から、コンポーネントを手動で選択した次の新しいマシンにサーバーを移動しました。

  • Intel i7 3770、4x 3.4 GHz(4x3.7 GHzで稼働)
  • Z77チップセット
  • 16 GBの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のテーブルにまたがる結合を含む2つのクエリがあり、Lenovoノートブックと新しいPCでそれらを実行しました。クエリ#1は、新しいマシンでは3分36秒でしたが、ラップトップでは9分11秒でした。クエリ#2は、ワークステーションで22.5秒、ラップトップで48.5秒かかりました。したがって、実行速度は約2-2.5倍向上しました。ワークステーションでは、RAMの50%も使用されていません。4つのコア全体の平均CPU負荷(Windowsタスクマネージャーで報告)は、約13%にすぎませんでした。コアごとの負荷(Core Tempによって報告)は、1つのコアでは約25〜40%でしたが、他のコアでは<= 10%でした。これは、MySQLが単一のクエリで複数のコアを使用しないことを示しています。 。


サーバーの負荷を表示して、メモリ、IO、CPUの負荷などを確認してください

いくつかのテストを実行し、Windowsタスクマネージャーの発言を報告します(または、より優れたツールをアドバイスしますか?)

これで、問題がどこにあるのかを最初に知ることができます。

いくつかの統計を追加しました。

2
また、あなたはまた、Perconaを取得するには、ウィザードでデータベースサーバーの設定を「推奨」試してみることができますtools.percona.com/wizard
スティーブンSenkomago Musoke

回答:


5

MySQL 5.5を実行しているため、複数のコアにアクセスするようにInnoDBを構成することを検討してください

使用すべき設定は次のとおりです

innodb_thread_concurrencyは、InnoDBが開いたままにできる並行スレッドの数の上限を設定します。これに設定する最適なラウンド数は、(2 X CPU数)+ディスク数です。更新:Percona NYCカンファレンスから直接学んだように、これを0に設定して、実行している環境に最適なスレッド数を見つけるようにInnoDBストレージエンジンに警告する必要があります。

innodb_concurrency_ticketsは、無欠陥の同時実行性チェックをバイパスできるスレッドの数を設定します。この制限に達すると、スレッドの同時実行チェックが再び標準になります。

innodb_commit_concurrencyは、コミットできる同時トランザクションの数を設定します。デフォルトは0なので、これを設定しないと、任意の数のトランザクションを同時にコミットできます。

innodb_thread_sleep_delayは、InnoDBキューに再び入る前にInnoDBスレッドが休止できるミリ秒数を設定します。デフォルトは10000(10秒)です。

innodb_read_io_threadsおよびinnodb_write_io_threads(両方ともMySQL 5.1.38以降)は、指定された数のスレッドを読み取りと書き込みに割り当てます。デフォルトは4で、最大は64です。

innodb_replication_delayは、スレーブにスレッド遅延を課し、innodb_thread_concurrencyに到達します。

これは、MySQL 5.5に関する過去の投稿と、InnoDBの複数コアのアクティブ化です。


2

パーコナをリードするMySQLコンサルタントは、MySQL設定ウィザードを提供していますmy.cnf/my.iniシステム構成に応じて構成できます。

また、Perconaの人々は「High Performance MySQL」と呼ばれる本をリリースしました。第3版は最近リリースされ、チューニングについて詳しく説明しています。


これらの値は、彼らが良いパフォーマンスのために提案するものですか、それとも私が入力したものを吐き出すだけですか?
OpenCoderX 2013

1

メモリ使用量:http : //mysql.rjweb.org/doc.php/memoryを参照してください(ほとんどのチューナブルでは、問題になるほどの違いはありません)。

max_heap_table_size = 4000Mは危険です!4人のユーザーがこれを必要とする場合、RAMとスワッピングが不足しています。スワッピングは、事実上何よりもパフォーマンスに悪影響を与えます。

数秒以上かかるクエリ:改善のために調査する必要があります。SHOW CREATE TABLEを提供してください。SHOW TABLE STATUS; EXPLAIN SELECT


0

otgerオプションも検討できます。FreeBSDのPostgreSQLなど。ただし、WindowsからLinuxに切り替えると、パフォーマンスが向上します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.