MySQLに複数のコアを使用させることは可能ですか?


131

単一のコア以上を使用しない専用のMySQLサーバーをいくつか紹介しました。私はMySQLのDBAよりも開発者なので、助けが必要です

セットアップ

サーバーは、OLAP / DataWarehouse(DW)タイプのロードでは非常に大きくなります。

  • プライマリ:96GB RAM、8コア+シングルRAID 10アレイ
  • テスト:4コアの32GB RAM
  • 最大のDBは540 GBで、合計は約1.1TBで、ほとんどがInnoDBテーブルです
  • Solaris 10 Intel-64
  • MySQL 5.5.x

注:最大のDBはOLTP DRサーバーから複製されたものであり、DWはこれからロードされます。完全なDWではありません。6か月から6週間で終了するため、OLTP DBよりも小さくなります。

テストサーバーでの観察

  • 3つの個別の接続
  • それぞれに同時(および異なる)があります ALTER TABLE...DROP KEY...ADD INDEX
  • 3つのテーブルには250万行、380万行、450万行があります
  • CPU使用率は最大25%になり(1つのコアが最大になります)、それ以上はなりません
  • 3回のALTERには12〜25分かかります(最小の1つに4.5分かかります)。

ご質問

  1. 複数のコアを使用するには、どのような設定またはパッチが必要ですか?
    つまり、なぜMySQLは利用可能なすべてのコアを使用しないのですか?(他のRDBMSと同様)
  2. レプリケーションの結果ですか?

その他の注意事項

  • RDBMS「スレッド」とOS「スレッド」の違いを理解しています
  • 私はどんな形の並列性についても尋ねていません
  • InnoDBとスレッドのシステム変数のいくつかは次善の策です
    (クイックウィンを探しています)
  • 短期的には、ディスクレイアウトを変更できません
  • 必要に応じてOSを調整できます
  • 最小のテーブル上の単一のALTER TABLEには4.5分かかります(IMOに衝撃を与えます)

編集1

  • innodb_thread_concurrencyは両方で8に設定されます。はい、間違っていますが、MySQLが複数のコアを使用することはありません
  • innodb_buffer_pool_sizeはプライマリで80GB、テストで10GBです(別のインスタンスはシャットダウンされます)。これは今のところ大丈夫です。
  • innodb_file_per_table = ON

編集2

  • innodb_flush_log_at_trx_commit = 2
  • innodb_use_sys_malloc = ON
  • innodb_flush_methodはO_DIRECTである必要があります(ただし、SHOW VARIABLESはこれを表示しません)
  • innodb_doublewrite = OFF
  • ファイルシステム= ZFS(そして、私のシステム管理者はこれを見つけました:http : //blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices

テストする

  • innodb_flush_methodは、あるべきときにO_DIRECTとして表示されない
  • RolandoMySQLDBAの設定に従います

重要なものを見逃したかどうか教えてください

乾杯

更新

変更されたinnodb_flush_method + RolandoMySQLDBAの回答の3 xスレッド設定
結果:>テストに使用された1コア=肯定的な結果


@Dtest:innodb_file_per_table = ON。SHOW ENGINE INNODB STATUS \ Gはコマンドラインのみですか?
gbn

@Dtest:SQLyogに出力がなかったため、コマンドラインからこれを実行するように誰かに依頼する必要があります
-gbn

1
webyog.com/forums/index.php?showtopic=1290\G。また、私は思うSHOW INNODB STATUSの賛成で廃止されましたSHOW ENGINE INNODB STATUS(私は、コマンドラインで、元の実行中にエラーを取得し5.5で。
デレク・ダウニー

1
あなたは開発者なので、他のすべての答えは良いですが、特にデータウェアハウス環境では、シャードクエリcode.google.com/p/shard-queryをご覧になることをお勧めします。
ジョナサン

おかげで、それは私たちが考えてきた1つのオプションです。I = mもDBAの役割を担っています。
gbn

回答:


123

実際、2011年5月に開催されたPercona Live NYC会議で、innodb_thread_concurrencyをMySQLの専門家と話しました

私は驚くべきことを学びました:ドキュメンテーションにもかかわらず、innodb_thread_concurrency0(無限並行性)のままにするのが最善です。このようにして、InnoDBは、innodb_concurrency_tickets特定のMySQLインスタンスのセットアップに対して開く最適な数を決定します。

あなたが設定されたらinnodb_thread_concurrency0に、あなたが設定することができますinnodb_read_io_threadsし、innodb_write_io_threadsより多くのコアを従事すべき64本の最大値(両方のMySQL 5.1.38以降)を。


これを試してみます。とにかく読んだものに基づいてinnodb_thread_concurrencyを0に設定しようとしていた
gbn

9
innodb_thread_concurrency = 0の+1
randomx

3
@gbn-DBA.SEの第1位の男性からお礼を申し上げますと、自信が持てます。ありがとう、どういたしまして!!!
-RolandoMySQLDBA

グローバル設定innodb_read_io_threads = 8エラーコード:1238。変数 'innodb_read_io_threads'は読み取り専用変数
wgq3g23g

2
@ wgq3g23g RDSを実行している場合は、DBパラメーターグループでそれを変更し、インスタンスを再起動します。EC2またはベアメタルを実行している場合は、mysqldにそのオプションを追加しmy.cnfて再起動します。お願いします。
-RolandoMySQLDBA

29

MySQLは自動的に複数のコアを使用するため、25%の負荷は偶然1であるか、Solarisでの構成ミスの可能性があります。私は、ソラリスを調整する方法を知っているふりをしませんが、ここでは、ソラリス固有の調整情報について説明する記事があります

InnoDBのチューニングページはMySQL 5.5でオーバーホールされたため、そこにもいくつかの良い情報があります。以下からのInnoDBディスクIOのヒント

UnixトップツールまたはWindowsタスクマネージャーが、ワークロードのCPU使用率が70%未満であることを示している場合、ワークロードはおそらくディスクにバインドされています。トランザクションのコミットが多すぎるか、バッファプールが小さすぎる可能性があります。作るバッファプールより大きくすることは助けることができますが、物理メモリの80%以上にそれが等しくなるように設定しないでください。

その他の確認事項:

  • スイッチングinnodb_flush_method O_DIRECTにすることは価値がテストです。これが役立つ場合、forcedirectioオプションでファイルシステムをマウントする必要があるかもしれません

  • 変更innodb_flush_log_at_trx_commitを(あなたはOSのクラッシュでの最後の秒を失うことを気にしない場合)(あなたはMySQLのクラッシュの最後の秒を失うことを気にしない場合)1から0までまたは2。

  • innodb_use_sys_mallocの値を確認します。この記事には、変数に関する詳細情報があります。

    当時、マルチコアCPU用に調整されたメモリアロケーターライブラリはありませんでした。そのため、InnoDBはmemサブシステムに独自のメモリアロケーターを実装しました。このアロケーターは、ボトルネックになる可能性のある単一のミューテックスによって保護されています。

    ただし、セクションの最後に、変数をオンにすることの意味についての注意事項があります(5.5ではデフォルトでオンになっています)。

    InnoDBメモリアロケーターが無効になっている場合、InnoDBはパラメーターinnodb_additional_mem_pool_sizeの値を無視することに注意してください。

  • レプリケーションが問題の原因となっている可能性があります。私はあなたが並列処理に興味がないことを理解していますが、この作業ログの説明から:

    現在、マルチコアマシンではレプリケーションのスケーラビリティは高くありません。単一のスレーブスレッドはレプリケーションイベントを1つずつ実行し、別々のマスターサーバーのCPUによって処理される複数のクライアント接続が同時に発生することによる負荷に対処できない場合があります。

最終的には、ディスクベースの操作が発生するため、InnoDBはデータウェアハウジングに最適なエンジンではない可能性があります。データウェアハウステーブルをCompressed MyISAMに変更することを検討できます。

1 偶然にも、負荷が25%を超えて増加することを妨げるボトルネックがありますが、必ずしもシングルコアの強制的な問題ではありません。


ありがとう。質問に設定セクションが追加されました。問題は、単一のコアを使用するいくつかの集中的なクエリです:メモリまたはスレッド設定ではありません。同じコア上でさらに多くのスレッドが実行される
-gbn

@gbn更新をありがとう、まだ見ています。私はそれが「偶然」だと思っていました。私はそれがソラリスのみの問題なのか(developer.sun.com/solaris/articles/mysql_perf_tune.html)疑問に思っていますが、そのシステムについてはあまり知りません。
デレクダウニー

1
@Dtest:この記事をSolaris管理者にも紹介します。いくつかの良いものがあります
-gbn

1
現在、レプリケーションは(オプションで)スレーブ上でマルチスレッド化されています。この回答が書かれてからInnoDBは改善されました。MyISAMの使用はお勧めしません。特に圧縮されている場合はそうではありません。
リックジェームズ

15

単一の接続では、単一のコアのみが使用されます。(OK、InnoDBはいくつかのI / O処理に他のスレッド、したがってコアを使用しますが、それは重要ではありません。)

3つのALTERがあったため、3コア以上の価値は使用していませんでした。

残念ながら、PARTITIONでさえ複数のコアを使用していません。

最近まで、複数の接続は4〜8コアで最大になりました。PerconaのXtradb(MariaDBに含まれる)は、複数のコアをより効果的に使用しますが、それでもスレッドごとに1つだけです。最大約32コアです。


(2015年に更新:) 5.6の複数接続は、約48コアで最大になります。5.7はさらに良くなることを約束します。(つまり、Oracleベンチマークは述べています。)しかし、それでも1つの接続に複数のコアを使用することはありません。
リックジェームズ

更新(OracleのOpenWorldに移行後):新しいバージョン8.xには並列処理がありません。
リックジェームズ

9

私見および説明されているユースケースでは、複数のコアを使用することはありません。その理由は、ワークロードがCPUバウンドではなくIOバウンドだからです。3つの接続が新しいインデックスを作成しているため、それぞれがディスクからテーブル全体を読み取る必要があります。これは、インデックスを計算するのではなく、時間がかかっていることです。


8

ボトルネックはファイルシステムのIOパフォーマンスである可能性があることを考慮してください。

@RolandoMySQLDBAによって提案された設定に加えて mysqlデータディレクトリを保持するパーティションのnoatimeマウント設定も設定します/etc/fstab/data01/mysql私の場合はに/dev/sdb1マウントされています/data01)。

デフォルトでは、Linuxはすべてのディスク読み取りまたは書き込みのアクセス時間を記録します。これは、特にデータベースなどの高IOアプリケーションの場合、IOパフォーマンスに悪影響を及ぼします。これは、ファイルからデータを読み取ることで、ディスクへの書き込みがトリガーされることを意味します... WAT!

これを無効にするには、次のように目的のマウントポイントにnoatimeマウントオプションを追加/etc/fstabします(私の場合の例)。

/dev/sdb1  /data01  ext4  defaults,noatime  0  2

次に、パーティションを再マウントします。

mount -o,remount /data01

これにより、そのパーティションを使用するアプリケーションの読み取り/書き込みパフォーマンスが向上します。しかし...すべてのデータをメモリに保持することに勝るものはありません。

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