sql >> データベース >  >> RDS >> MariaDB

MySQL I/O使用率が高いかどうかを確認する方法

    I / Oパフォーマンスは、MySQLデータベースにとって非常に重要です。データは、さまざまな場所でディスクに対して読み書きされます。ログ、テーブルスペース、バイナリおよびリレーログをやり直します。ソリッドステートドライブの使用が増えると、I / Oパフォーマンスが大幅に向上し、ユーザーはデータベースをさらに高速にプッシュできるようになりますが、それでもI/Oがボトルネックになりデータベース全体のパフォーマンスを制限する要因になる可能性があります。このブログ投稿では、MySQLインスタンスでI/Oパフォーマンスが高いことに気付いた場合に確認したいことを確認します。

    「高い」I/O使用率とはどういう意味ですか?つまり、データベースのパフォーマンスが影響を受ける場合、それは高いです。通常、データベースでの書き込みが遅くなることに気付くでしょう。また、システムでの高いI/O待機として明らかになります。ただし、32以上のCPUコアを搭載したホストでは、1つのコアで100%のI / O待機が表示されても、集約ビューでは気付かない場合があります。これは、負荷全体の1/32にすぎません。 。影響はないようですが、実際には、シングルスレッドのI / O操作によってCPUが飽和状態になり、一部のアプリケーションがそのI/Oアクティビティの終了を待機しています。

    I/Oアクティビティの増加に気付いたとしましょう。上のスクリーンショットのように。 I / Oアクティビティが高いことに気付いた場合は、何を確認しますか?まず、システム内のプロセスのリストを確認します。 I / O待機の責任者はどれですか? iotopを使用して、次のことを確認できます。

    この場合、責任があるのはMySQLであることは明らかです。それの大部分。最も単純なチェックから始める必要があります-現在MySQLで正確に何が実行されていますか?

    スレーブでレプリケーションアクティビティが発生していることがわかります。マスターに何が起こっているのですか?

    バッチロードジョブが実行されていることがはっきりとわかります。問題を非常に簡単に特定できたので、この種の旅はここで終わります。

    ただし、他のケースもありますが、理解と追跡がそれほど簡単ではない場合があります。 MySQLには、システム内のI/Oアクティビティの理解を支援することを目的としたいくつかのインストルメンテーションが付属しています。前述したように、I/Oはシステム内のさまざまな場所で生成できます。書き込みは最も明確なものですが、ディスク上に一時テーブルがある場合もあります。クエリでそのようなテーブルが使用されているかどうかを確認することをお勧めします。

    performance_schemaを有効にしている場合、I / O負荷の原因となっているファイルを確認する1つの方法は、「table_io_waits_summary_by_table」をクエリすることです。

    *************************** 13. row ***************************
    
                    FILE_NAME: /tmp/MYfd=68
    
                   EVENT_NAME: wait/io/file/sql/io_cache
    
        OBJECT_INSTANCE_BEGIN: 140332382801216
    
                   COUNT_STAR: 17208
    
               SUM_TIMER_WAIT: 23332563327000
    
               MIN_TIMER_WAIT: 1596000
    
               AVG_TIMER_WAIT: 1355913500
    
               MAX_TIMER_WAIT: 389600380500
    
                   COUNT_READ: 10888
    
               SUM_TIMER_READ: 20108066180000
    
               MIN_TIMER_READ: 2798750
    
               AVG_TIMER_READ: 1846809750
    
               MAX_TIMER_READ: 389600380500
    
     SUM_NUMBER_OF_BYTES_READ: 377372793
    
                  COUNT_WRITE: 6318
    
              SUM_TIMER_WRITE: 3224434875000
    
              MIN_TIMER_WRITE: 16699500
    
              AVG_TIMER_WRITE: 510356750
    
              MAX_TIMER_WRITE: 223219960500
    
    SUM_NUMBER_OF_BYTES_WRITE: 414000000
    
                   COUNT_MISC: 2
    
               SUM_TIMER_MISC: 62272000
    
               MIN_TIMER_MISC: 1596000
    
               AVG_TIMER_MISC: 31136000
    
               MAX_TIMER_MISC: 60676000
    
    *************************** 14. row ***************************
    
                    FILE_NAME: /tmp/Innodb Merge Temp File
    
                   EVENT_NAME: wait/io/file/innodb/innodb_temp_file
    
        OBJECT_INSTANCE_BEGIN: 140332382780800
    
                   COUNT_STAR: 1128
    
               SUM_TIMER_WAIT: 16465339114500
    
               MIN_TIMER_WAIT: 8490250
    
               AVG_TIMER_WAIT: 14596931750
    
               MAX_TIMER_WAIT: 583930037500
    
                   COUNT_READ: 540
    
               SUM_TIMER_READ: 15103082275500
    
               MIN_TIMER_READ: 111663250
    
               AVG_TIMER_READ: 27968670750
    
               MAX_TIMER_READ: 583930037500
    
     SUM_NUMBER_OF_BYTES_READ: 566231040
    
                  COUNT_WRITE: 540
    
              SUM_TIMER_WRITE: 1234847420750
    
              MIN_TIMER_WRITE: 286167500
    
              AVG_TIMER_WRITE: 2286754250
    
              MAX_TIMER_WRITE: 223758795000
    
    SUM_NUMBER_OF_BYTES_WRITE: 566231040
    
                   COUNT_MISC: 48
    
               SUM_TIMER_MISC: 127409418250
    
               MIN_TIMER_MISC: 8490250
    
               AVG_TIMER_MISC: 2654362750
    
               MAX_TIMER_MISC: 43409881500

    上記のように、使用中の一時テーブルも表示されます。

    特定のクエリが一時テーブルを使用しているかどうかを再確認するには、EXPLAIN FOR CONNECTIONを使用できます:

    mysql> EXPLAIN FOR CONNECTION 3111\G
    
    *************************** 1. row ***************************
    
               id: 1
    
      select_type: SIMPLE
    
            table: sbtest1
    
       partitions: NULL
    
             type: ALL
    
    possible_keys: NULL
    
              key: NULL
    
          key_len: NULL
    
              ref: NULL
    
             rows: 986400
    
         filtered: 100.00
    
            Extra: Using temporary; Using filesort
    
    1 row in set (0.16 sec)

    上記の例では、ファイルソートに一時テーブルが使用されています。

    ディスクアクティビティに追いつく別の方法は、MySQL用のPercona Serverを使用している場合、完全に遅いログの詳細度を有効にすることです。

    mysql> SET GLOBAL log_slow_verbosity='full';
    
    Query OK, 0 rows affected (0.00 sec)

    その後、遅いログに次のようなエントリが表示される場合があります:

    # Time: 2020-01-31T12:05:29.190549Z
    
    # [email protected]: root[root] @ localhost []  Id: 12395
    
    # Schema:   Last_errno: 0  Killed: 0
    
    # Query_time: 43.260389  Lock_time: 0.031185 Rows_sent: 1000000  Rows_examined: 2000000 Rows_affected: 0
    
    # Bytes_sent: 197889110  Tmp_tables: 0 Tmp_disk_tables: 0  Tmp_table_sizes: 0
    
    # InnoDB_trx_id: 0
    
    # Full_scan: Yes  Full_join: No Tmp_table: No  Tmp_table_on_disk: No
    
    # Filesort: Yes  Filesort_on_disk: Yes  Merge_passes: 141
    
    #   InnoDB_IO_r_ops: 9476  InnoDB_IO_r_bytes: 155254784  InnoDB_IO_r_wait: 5.304944
    
    #   InnoDB_rec_lock_wait: 0.000000  InnoDB_queue_wait: 0.000000
    
    #   InnoDB_pages_distinct: 8191
    
    SET timestamp=1580472285;
    
    SELECT * FROM sbtest.sbtest1 ORDER BY RAND();

    ご覧のとおり、ディスク上に一時テーブルがあったのか、データがディスク上で並べ替えられたのかがわかります。 I/O操作の数とアクセスされたデータの量を確認することもできます。

    このブログ投稿が、システムのI / Oアクティビティを理解し、より適切に管理できるようになることを願っています。


    1. Androidルーム+ウィンドウ関数

    2. Oracleデータベースで例外変数を使用してユーザー定義の例外を宣言する方法

    3. SQLでNULLがNULLと一致しないのはなぜですか?

    4. Oracle sqlチュートリアル:基本的なSQLステートメント