シングルコア以上を使用しない専用のMySQLサーバーがいくつか提示されました。私はMySQLのDBAよりも開発者なので、助けが必要です
サーバーはOLAP/DataWarehouse(DW)タイプの負荷でかなり高負荷です。
注:最大のDBは、OLTP DRサーバーから複製されたDBであり、DWはこれからロードされます。完全なDWではありません。最後の6か月から6週間だけなので、より小さくなります。 OLTP DB。
ALTER TABLE...DROP KEY...ADD INDEX
重要な情報を逃した場合はお知らせください
乾杯
RolandoMySQLDBAの回答のinnodb_flush_method + 3 xスレッド設定を変更
結果:>テストに使用された1コア=肯定的な結果
2011年5月に開催されたPercona Live NYCカンファレンスで実際にinnodb_thread_concurrencyをMySQLエキスパートと話し合った 。
私は驚くべきことを学びました:ドキュメントにもかかわらず、それを残すことをお勧めします innodb_thread_concurrency
0(無限の同時実行)。このようにして、InnoDBが最適な数を決定します innodb_concurrency_tickets
指定されたMySQLインスタンスのセットアップで開く。
設定したらinnodb_thread_concurrency
は0に設定できます innodb_read_io_threads
および innodb_write_io_threads
(両方ともMySQL 5.1.38以降)最大値64に設定します。これにより、より多くのコアが使用されるようになります。
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 を1から0(mysqlクラッシュで最後の1秒を失うことを気にしない場合)または2(OSクラッシュで最後の1秒を失うことを気にしない場合)に変更します。
innodb_use_sys_malloc の値を確認します。この記事には、変数について 詳細情報 が記載されています。
当時、マルチコアCPU用に調整されたメモリアロケーターライブラリはありませんでした。したがって、InnoDBはmemサブシステムに独自のメモリアロケーターを実装しました。このアロケータは、ボトルネックになる可能性がある単一のミューテックスによって保護されています。
ただし、セクションの最後に、変数をオンにすることの意味についていくつかの警告があります(5.5ではデフォルトでオンになっています)。
InnoDBメモリアロケーターが無効になっている場合、InnoDBはパラメーターinnodb_additional_mem_pool_sizeの値を無視することに注意してください。
レプリケーションが問題の原因となっている可能性があります。私はあなたが並列処理に興味がないことを理解していますが、 この作業ログ の説明から:
現在、レプリケーションはマルチコアマシンで適切に拡張できません。単一のスレーブスレッドはレプリケーションイベントを1つずつ実行し、個別のマスターサーバーのCPUが提供する複数の同時クライアント接続によって生成される負荷に対処できない場合があります。
最終的に、ディスクベースの操作が発生するため、InnoDBはデータウェアハウジングに最適なエンジンではない可能性があります。データウェアハウステーブルを Compressed MyISAM に変更することを検討できます。
1偶然にも、負荷が25%を超えるのを妨げるボトルネックがあることを意味しますが、必ずしも強制的なシングルコアの問題ではありません。
注:この回答は、複数のコアを使用する単一の接続に関するものです。OPの質問があいまいであり、MySQLが全体として複数のコアを使用できないと誤って想定されていました。他の回答は、3-Alterを正しく指摘していますテストケースは実際にはI/Oにバインドされているため、タイトルの質問を証明できません。
単一の接続は単一のコアのみを使用します。 (OK、InnoDBは一部のI/O処理に他のスレッド、つまりコアを使用しますが、それは重要ではありません。)
あなたは3つのALTERを持っているので、3つ以上のコアの価値を使用していませんでした。
残念ながら、PARTITIONでも複数のコアを使用していません。
最近まで、複数の接続は4〜8コア後に最大になります。 PerconaのXtradb(MariaDBに含まれる)は、複数のコアをより効率的に使用しますが、スレッドごとに1つだけです。それらは約32コアで最大になります。
(2015年の更新:) 5.6の複数の接続は、約48コアで最大になります。 5.7はさらに良いことを約束します。 (したがって、Oracleのベンチマークはそうです。)しかし、単一の接続に複数のコアを使用することはまだありません。
更新(OracleのOpenWorldに移動した後):新しいバージョン8.xには並列処理がありません。
さらなるアップデート-8.0.17には、選択された非常に少数のクエリで複数のコアを使用するケースがあります。 (つまり、興奮しないでください。)
IMHOと前述のユースケースでは、複数のコアを使用することはありません。その理由は、ワークロードがIOバウンドであり、CPUバウンドではないためです。3つの接続が新しいインデックスを作成しているため、それぞれがディスクからテーブル全体を読み取る必要があります。これは時間、インデックスを計算していません。
ボトルネックがファイルシステムのIOパフォーマンスである可能性があることを考慮してください。
@ RolandoMySQLDBAによって提案された設定 に加えて、_/etc/fstab
_でmysqlデータディレクトリを保持するパーティションのnoatime
マウント設定も設定します(私の場合、_/data01/mysql
_、_/dev/sdb1
_は_/data01
_にマウントされます)。
デフォルトでは、Linuxはすべてのディスクの読み取りまたは書き込みのアクセス時間を記録します。これは、IOパフォーマンス、特にデータベースのような高いIOアプリケーションの場合、パフォーマンスに悪影響を及ぼします。つまり、読み取りファイルからのデータはディスクへの書き込みをトリガーします... WAT!
これを無効にするには、目的のマウントポイントの_/etc/fstab
_にnoatime
マウントオプションを次のように追加します(私の場合の例):
_/dev/sdb1 /data01 ext4 defaults,noatime 0 2
_
次に、パーティションを再マウントします。
_mount -o,remount /data01
_
これにより、そのパーティションを使用するアプリケーションの読み取り/書き込みパフォーマンスが向上します。しかし...メモリにすべてのデータを保持することに勝るものはありません。