バックエンドサービスのパフォーマンス最適化の戦闘章

本論文では、簡単にいくつかの一般的なパフォーマンスの最適化戦略に開発中のバックエンド・サービスについて説明します。

1、コード

最適化されたコードの実装は、特に、いくつかの複雑な不合理達成するために、最初のものです。コードの実装の観点から組み合わせ需要は、より効率的なアルゴリズムやプログラムの実装の使用は、問題を解決した場合、それは最もシンプルかつ効果的です。

2、データベース

データベースの最適化、3つの一般的な領域があります。

1)SQLのチューニング:基本的なSQLの最適化手法を習得するために加えて、遅いSQLのログの使用を説明し、特定の問題を対象に使用する、プロファイルと徐々に調整する他のツール。

2)接続プールのチューニング:現在接続プールの原理と併せて使用される適切な接続プールの効率的な選択を、特定の接続プールの監視データ及び総合判定のための現在のトラフィックは、繰り返しいくつかのデバッグして最終調整を与えますパラメータ。

3)アーキテクチャレベル:別個の読み取りおよび書き込み、水平方向および垂直方向のサブライブラリーサブテーブル等の点でマスターライブラリをロードバランシングを含むが、一般的に大きな変化を必要とする、それが全体的なアーキテクチャから考慮されなければなりません。

3、キャッシュ

分類

ローカルキャッシュ(HashMapの/のConcurrentHashMap、Ehcacheの、RocksDB、グアバキャッシュなど)。

キャッシュサービス(Redisの/ TAIR / Memcacheの、など)。

キーポイントをデザイン

1、キャッシュを更新するとき?信頼性とリアルタイムの更新を確保するには?

具体的な分析は、特定の問題を必要とするキャッシュ戦略を更新します。二つの基本的な更新戦略があります。

1)変更メッセージは、準リアルタイム更新を受信します。

2)有効期限設定した後5分のデータキャッシュの有効期限の各セットにDBをロードDBから復帰します。この戦略は、手動で解決メッセージは、中間更新エラーの問題最初のポリシーおよび障害によって引き起こされる他の問題を受信し、DBは、メッセージではない変更する最初のポリシーに強い補数です。この二重の保険メカニズムでは、効果的に信頼性とリアルタイムのキャッシュされたデータを確認してください。

2、キャッシュがいっぱいになるかどうか、キャッシュが行う方法に満ちているのですか?

キャッシュサービスの場合、理論的には、キャッシュされたデータ数の増加とともに、限られた容量で、キャッシュは確かに一日が満ちています。どのように対処するには?

1)キャッシュサービスには、そのような最も一般的なLRUなどの適切なキャッシュ立ち退きアルゴリズムを選択します。

2)現在設定されているの容量のために、そのようなデータは、8Gに達するキャッシュは、アラームを起動する、または拡張前に問題をトラブルシューティングするために10Gのキャッシュなど、適切な警告値を設定します。

3)、キーのいくつかの長期保存を与える有効期限を設定しようとする必要はありません。

3、キャッシュを許可するかどうかが失われていますか?私たちはどのように行うために失われましたか?

失われた許可するかどうかを判断するためにビジネスシナリオによります。そうでない場合、あなたは、このようなRedisのかTAIRなどの機能をサポートするために永続的なキャッシングサービスを持参する必要があります。例詳細は、失われた時間のためのビジネス許容範囲に応じて、あなたはまた、そのようなRDBやAOFのRedisのような、より具体的な永続化戦略を選択することができます。

キャッシュの問題

1、キャッシュの浸透

       説明:キャッシュとデータキャッシュ浸透手段は、データベースに存在しない、ユーザーが要求を開始していき、そのようなデータIDを開始するようにすることである「-1」データIDが特に大きい、または存在しません。今回は、ユーザーが攻撃者である可能性が高い、攻撃者は、データベースに過度の圧力を引き起こす可能性があります。

      ソリューション:

1)ユーザ認証確認、ID基礎検査、ID <= 0直接傍受として、界面層増大を確認します。

2)、この時間は、キーと値のペアのように書くことができる。キーヌル、キャッシュの有効な時刻が30秒と短く設定することが可能にアクセスすることはできません、データベース内のキャッシュデータから取られていない(とあまりにも長いリード線を設定通常の状況では使用することはできません)。これは、攻撃が繰り返し同じユーザーID暴力的な攻撃を使用しないように。

2キャッシュの内訳

      説明:キャッシュがデータベースには破壊が、既存のデータは、データが読み出されている間、原因特定のユーザに、より複雑なキャッシュを、(典型的には、バッファ時間が経過していない)リードキャッシュではなく、させながら、データベースがデータをフェッチすることを意味しますデータベース圧力上昇が瞬間、過度の圧力が生じます。

      ソリューション:

1)を設定したホットスポットデータが期限切れになることはありません。

2)業界は、比較的一般的な方法は、ミューテックスを使用することで、ミューテックスを追加します。簡単に言えば、つまり、キャッシュミスが(決定が出ヌルである)、それは負荷デシベルにすぐにではなく、運転中にある程度の成功を収めて使用された最初のキャッシュツールは、RedisのSETNXやMemcacheのよう(演算値に戻ったとき操作が正常に戻ったときに、ミューテックスキーを設定して、操作荷重デシベルとバックキャッシュ内に追加)、そうでなければ、あなたは全体のキャッシュ方法を再試行してもらいます。次のコードに似て:

パブリック(キー){文字列GET 
    文字列値 = redis.get(KEY);
     IF(値== NULL){ //はキャッシュの値が期限切れになる表す
         //は、操作が失敗したときに3分デルを防ぐタイムアウトを設定し、次のキャッシュの有効期限が切れていますDBは、負荷しない
        IF(redis.setnx(key_mutex ,. 1、60 3 *)== 1){   // 代表正常に設定 
            値= db.get(KEY); 
                    redis.set(キー、値、expire_secs); 
                    redis.del (key_mutex); 
            }  {   // 他のスレッドに代わって、この時間は、キャッシュに戻っデシベルロードとするために同じ時間を持って、この時間キャッシュされた値は、get再試行でき 
                    SLEEP(50 ); 
                    ;(キー)を取得します   //重试
            } 
        } そうでなければ{
             戻り値。     
        } 
}

3、キャッシュ雪崩

      説明:キャッシュ雪崩は、キャッシュの有効期限に大量のデータを参照し、大量のデータを照会し、過度の圧力も、マシンダウンの原因となるデータベース。そして、キャッシュ内訳は、キャッシュの内訳は、同じデータ、雪崩が期限切れに異なるデータ・キャッシュによって複雑に確認し、異なるデータベースをチェックするために多くのデータを見つけています。

     ソリューション:

1)有効期限キャッシュされたデータは、データの多くは、現象を期限切れと同じ時間を防ぐために、ランダムに設定します。

キャッシュシステムが配備分散された場合2)、ホットスポットデータを均等に異なるキャッシングノードに分配されます。

3)設定したホットデータが期限切れになることはありません。

4、キャッシュの更新

         キャッシュ脇モード:これは、最も一般的なパターンの中で最も一般的です。次のように特定のロジックは次のとおりです。

失敗:、データキャッシュを取り始めるために得ることはありません、データベースから、成功の後、キャッシュにデータをフェッチするアプリケーション。

ヒット:復帰後に採取されたキャッシュからのデータへのアプリケーションアクセスを。

アップデート:データベースにデータを入れて、成功した後、キャッシュの無効化をしましょう。

4、非同期

利用シナリオ

一部のクライアントの要求が、サーバーは、ユーザーがこれらの事を気にしない、またはこれらのものの結果を得るためにすぐに治療を必要としない、実際には、これらの子会社の要求のためにいくつかの余分なことを行う必要があるかもしれません、これは、使用非同期に適していますに対処する方法。

効果

メリットの非同期処理:

1)ユーザーが迅速に要求、より優れたユーザーエクスペリエンスを戻すことができる、インターフェースの応答時間を短縮します。

2)スレッドが実行されている長い避け、それはより多くの要求が処理されないようにすることにより、より一層の要求タスクをブロックし、スレッドプールのタスクキューの長さが増加する原因となる使用可能なスレッドのスレッドプールは、十分な長さが発生します。

3)サービスの処理性能を向上させます。

実装

1、スレッド(スレッドプール)

IOスレッドでその応答を返すために、スレッドプールのスレッドを使用して追加のスレッドを開くかに対処するための対応するタスクよりIOスレッド(プロセス要求応答)で練習を使用します。

非同期スレッドを設計したデータ処理タスクの量が非常に大きい場合、それはさらなる最適化のためのキューのBlockingQueueをブロックに導入することができます。非同期スレッドのグループは、1つまたはサイクル量がそれほどさらに改善するために、バッチ・キューに予め設定されたデータのサイズを取るバッチから、処理すべき輻輳データキューに追加の処理スレッドを追加していくように、これが行われますパフォーマンス。

2、メッセージキュー(MQ)

メッセージキュー(MQ)ミドルウェアサービスを使用して、MQは本質的に非同期です。いくつかの追加のタスクは、処理するシステムが必要ですが、に対処するために、他のシステムを必要としない場合があります。初めてそれを気にするメッセージ配信システムのメッセージング・ミドルウェアにより、信頼性を確保するメッセージ、内部スローメッセージキューにカプセル化など他の対応する処理システムを実行することができます。

5、NoSQLの

そして、キャッシュ差

このセクションでは、DBとして使用することであり、それは(例えばRedisの又はTAIRなど)同一のデータ記憶方式を用いてもよいのNoSQL、ここに提示キャッシュは、同じではないが、使用方法は同じではありません。DBを使用するようならば、効果的なストレージソリューションの必要性は、データの可用性と信頼性を確保します。

利用シナリオ

詳細なビジネスシナリオは、このサービスは、NoSQLのに適したデータの動作モードがように動作するかどうか、またはそれが使用NoSQLのような加減算原子などのいくつかの追加機能を(必要かどうか、のNoSQLが格納使用するのに適したデータに関連するかどうかを確認する必要がありますなど)。

ビジネスは団体のためのデータやその他のデータを必要としない場合、トランザクションは、(などのHBaseなど)の使用のNoSQLのためのより適切なこの時間を必要とするか、外部キーなどをサポートし、非常に頻繁に書き込むことができません。多くの場合、「もう少し読み書き」されているカテゴリのモニタリング、ロギングクラスのシステムは、多くの場合、時系列データの大量の、このようなタイミング仕様のデータ型を収集し、そうでElasticsearch、OpenTSDBとを使用することができます。

図6に示すように、マルチスレッドおよび分散

利用シナリオ

オフライン仕事、非同期タスク、大規模なデータのタスクは、タスクが適切に活用実行に時間がかかり、加速効果を得ることができます。

注:機会のオンライン応答時間の要件、特にスレッドは機会を待つ必要があるサービスのタスクスレッドでは、マルチスレッドの使用を最小限に抑える(これは重大な事故の多くが密接に関連している)、私たちが使用している場合、あなたはサービススレッドを設定することができます最大待機時間。

一般的な方法

スタンドアロンの複雑さを軽減するために、マルチスレッド化アプローチの使用を極力ので、ビジネスの実際のニーズを満たすための能力を処理し、スタンドアローンの場合は、逆に、あなたはマルチマシンマルチスレッドのアプローチを使用する必要があります。

スタンドアロンのマルチスレッドの場合、スレッドプールのメカニズムを導入することができ、役割は2つあり:

1)、パフォーマンスを向上させるスレッドの作成と破壊のオーバーヘッドを保存します。

2)制限、容量の固定スレッドプールに、この値を達成してから入ってくるのタスクを持っているし、マシンを使用している場合極圧保護の下、安定した処理能力をキューにキューを入力する能力は、JDKのスレッドプールが付属して、にしてください常にこれらのパラメータをテストすることにより、最適な調整結果の理解に基づいて各種パラメータのコンストラクタの意味は、そのようなコアプールサイズとして、最大プールサイズ、keepAliveTimeが、労働者のキューなどを慎重に理解し、。

スタンドアロンの処理能力が需要を満たすことができない場合は、この時点では、複数のマシンにマルチスレッドファッションを使用する必要があります。この時間は、それはあなたがそのようなXXL-ジョブとして成熟したオープンソースの分散スケジューリングシステムの数を使用することができ、分散システムのいくつかの知識が必要です。

最適化された7、JVM

メインバックエンドパーソナル言語JAVA、JVMは、ある程度のパフォーマンスJavaプログラムを最適化することができます。JVMは通常、後半のソフトウェア開発では、開発やソフトウェア開発の完了でマイルストーンとして、パラメータが直接JVM JAVAプログラムのパフォーマンスに影響を与えるだろうことができます。

パフォーマンス指標

次のメトリック:CPUの使用率、CPU負荷、GCカウント、GC時間、GCログ

         ビューjavaプロセスのGCステータス:JSTAT -gcutil {PID} 1000年

         ビューのJavaプロセスの高CPUの理由:

1)Javaのプロセスpidを取得します。ps -ef | grepのジャワ

スレッドがあまりにも高稼働率となっている2)分析:トップ-H -p「PID」

3)進スレッドIDに変換される:printfの "%のXを\ n" 'NID'

4)Jstackスレッドスタックの表示:jstack PID |番号はgrep 'NID' -C行-color

1):Javaは2つのツールをお勧めしますショー-BUSY-javaの-スレッド 2)Arthasは

最適化の方向

例えば、JVMのヒープサイズ(XMS、Xmxの)、ガベージコレクション戦略。チューニングJVMレベルに、JVMの実装の原理のいくつかの理解を持っている必要があり、このような構造、GC及び他のタイプのメモリ、などして、アプリケーションの特性に応じて合理的なJVMパラメータを設定するが、GCチューニングの最後のタスクであります行われます。

 

 

参考:

https://tech.meituan.com/2016/12/02/performance-tunning.html

https://blog.csdn.net/qq_42894896/article/details/82256770

https://www.cnblogs.com/java-chen-hao/p/10656304.html

 

おすすめ

転載: www.cnblogs.com/luxiaoxun/p/11755177.html