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の関連記事もご覧ください! 以下もご興味があるかもしれません:
|
<<: Docker で Let's Encrypt から永久無料 SSL 証明書を取得する方法
この記事では、WeChatアプレットで星評価を実装するための具体的なコードを参考までに紹介します。具...
目次1. まず最初のリンクを取得する2. ブラウザでこのリンクを開いてください3. アドレスを開くと...
端的に言うと、スクロール可能な要素には非常によくある状況があります。通常、スクロールすると、要素が現...
実行中のコンテナが終了したときに、コンテナが完全に終了する前に環境をクリーンアップするなど、いくつか...
SMIL は、Web にタイミングとメディアの同期のサポートを追加します。 SMIL は、Web に...
1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...
ReactとはReact は、効率的で高速なユーザー インターフェイスを構築するためのシンプルな J...
前回の記事「1行のCSSコードの魅力」では、たった1行のCSSコードで生成できる美しい(奇妙な感じと...
目次親コンポーネントと子コンポーネント間でパラメータを渡すルーティングパラメータステータスの改善コン...
導入yum (Yellow dog Updater, Modified) は、Fedora、RedH...
Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...
カウントスクリプト #!/bin/sh 引数の数=$# [ $numOfArgs -ne 1 ]の場...
1 Tomcatをダウンロードして起動する公式サイト http://tomcat.apache.or...
目次1. はじめに2. データベースをバックアップする3. オリジナルのMysqlをアンインストール...
目次1. Linuxホスト名を設定するクライアントホストを構成するサーバーホストを構成する2. ホス...