web-dev-qa-db-ja.com

挿入が多いInnoDBテーブルがCPUをすべて使用しない

パケットログデータベースがありますが、ほとんど照会されません。挿入時に高速である必要があります。 ACIDコンプライアンスを維持したいので、InnoDBを使用しています。これは、1つのパケットを失うだけでもお客様に損害を与える可能性があるためです。パフォーマンス調整シナリオでは、複数のDB接続を介してサーバーに1,000,000パケットを送信します。しかし、my.cnfで使用する設定に関係なく、12コアのシステムでmysqldプロセスが900%を超えるCPUを使用することはできません。 (ボックスでは他に何も実行されていません。)

以下を設定しました

  • innodb_file_per_table = 1
  • innodb_write_io_threads = 64
  • innodb_read_io_threads = 64
  • innodb_thread_concurrency = 0

MyISAMを使用すると、すべてのパケットを約6秒で書き込むことができます。しかし、InnoDBは約25分かかります。MySQLに残りのシステムリソースを使用させ、より速く挿入できますか?

編集:これはテーブルのスキーマです:

+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t     | bigint(20) unsigned  | YES  |     | NULL    |       |
| a     | char(1)              | YES  |     | NULL    |       |
| sa    | int(10) unsigned     | YES  |     | NULL    |       |
| sb    | int(10) unsigned     | YES  |     | NULL    |       |
| sc    | int(10) unsigned     | YES  |     | NULL    |       |
| sd    | int(10) unsigned     | YES  |     | NULL    |       |
| sp    | smallint(5) unsigned | YES  |     | NULL    |       |
| da    | int(10) unsigned     | YES  |     | NULL    |       |
| db    | int(10) unsigned     | YES  |     | NULL    |       |
| dc    | int(10) unsigned     | YES  |     | NULL    |       |
| dd    | int(10) unsigned     | YES  |     | NULL    |       |
| dp    | smallint(5) unsigned | YES  |     | NULL    |       |
+-------+----------------------+------+-----+---------+-------+

edit2:単一のクエリが最大長(約16,000,000文字)に近づくように、より多くの挿入をバッチ処理しました。データベースは2秒間1100%に急上昇し、残りの時間は100%に低下します。合計時間は21秒、つまり開始時よりも約16%速くなりました。

8
sep332

同様に innodb_io_capacity を上げる必要があります。

デフォルトは200です。最初に5000に増やします。 20000に行きます。

また、ib_logfile0およびib_logfile1は十分に大きいです。 innodb_log_file_size のデフォルト値は5Mです。初心者にはそれを1Gに引き上げます。

より大きなInnoDBバッファープールもおそらく役立ちます(おそらく4G)。

要約すると、次の追加設定を使用します。

[mysqld]
innodb_io_capacity=5000
innodb_buffer_pool_size=4G
innodb_log_file_size=1G

これらの設定をmy.cnfに追加した後、ib_logfile0/ib_logfile1のサイズを変更するには、次のようにします。

service mysql stop
rm -f /var/log/mysql/ib_logfile[01]
service mysql start

ファイルib_logfile0およびib_logfile1が再作成されます。 心配しないで、私は何度もこれをやりました

InnoDBでは通常とは異なることを行う必要がある場合があります

以下を試してください:

  • InnoDBテーブルの完全なテーブルロック
  • バルクロードを実行する
  • ロックを解除する
7
RolandoMySQLDBA

複数のコアの使用を最大化する機能に影響を与えるいくつかの要因があります。

  • 一部のミューテックスは、複数のCPUに影響を与え、続行する前にいくつかを待機させます。
  • CPUの数と同じ数のアクティブスレッドが必要です。ワークロードの結果、9つの並列スレッドが発生した場合、12のコアを埋めることはできません。
  • I/O容量は、すべてのCPUに十分な作業を提供するのに十分でなければなりません。ディスクI/Oでキューに入れているか、ネットワークメッセージを待っている場合、CPUをいっぱいにすることはできません。

SARなどのツールを使用すると、容量を削減しているボトルネックがあるかどうかを判断できます。警告されるだけで、1つのボトルネックが解消され、ボトルネックが移動します。

3
BillThor