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


8

パケットログデータベースを持っていますが、ほとんど照会されません。挿入時に高速である必要があります。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%速くなりました。

回答:


7

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テーブルのフルテーブルロック
  • バルクロードを実行する
  • ロックを解除する

複数のバッファプールを用意することは役に立ちますか?それともテーブルが1つしかないので、問題になりますか?
sep332 2012年

1つのバッファプールのみ。そうすれば、仮想的な制限はありません。単一の162GBバッファープールを使用してMySQL 5.5.9を実行しているクライアントがあり、それは非常に優れています。
RolandoMySQLDBA 2012年

これを使用して、私は約950%のCPUに到達しましたが、それはそれ以上速くはないようです。
sep332 2012年

バルクロードする前に、InnoDBテーブルでフルテーブルロックを試してください。
RolandoMySQLDBA 2012年

3

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

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

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

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