秒殺ノート-パフォーマンスの最適化

4898 ワード

文書ディレクトリ
  • 秒殺ノート-性能最適化
  • 性能に影響する要因
  • 応答時間とQPSの関係
  • スレッド数のQPSへの影響
  • サーバパフォーマンス向上キー
  • ボトルネック
  • の発見方法
  • CPU診断方式
  • CPUがボトルネックかどうかをどう判断しますか?
  • システム
  • の最適化方法
  • 減少符号
  • シーケンス化
  • を削減
  • Java極致最適化
  • 同時読み取り最適化
  • まとめ
  • 秒殺ノート-パフォーマンスの最適化
    パフォーマンスに影響する要因
    まず「パフォーマンス」とは何かを認識し、 , , :CPU 、 IOPS(Input/Output Operations Per Second, )。 “ ” —— QPS(Query Per Second, ) , QPS , (Response Time, RT), 。通常、応答時間(RT)が短いほど、1秒で処理される要求数(QPS)が多くなり、単一スレッド処理の場合は線形関係、すなわち , 。に見える , , 。 “ QPS = (1000ms / ) x ”, , , 。
    では、この2つの要素はどのような影響を及ぼすのでしょうか.
    応答時間とQPSの関係
    ほとんどのWEBシステムでは CPU ( RPC、IO 、Sleep、Wait ) , , CPU , 。 CPU , ,CPU 。 CPU , QPS。 , CPU 。
    スレッド数がQPSに与える影響
    しかし、「総QPS」計算式を見ると、スレッドが多ければ多いほどQPSも高くなると思います. ! , , , , 。はスレッド切替(完備されるべき)の大部分のマルチスレッドシーンのデフォルト構成を認識しています.“ = 2 * CPU + 1 ”です.上記の通常の式のほか、ベストプラクティスで得られた式もあります. = [( + CPU ) / CPU ] X CPU はそれ以外に、性能テストを通じて実際の業務と会社の設備に最も合致する式を押し出します.
    サーバのパフォーマンスを向上させるキー
    サーバのパフォーマンスを向上させる方法1. CPU 2.
    ボトルネックの検出方法
    サーバのパフォーマンスを向上させる方法を知っていますが、システムのボトルネックをどのように発見しますか?サーバにとって、 , CPU、 、 。の異なるシステムはボトルネックに対する注目点も異なり、例えばキャッシュシステムはメモリに注目し、ストレージ型システムI/Oはボトルネックになりやすい. , CPU 。
    CPU診断方式
    しんだんほうしき
    説明
    ツールJProfiler / Yourkit(要求の各関数CPU実行時間をリストすることができ、どの関数がCPU時間を最も多く消費するかを発見することができる)jstack
    呼び出しスタックは、特定の関数呼び出しが頻繁であるか、時間がかかる場合にシステム呼び出しスタックに表示されます. , CPU , , ( , )
    CPUがボトルネックかどうかをどう判断しますか?
    QPSが限界に達した場合、サーバーCPUの使用率は95%を超えているか、ない場合、CPUにはアップグレードスペースがあり、ロック制限があるか、ローカルI/Oの発生待ちが多すぎるかのいずれかである.JProfiler使用(未整備)
    システムの最適化方法
    げんすいコーディング
    Java符号化の実行速度は遅く(言語の欠点)、文字列操作(例えば入出力操作、I/O操作)はCPUリソースを消費し、ディスクI/OでもネットワークI/Oでも文字をバイトに変換する必要があり、この変換は符号化しなければならない.
    各文字符号化には、ルックアップテーブル( )が必要であり、リソースが非常に消費されるため、 、 。 。コードを減らす方法 , OutputStream() , 。 ( resp.getOutputStream() )。『Java Web技術の内幕を深く分析する』第17章-Velocity最適化実践を拡張し、 , , , 。シーケンス化の削減
    Javaでのシーケンス化を減らすことで、パフォーマンスも向上します.また、シーケンス化と符号化は通常同時に発生するため、シーケンス化を減少させることは符号化を減少させる.
    シーケンス化はRPCでシーンが発生することが多いため、RPCを減らすことはシーケンス化を減らすことであり、 “ ”, RPC, 。は2つの異なるマシンで使用されていた異なるアプリケーションを1台のマシンに統合し、同じTomcatコンテナに配置し、本マシンのSocketを歩くことができない.シーケンス化を回避できます.
    Javaの最適化
    Javaは、NginxやApacheサーバなどの汎用Webサーバと比較して、大きな同時HTTPリクエストを処理する際に弱いため、大トラフィックのWebシステムは静的な話改造を行い、Javaは少量のデータの動的リクエストを処理するだけである.Java最適化の手段を採用することができる:
  • サーブレットを直接使用することで、従来のMVCフレームワークの使用を回避し、複雑で役に立たない処理ロジックの山を回避することができます.
  • 直接出力ストリームデータ resp.getOutputStream() resp.getWriter() , , ; JSON ( ) なぜJSONを使用してデータを転送するのですか?
  • 同時読み取り最適化
    同時読み取り最適化の最初の時間は、Tair内のキャッシュに入れることを考えています. Hash, Key 。 Tairキャッシュの構築と実戦(完備を待つ) 30W/S , “ ” , : LoadCache, 。
    データのキャッシュ方法
  • 静的データ商品における「タイトル」、「説明」が変わらないデータ、;
  • 動的データ在庫のような動的データは、 “ ” ( )で、失効した後、キャッシュに行って最新のデータを引き出します.

  • 疑問:在庫という頻繁に更新されるデータは、データが一致しないと、超過販売になるのではないでしょうか.
    質疑応答: を参考にして、「読む」シーンは一定の汚れたデータを許可し、誤審は少量のもともと在庫のない注文要求が在庫があると誤認するだけで、 まで待って最終的な一致性を保証し、高可用性と一致性の間からバランスを取って、高同時データの問題を解決する.
    まとめ
  • ショートプレート発見
  • ( :C=30 / ; :V=C/1.5=20 / )
  • ネットワーク速度制限(帯域幅、伝送速度、現在の権威データに基づいて計算可能)
  • ネットワーク構造(スイッチ/NIC制限)
  • TCP/IP
  • 仮想マシン(メモリ/CPU/IOなどのリソースの制限)
  • およびアプリケーション自体のボトルネック
  • データ削減
  • サービス側がデータを処理する場合、文字とバイトの相互変換(RPC)
  • は避けられない.
  • HTTPはGzip圧縮を要求し、ネットワーク伝送に時間がかかり、これらはすべてデータサイズと関係がある
  • である.
  • データ階層
  • は、最初の画面が
  • であることを保証する.
  • 重要情報は先
  • である.
  • 二次情報は非同期で
  • をロードする.
  • 中間段階を減らす
  • 文字からバイトへの変換を減らす
  • 前処理(文字からバイトへの変換を繰り上げる)
  • を追加する.
  • 削除操作不要
  • ベースライン構築
  • ベースライン
  • を適用
  • パフォーマンスベースライン(パフォーマンスが突然低下するタイミング)
  • コストベースライン(何台の機械を使ったか)
  • リンクベースライン(システムがどのように変化するか)