一部のクエリを実行すると、 MySQLアプリケーションのパフォーマンスが低下します。この質問では、問題を実証するのに十分であるため、特定の1つについてのみ説明します。UPDATE
INSERT
DELETE
UPDATE
UPDATE projects SET ring = 5 WHERE id = 1
これUPDATE
は通常、約0.2msと十分に高速ですが、ときどき(問題になるほど)数秒かかります。これがログからの抜粋です(4行目を見てください):
~ (0.000282) UPDATE `projects` SET `ring` = 5 WHERE `id` = 1
~ (0.000214) UPDATE `projects` SET `ring` = 6 WHERE `id` = 1
~ (0.000238) UPDATE `projects` SET `ring` = 7 WHERE `id` = 1
~ (3.986502) UPDATE `projects` SET `ring` = 8 WHERE `id` = 1
~ (0.000186) UPDATE `projects` SET `ring` = 9 WHERE `id` = 1
~ (0.000217) UPDATE `projects` SET `ring` = 0 WHERE `id` = 1
~ (0.000162) UPDATE `projects` SET `ring` = 1 WHERE `id` = 1
projects
INT
は、6列の型とVARCHAR
、17行、および上のインデックスを持つInnoDBテーブルid
です。他のテーブルでも起こりますが、ここではこれに焦点を当てています。問題を解決しようとしたとき、クエリがすべてシーケンシャルであることを確認したので、これはロックの問題ではありません。上記UPDATE
は、トランザクションのコンテキストで実行されます。サーバーに関するその他の情報:
- 4GBのRAM(以前は1GB)、12GBの空きディスク容量を備えたVPS
- CentoOS 5.8(以前は5.7)
- MySQL 5.5.10(以前は5.0.x)
上記の「だった」ビットは、アップグレードの前後に機能しなかったことを意味します。
私がこれまでに試したことは無駄です:
innodb_flush_log_at_trx_commit
0、1、または2に設定innodb_locks_unsafe_for_binlog
オンまたはオフの設定timed_mutexes
オンまたはオフの設定innodb_flush_method
デフォルトからO_DSYNC
またはに変更O_DIRECT
innodb_buffer_pool_size
デフォルトから600M、次に3000Mに増加innodb_log_file_size
デフォルトから128Mに増加- ソースからのMySQLのコンパイル
- 実行中
SHOW PROCESSLIST
、状態が「更新中」であることを通知します - 実行中
SHOW PROFILE ALL
。これは、ほとんどすべての時間が「更新」に費やされ、そのステップ内では、CPUサイクルにそれほど多くの時間が費やされず、多くの自発的なコンテキストスイッチ(30など)があったことを示しています。 - の変更を監視
SHOW STATUS
しますInnodb_buffer_pool_pages_dirty
。フラッシュされるダーティページと遅いクエリの間には何らかの関係があるかもしれませんが、相関関係は明確ではありません。
次に、でシステムのI/O遅延を確認することにしましたioping
。これは私の最初のVPSなので、この結果を見て驚いた:
4096 bytes from . (vzfs /dev/vzfs): request=1 time=249.2 ms
4096 bytes from . (vzfs /dev/vzfs): request=2 time=12.3 ms
4096 bytes from . (vzfs /dev/vzfs): request=3 time=110.5 ms
4096 bytes from . (vzfs /dev/vzfs): request=4 time=232.8 ms
4096 bytes from . (vzfs /dev/vzfs): request=5 time=294.4 ms
4096 bytes from . (vzfs /dev/vzfs): request=6 time=704.7 ms
4096 bytes from . (vzfs /dev/vzfs): request=7 time=1115.0 ms
4096 bytes from . (vzfs /dev/vzfs): request=8 time=209.7 ms
4096 bytes from . (vzfs /dev/vzfs): request=9 time=64.2 ms
4096 bytes from . (vzfs /dev/vzfs): request=10 time=396.2 ms
かなり不安定だと思います。
そのすべてを言ったので、私は尋ねます:
I / OレイテンシーがMySQLのパフォーマンスを低下させることがありますか?
UPDATE
を実行すると、その接続を処理するスレッドがデータをディスクにフラッシュしたり、そのようなフラッシュを待機したりすることはないといつも思っていました。それはすぐに戻り、フラッシュは別の時間に別のスレッドによって実行されます。ディスクI/Oにできない場合、専用サーバーを借りる以外に、他に試すことができることはありますか?