これはかなり単純な問題です。テーブルへのデータの挿入は、挿入クエリに数秒かかる数回を除いて、通常は正常に機能します。(データを一括挿入しようとしているわけではありません。) そこで、挿入プロセスのシミュレーションをセットアップして、挿入クエリの実行に 2 秒以上かかる場合がある理由を調べました。Joshua は、インデックス ファイルが調整されている可能性があることを示唆しました。ID (主キー フィールド) を削除しましたが、それでも遅延が発生します。
MyISAM テーブルがあります: daniel_test_insert
(このテーブルは最初は完全に空です):
create table if not exists daniel_test_insert (
id int unsigned auto_increment not null,
value_str varchar(255) not null default '',
value_int int unsigned default 0 not null,
primary key (id)
)
そこにデータを挿入すると、挿入クエリの実行に 2 秒以上かかることがあります。 このテーブルには読み取りはありません。単一のスレッド化されたプログラムによるシリアルの書き込みのみです。
まったく同じクエリを 100,000 回実行して、クエリに時間がかかる理由を見つけました。これまでのところ、それはランダムに発生しているようです。
たとえば、このクエリには 4.194 秒かかりました (挿入には非常に長い時間)。
Query: INSERT INTO daniel_test_insert SET value_int=12345, value_str='afjdaldjsf aljsdfl ajsdfljadfjalsdj fajd as f' - ran for 4.194 seconds
status | duration | cpu_user | cpu_system | context_voluntary | context_involuntary | page_faults_minor
starting | 0.000042 | 0.000000 | 0.000000 | 0 | 0 | 0
checking permissions | 0.000024 | 0.000000 | 0.000000 | 0 | 0 | 0
Opening tables | 0.000024 | 0.001000 | 0.000000 | 0 | 0 | 0
System lock | 0.000022 | 0.000000 | 0.000000 | 0 | 0 | 0
Table lock | 0.000020 | 0.000000 | 0.000000 | 0 | 0 | 0
init | 0.000029 | 0.000000 | 0.000000 | 1 | 0 | 0
update | 4.067331 | 12.151152 | 5.298194 | 204894 | 18806 | 477995
end | 0.000094 | 0.000000 | 0.000000 | 8 | 0 | 0
query end | 0.000033 | 0.000000 | 0.000000 | 1 | 0 | 0
freeing items | 0.000030 | 0.000000 | 0.000000 | 1 | 0 | 0
closing tables | 0.125736 | 0.278958 | 0.072989 | 4294 | 604 | 2301
logging slow query | 0.000099 | 0.000000 | 0.000000 | 1 | 0 | 0
logging slow query | 0.000102 | 0.000000 | 0.000000 | 7 | 0 | 0
cleaning up | 0.000035 | 0.000000 | 0.000000 | 7 | 0 | 0
(これは SHOW PROFILE コマンドの省略版です。すべてゼロの列を削除しました。)
現在、この更新プログラムには、信じられないほどの数のコンテキスト スイッチとマイナーなページ フォールトが含まれています。Opened_Tables は、このデータベースで 10 秒ごとに約 1 増加します (table_cache スペースが不足していません)。
統計:
MySQL 5.0.89
ハードウェア: 32 ギグの RAM / 8 コア @ 2.66GHz。RAID 10 SCSI ハードディスク (SCSI II???)
ハード ドライブと RAID コントローラを照会しました。エラーは報告されていません。CPU は約 50% アイドル状態です。
iostat -x 5 (ハードディスクの使用率が 10% 未満であると報告されます) 1 分間の負荷平均が約 10 であると報告されます (db マシンでは通常)
スワップ領域には 156k が使用されています (32 GB の RAM)
このパフォーマンスの遅れの原因を突き止めるのに途方に暮れています。これは、低負荷のスレーブでは発生せず、高負荷のマスターでのみ発生します。これは、メモリおよび innodb テーブルでも発生します。誰か提案はありますか?(これは本番システムなので、風変わりなものではありません!)