MySQLの不合理なMaxIdleConnsにより接続が短くなる

MySQLの不合理なMaxIdleConnsにより接続が短くなる

1 背景

最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しました。突然のトラフィック状況により、1 つのビジネスのパフォーマンスが急激に低下しました。このサービスはデータベースに依存しており、データベースからデータをバッチで取得します。一連のトラブルシューティングを行った結果、サービスからデータベースへの接続数が MaxIdleConns を頻繁に超過していることがわかりました。パフォーマンスの問題はデータベースの構成に起因しているのではないかと疑い、データベース コードを分析し、関連する実験を実施しました。

2 構成の解釈

maxIdleCount int // ゼロは defaultMaxIdleConns を意味します。負数は 0 を意味します
maxOpen int // <= 0 は無制限を意味します
maxLifetime time.Duration // 接続を再利用できる最大時間
maxIdleTime time.Duration // 接続が閉じられるまでアイドル状態が維持される最大時間

上記の 4 つの構成が Go MySQL クライアントの最も重要な構成であることがわかります。

maxIdleCount アイドル接続の最大数。デフォルトでは設定されておらず、最大アイドル接続数は 2 です。

maxOpen 最大接続数。デフォルトでは設定されていないため、最大接続数は制限されません。

maxLifetime 最大接続存続期間

maxIdleTime アイドル接続の最大存続期間

3 ソースコード分析

私たちのシナリオでは、クライアントによって MySQL に確立される接続の数が、アイドル接続の最大数よりも大きくなることがよくあります。これによりどのような問題が発生しますか?下の図のソースコードを見てみましょう。

アイドル接続の最大数がクライアントとデータベース間で確立された接続数より少ない場合、false が返され、接続クローズ カウンターの最大数が 1 増加することがわかります。

上の図では、接続が閉じられていることがわかります (MySQL ソース コードは、閉じる前にバッファ時間を残しません)。 Go MySQL クライアントのこの操作により、トラフィックのバーストが発生したときに、リクエスト量が大きくなりすぎて、アイドル接続の最大数の負荷を超えてしまいます。この場合、新しい接続が接続プールに入れられると、容赦なく閉じられ、短い接続になり、サービスのパフォーマンスがさらに低下します。

4つの実験

4.1 オンライン同時通話数がMaxIdConnsを超える状況をシミュレートする

テスト コード、上記のロジックをテストするために、次のシナリオを想定します。最大接続数は 100 に設定され、アイドル接続の最大数は 1 に設定され、データベースを要求する同時 goroutine の数は 10 です。 MySQL 統計の maxIdleClosed の統計を見ると、次の図に示すように、接続が絶えず閉じられていることがわかります。

4.2 オンライン同時接続数がMaxIdConnsより少ない状況をシミュレートする

テスト コードでは、最大接続数が 100、最大アイドル接続数が 20、データベースを要求する同時 goroutine 数が 10 に設定されているというシナリオを想定しています。下の図に示すように、MaxIdleClosed のクローズ統計はありません。

4.3 パケットをキャプチャして、オンライン同時実行数がMaxIdConnsより大きいことを確認する

コードをテストします。コードを誤解していないことを確認するには、パッケージをキャプチャするのが最も安全です。メイン関数に select{} を配置します。プログラムが mysql ステートメントを実行した後、TCP ステータスとパケット キャプチャ データを確認します。

TCP ステータス統計が MySQL クライアント統計と一致しており、fin パッケージが存在することがわかります。

5 結論

トラフィックのバーストが発生すると、リクエスト量が大きくなり、アイドル接続の最大数の負荷を超えます。この場合、新しい接続は接続プールに配置された時点で閉じられ、接続が短い接続になり、サービスのパフォーマンスがさらに低下します。この状況を回避するために、次のような最適化対策を講じることができます。

短い接続を避けるために、maxIdleConnsを事前に大きな値に設定してください。

MySQLの読み取りと書き込みの分離をうまく行う

MySQLのスループットを向上: 返されるフィールドを合理化し、不要なフィールドを返さず、接続を迅速に再利用します。

パケットの断片化を避けるために、スループット パケットは大きすぎないようにする必要があります。

接続プールを最適化します。クライアントから MySQL への接続数が最大アイドル接続数を超えると、クローズが遅れることがあります (公式にはサポートされていないため、おそらく自分で実装するしかありません)

読み取りリクエストをMySQLに置かず、Redisに置くようにしてください。

6 テストコード

https://github.com/gotomicro/test/tree/main/gorm

以上がMySQLのMaxIdleConnsが不合理でショート接続になってしまう原因の詳しい内容です。MySQLのMaxIdleConnsが不合理な理由について、詳しくは123WORDPRESS.COMの関連記事もご覧ください!

以下もご興味があるかもしれません:
  • Mysql 主キー UUID と自動増分主キーの違いと利点と欠点
  • 特定の部門 ID に基づいて、すべての下位レベルの複数レベルのサブ部門を照会する MySQL の例
  • MySQLでデータを挿入した後に自動増分IDを返す7つの方法の詳細な説明
  • IDEA を使用して Tomcat を設定し、MySQL データベース (JDBC) に接続するための詳細な手順
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySQL の自動増分 ID (主キー) が不足した場合の解決策
  • JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)
  • MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析
  • MySQL は ACID トランザクションをどのように実装しますか?
  • IDEA が MySQL に接続する際の問題と解決策
  • MySQLはIDに適切なデータ型を選択します

<<:  Docker で Let's Encrypt から永久無料 SSL 証明書を取得する方法

>>:  ウェブフォームデザインのための5つの実用的なヒント

推薦する

Dockerはローカルイメージとコンテナの保存場所を設定します

指定したサイズより大きいファイルを検索するには、find コマンドを使用します。 検索 / -typ...

Linux で PHP を 5.6 にアップグレードする実用的な方法

1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...

JavaScript におけるブラウザ互換性の問題について簡単に説明します

ブラウザの互換性は、実際の開発では見落とされがちな最も重要な部分です。古いバージョンのブラウザの互換...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

Ubuntu 18.04にmysql5.7をインストールする

Ubuntu 18.04では参考までにmysql 5.7をインストールします。具体的な内容は以下のと...

制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?

目次1. テスト実験2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバー...

MySQLサーバーが消えたエラーの解決策

PHP で MySQL サーバーが消えた問題1. 背景以前、Codeigniter でコンソール コ...

Nginx 書き換えジャンプの適用シナリオの詳細な説明

アプリケーションシナリオ1: ドメイン名ベースのリダイレクト会社の古いドメイン名は www.accp...

HTML 特殊文字変換表

キャラクター小数点文字番号エンティティ名---未使用空間---スペースバー! ! ---感嘆符「 」...

CSS3 と JavaScript を使用して Web カラー ピッカーのサンプル コードを開発する

この例の Web カラー ピッカー機能は、ページ効果を実現するために CSS3 を使用します。つまり...

MySQL の無効な左結合の問題を解決する方法とその使用上の注意

MySQLの左結合が無効であり、その使用方法今日SQLを書いていたとき、左結合を使用すると左のテーブ...

Vue2.0でデータの双方向バインディング機能をjsを使って実装する

Object.definePropertyの理解文法:オブジェクト.defineProperty(o...

WeChatアプレットがログインインターフェースを実装

WeChatアプレットのログインインターフェースは参考までに実装されています。具体的な内容は次のとお...

NginxはURLのパスに応じてアップストリームに動的に転送します

Nginx では、URL のパス パラメータに基づいて、到達不可能なアップストリームに動的に転送する...

mysql 5.7.18 winx64 無料インストール設定方法

1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...