MySQLの仕組み-実行中のMySQLスレッドを理解する

記事のディレクトリ

テキスト

    1秒あたりのクエリ数(1秒あたりのクエリ数、QPS)はデータベースのスループットを測定できますが、MySQLの作業強度を反映することはできません。後者はThreads_runningによって測定され、スケールとして表されます(QPSはレートです)。Threads_runningについて説明する前に、例えを考えてみましょう。上
ここに画像の説明を挿入します
    の写真は、車のデジタルダッシュボードです。左側の大きな円はスピードメーターで、右側の大きな円はタコメーターです。スピードメーターはほとんどの人によく知られています:彼らは車の速度を示します。上記の速度計は84km / hを示しています。タコメータは一般的ですが、すべてのダッシュボードにタコメータが含まれているわけではありません。これらは、エンジンの動作強度を1分あたりの回転数(RPM)で示しています。上記では、タコメーターは3,000RPM近くを読み取ります。(タコメーターの中央にある「M3」はギアボックスギアです。これは無視できます)
    QPSは速度(84 km / h)に似ており、Threads_runningはRPM(〜3k RPM)に似ています。
    速度とRPMの変化は、加速と減速、上り坂または下り坂、向かい風または向かい風、および(ますます多くの新車では)燃費を最適化するためのコンピュータープログラミングなど、多くの要因の影響を受けます。したがって、異なる速度で同じ速度に到達することができますが、通常、車は低速でより少ない燃料を燃焼し、より高速でより多くの燃料を燃焼します。同様に、RPMが高いほどエンジンへのストレスが大きくなり、機械的な故障の可能性が高くなります。どちらも私たちにお金がかかるので、私たちは燃料の燃焼と機械的故障を気にします。これが、車にタコメーターが装備されている理由です。RPMは重要な指標です。
    QPSとThreads_runningも、ハードウェア仕様(CPUコアと速度、ストレージタイプとIOPなど)、クエリタイプ(読み取りまたは書き込み)、クエリプラン、テーブルサイズ、行サイズ、テーブルモード(列)などの多くの要因により大きく異なります。タイプ、インデックス-特にインデックス)、データアクセスモード(完全読み取りまたは完全書き込みまたは混合)、「ノイズの多いネイバー」、時刻(営業時間など)、時刻(税シーズンなど)、特別プロモーション、ひどい俳優、待ってください-あなたが望むものは何でも!したがって、車のように、同じQPSを異なるThreads_runningに実装できるため、これは重要な指標です。
    Threads_runningは、MySQLの作業強度を表します私が取り組んでいるいくつかのデータベースは、10スレッドだけを実行することで10,000QPSを完了することができます。他の人は、3,000QPSに達するために100スレッドを実行する必要があります。前の段落から、理由がわかります。さまざまな変化の要因です。
    QPSだけでは、MySQLがシステムに圧力をかけているのか、視覚的に言えば、システムが石油を燃焼し始めて機能を停止しているのかを知ることはできません。
動作中の高いThreads_runningを監視および処理することが重要です。タコメーターには最大値があり、通常は車を押し出すことはできませんが、MySQLは非常に野心的です。最大値はなく、必要な数のスレッドを実行します。試行しますが、Threads_runningが増加すると速度が低下し、最終的に失敗します。

Threads_running MySQL
0〜10 通常:ほとんどすべてのハードウェアは問題ありません
10-30 ビジー:サーバーはマルチコアであるため、ほとんどのハードウェアは通常問題ありません
30〜50 高:非常に多くのスレッドを実行する必要のあるワークロードはほとんどありません。短期(<5分)でバーストする可能性がありますが、期間が長い場合、応答時間は非常に遅くなる可能性があります
50-100 過負荷:一部のハードウェアはこの問題を処理できますが、この範囲内で正常に実行されるとは期待できません。ローカルに展開されたハードウェアの場合、通常、この範囲(<5秒)内の瞬間的なバーストは問題ありません。
> 100 失敗:まれに、MySQLは100を超えるスレッドを実行できますが、この範囲内で失敗する可能性があります

    推奨ガイダンス値:

  • Threads_running <50
  • 1:1000 Threads_running:QPS

    別の角度から重要な質問を明確にしましょう。MySQLスレッドはデータベース接続です。Threads_runningは、アクティブなクエリのデータベース接続の数です。各アプリケーションインスタンスには独自のデータベース接続プールがあることを覚えておくことが重要です。したがって、可能な最大の接続(スレッド)は次のとおりです。

Max Connections = App 实例数 * 数据库连接池大小

    接続プールのサイズは100が妥当ですが、アプリケーションが5つのアプリケーションインスタンスにデプロイされている場合、500のデータベース接続が存在する可能性があります。これは通常の場合です。アプリケーションには通常、接続プールの目的である何百もの無料のデータベース接続があります。(MySQLにはスレッドを接続するための標準もあります)これは、同時に実行されている接続(スレッド)が多すぎるまで問題になります。
    アプリケーションは、より多くのリクエストを処理するために複数回拡張されます(つまり、より多くのアプリケーションインスタンスがデプロイされます)が、そうするとデータベースが過負荷になり、実行されるスレッドが多すぎます。このタイプのデータベースパフォーマンスの制限を解決するための迅速で簡単な解決策はありません。理由は単純です。MySQLでより多くのジョブ(クエリ)を同時に(1秒あたり)実行する場合は、各ジョブにかかる時間が短くなります。そうしないと、計算を実行できません。各クエリに100ミリ秒かかる場合、実行速度は10QPSを超えることはできません。「ああ、でももっとCPUコアを使うとどうなる?」とあなたは尋ねます
    。別のCPUコアを使用するということは、別のスレッドを実行することを意味します。現在、50スレッドを実行するという下限に向かって急速に進んでいます。しかし、これはまさにMySQLがやろうとしていることです。前述のように、MySQLは非常に野心的です。Threads_runningの最大値を設定せず、必要な数のスレッドを実行します。QPSの上限(存在する場合)は非常に高く、Threads_runningの上限は非常に低くなっています。なんでこんな感じ?
    50スレッドを実行することは妥当な要件です。2020年までに、1,000のスレッドでさえ実行されるはずです。この質問に別の質問で答えさせてください:なぜトヨタはフェラーリのスピードとパワーを持っていないのですか?トヨタの最高速度は200km / h、フェラーリの最高速度は340km / hです。なぜトヨタはもっと速く走れないのですか?MySQLが速くならないのはなぜですか?
    両方の答えは、プロジェクトの細部にあります。たとえば、フェラーリは非常に強力なエンジンを搭載しているため、非常に高速に動作しますが、これだけに集中することはできません。この車の細部は、パワーを損なうことなくパワーを提供するように設計されています。たとえば、飛行機は258 km / hの速度で離陸して飛行できるため、体の空気力学によって地上に保持されない限り、340 km / hの速度のフェラーリは飛行できます。このように設計されている場合、トヨタは時速340キロメートルの速度に達することができ、MySQLは1,000スレッドを実行できます。
    トヨタと同様に、MySQLは十分に構築され、信頼性が高く、ニーズを超えていますが、MySQLまたはその周辺のハードウェア、オペレーティングシステム、およびアプリケーションは、フェラーリになるようには設計されていません。
    実際の経験では、MySQLは50を超えるスレッドを実行しているほとんどのアプリケーションでうまく機能しないことが示されています。早くも2014年に、MySQLの専門家であるAlexeyStraganovがMySQL5.6でベンチマークテストを実施し、テスト実行のThreads_runningは非常に高かった:Perconaサーバー:Perconaスレッドプールでスケーラビリティを向上させる64スレッドを実行すると、パフォーマンスがピークに達します。これらは実験結果であり、実際のアプリケーションクエリは合成ベンチマーククエリよりも困難です。
    解決?シャーディングによってデータベースを拡張します。しかし、これは別の長いトピックです。
    ポジティブな結末で終わりましょう。Vadim Tkachenkoは、おそらく世界で最も優れたMySQLパフォーマンスの専門家です。彼は最近、100,000スレッドの操作に気づきました。MySQLチャレンジ:100k接続

参照文書

[1] Daniel Nichter.MySQLスレッドの実行MySQLの動作はどの程度ですか?[EB / OL] .https://hackmysql.com/post/mysql-threads-running-how-hard-is-mysql-working/,2020- 04-25。
[2] OracleCorporation.Serverステータス変数[EB / OL] .https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html,2021-01-01。

おすすめ

転載: blog.csdn.net/zsx0728/article/details/114536258