素早く見つけるために、コードの行を使用する方法、人々の90%がパフォーマンスの問題が発生します[ターン]

人々の90%はすぐに1行のコードを検索する方法、パフォーマンスの問題が発生するのでしょうか?

アリの姉妹REVIEW:で、「パフォーマンスの最適化インタビュアーアリを感動させるために、質問に答えるためにどのように?"、分布は、アプリケーションのパフォーマンスのボトルネックの共通点を導入することで、どのように最初の例外があるかどうかのいくつかの指標の印象。

 

最終的な性能、どのように多くの異常なパフォーマンス指標その1のコアを特定し、パフォーマンスのボトルネック箇所を特定するために:今日、チャイ・クォンは、すなわち、アイデアのいくつかの一般的なチューニング分析を与え、以前に記載された指標の数に基づいて行われますチューニング。全体の記事では、コード、CPU、メモリ、ネットワーク、ディスクなど、組織の方向に応じて、特定のポイントのために最適化されたそれぞれの、システムが容易な移行の練習のアイデアのための「日常」の要約を持つことになります。

 

1.コード関連の
経験のパフォーマンスの問題は、最初にすべき全てのビジネスに関連したコードがいるかどうかチェックすることです-コードを読み取ることによって、問題を解決していないが、コードや伐採によっては、ビジネスコードに関連付けられているいくつかの低レベルのエラーを除外します。 パフォーマンスの最適化のベストポジションは、内部アプリケーションです。
エラーの多くでは、ログの内容は、いくつかのパフォーマンスの問題は、アプリケーション層、層フレームを生成しているかどうかたとえば、ビジネスのログを表示するために、チェック、ほとんどがログから手がかりを見つけることができます(ログレベルが狂ったプレイオンラインジャーナルにつながる、無理な設定) ;また、一般的な問題のいくつかは、主にループ不合理な使用、NPE、正規表現、数学的計算、等のために、単にコードを変更することによって問題を解決することができるように、ロジックコードをチェックしています。
パフォーマンスの最適化とキャッシングの何百、非同期技術、簡単な解決策があるかもしれない複雑な問題にリンクされているJVMのチューニング優れた用語、それはパフォーマンスの最適化里の分野ではまだ有効である「28原則」をお読み入れないでください もちろん、いくつかの基本的な、我々は、ボトルネックポイントのいくつかの思考を最適化するために、CPU、メモリ、JVMなどから問題の分析、分析の思考のプロセスをスピードアップすることができ、「コードがピット上のステップに使用されている」理解するために、それはまた、ここでのコードに反映することができます。
ここではいくつかの高頻度、原因のパフォーマンスの問題への可能性が高いコーディング要素です。
1)このような貪欲としてCPUを(消費正規表現は、)バック注意分割文字列()でReplaceAll()メソッドなどを引き起こす可能性があり、特定の正規表現は、プリコンパイル。
2)低バージョンでString.intern()(Javaの1.6およびそれ以前)がJDKメソッド領域(永久世代)メモリのオーバーフローを引き起こす可能性があります。文字列があまりにも多くの文字列プールが設定されている場合、JDKの高いバージョンでは、小さすぎるキャッシュが大きなパフォーマンスのオーバーヘッドが発生します。
3)出力時に例外ログ、およびスタック情報がクリアされている場合、あなたは詳細な出力スタック例外スタック構造は高価でキャンセルすることができます。注:JITが直接スローにそれを最適化する後に同じ場所がスタック上に多くの情報を投げる繰り返して、プリコンパイルされ、例外の型に一致する、例外スタックは、情報は表示されません。
4)基本的なタイプ間の入力ボックスと入力操作に不要な参照を避け、パフォーマンスに非常に深刻な排水することができ、一貫性のある、自動包装があまりにも頻繁に起こるようにしてみてください。
5)を選択し、ストリームAPIの。複雑で並列処理ストリームAPI推奨それが明示的反復推奨簡単単核である場合に、マルチコアCPU、またはCPUの利点を再生する再生中に、コードは、簡略化することができます。
6)、ThreadPoolExecutor手のスレッドプールが作成したビジネスシーンによると、スレッドおよびタスクのキューサイズの数を指定するさまざまな組み合わせ、およびスレッドの統一もフォローアップのトラブルシューティングを容易にちなんで名付けられた資源の枯渇の危険性を回避します。
7)ビジネスシーンによると、合理的な選択コンカレント・コンテナー。CopyOnWriteArrayListとを使用して、書き込みよりもはるかに大きい読ん;あなたが容器の種類の地図を選択した場合、データ要件の強い一貫性が、使用のHashtableや「地図+ロック」がある場合は少量のデータへのアクセスは、データ要件の強い一貫性がなく、頻繁に変更していない、のConcurrentHashMapの使用、アクセスデータは、大規模な、頻繁に読み込みと書き込み、ない強力なデータ整合性要件、利用ConcurrentSkipListMapのです。
8)ロック最適化のアイデアがあります:ロック(読み書きロック選択)などの保持時間を削減する、ロックの粒度、粗サイクルを使用してロックを減らすために。同時に、代替AtomicLong LongAdderを使用しても、このような統計の整合性などの同時最適化JDKクラスの数を考慮少なく厳しいシナリオでは、代替ランダムThreadLocalRandomなどを使用してカウント。
上記に最適化されたコード層の追加はなく、リストには多くあります。当社は、これらの点で、そこにある、それを観察することができ 、最適化のいくつかの一般的なアイデア など、抽出することができます:
  1. 時間のためのスペース:、キャッシュの使用など、より多くの貴重なCPUやネットワーク、引き換えにメモリやディスクの使用;
  2. 空間時間:CPUの一部を犠牲にすることにより、メモリ又はそのような複数回に大規模なネットワークの伝送のようなネットワークリソース、保存。
  3. こうした並列処理、非同期、電池技術などの他、。
2.関連CPU
、我々はCPUの負荷を心配する必要があり、前に先に述べたが、高いCPU使用率は、一般的に問題ではありません、システムがCPUの負荷が健康的にリソースキーかどうかを決定することである計算されます。
2.1 CPU使用率の高い&&高い平均負荷
このような状況では、実行可能状態にある多数のスレッド、I / Oの少し共通のアプリケーションシナリオがあるCPUリソースを大量に消費するCPU集約型のアプリケーションでは一般的です。
  1. 定期的な操作
  2. 数学
  3. シリアライズ/デシリアライゼーションの
  4. レフレックスアクション
  5. 無限ループまたはサイクルの不当多数
  6. 基礎/サードパーティのコンポーネントの欠陥
一般的なアイデアのトラブルシューティング高CPU使用率: 複数(> 5)印刷スレッドスタック、一般的にjstackによって、より多くのCPUスレッドスタックを消費するように配置することができます。、経時的に図火炎中に、CPU印加プロファイリング又は(または埋込みイベントベースのサンプリング)により、迅速に問題を特定することができます。
可能性は、この時点で(ヤングGC、旧GC、フルGCを含むGCを頻繁に使用があり、もあります )、 また、CPU使用率や負荷が増加する原因になります。トラブルシューティングのアイデア:使用JSTAT -gcutil GC数の連続出力電流の数とアプリケーションの時間。一般的に使用可能なメモリの不足を伴う頻繁な負荷が増大する、とGCリードは、利用可能な空きまたは上のコマンドは、現在のマシンの使用可能なメモリサイズを表示します。
CPU使用率は、それ自体がそれを引き起こし、パフォーマンスのボトルネックのCPUがあるかもしれないかどうか、高すぎますか?また、可能があります。あなたは、vmstatのでCPU使用率の詳細を見ることができます。ユーザーモードCPU使用率(私たちの)高い、この値は、長期の50%よりも大きい場合、それはアプリケーションのパフォーマンスの問題自体のトラブルシューティングに焦点を当てる必要があり、ユーザーモードプロセスが消費よりCPUことを示しています。それは、パフォーマンスの問題やシステムコールカーネルスレッドのトラブルシューティングに焦点を当てる必要がありますので、カーネルモードは、より多くのCPUを取ることを示すカーネルモードのCPU使用率(SY)高いです、。米国+ SY値が80%より大きい場合、そのCPUを示すが不十分であってもよいです。

2.2 CPU使用率が低い&&高い平均負荷である
CPU使用率は、当社のアプリケーションがビジー・コンピューティングではなかったが、他のことを行うことが示され、高くない場合。それがDの状態で残され、すべての後に、プロセスの平均負荷状態のプロセスRとDの状態であり、第一を取り除くために、非常に簡単に理解することがあり、CPUの使用率が低く、高い平均負荷は、I / O集約型のプロセスでは一般的ですプロセスは、(D状態は、ディスクI / O、ネットワークI / Oなどのように、I / Oを待っているために、一般せます)。
:アイデアを確認&&トラブルシューティング 値ことを示し、30%を超える場合、システムリソースの1つの出力タイミングvmstatの使用、観察用%のWA(iowaitの)カラム、カラム識別CPUタイムスライスのディスクI / O待ち時間の割合ディスクI / O深刻待って、これが原因(システム・キャッシュを使用しない)ディスクのランダムアクセスまたは直接ディスク・アクセスの多い可能性があり、ボトルネックディスク自体があるかもしれない、そのような%のWAとして、iostatのか、検証のDSTATの出力と組み合わせることができます( iowaitの)にも問題がディスク読み取りによって引き起こされる可能性があることを示す、読み出し要求を、ディスクの大きな増加を観察しました。
さらに、長いネットワーク要求(すなわち、ネットワークI / O)は、データを取得するためのインタフェースRPCインターフェイスを使用して、そのようなMySQLのスロークエリとして平均CPU負荷を、増加につながります。通常、このような状況は、下流及び中間の埋め込みトレースログポイントが分析された自身の複合アプリケーションの依存関係の調査が必要。
スイッチング周波数2.3 CPUコンテキストが高くなる
コンテキストスイッチvmstatのシステムとの最初のチェック、自発的なコンテキストスイッチ(cswch)と非自発的コンテキストスイッチ(nvcswch)場合pidstat次いで観察プロセス。自発的なコンテキストスイッチ、内部スレッド状態変換のアプリケーションが原因の、例えば、コール睡眠()、ジョイン()、発生するための待機() メソッドを等、または同期またはロックされたロック構造を用いて、不随意のコンテキストスイッチ、スレッドが原因であるので割り当てられたタイムスライスが消耗しているか、実行優先度スケジューラのスケジュールに起因しています。
資源獲得待ちがあることを自主的なコンテキストスイッチの数が多い、CPU手段場合は、より少ないI / O、メモリおよびその他のシステムリソースよりも、と言います。非自発的コンテキストが原因で激しい競争のCPUタイムスライスにつながるアプリケーション内のスレッドの可能な過剰な数の倍高いが、切り替えた場合、システムが頻繁にjstackと数の分布状態のスレッド数裏付けさを組み合わせることができる。この時点で、スケジュールに強制されます。

3.関連するメモリは
、以前、メモリは私たちが遭遇した、一般的なメモリの問題は、(Javaアプリケーション・プロセスを含む)、システムメモリとプロセスのメモリに分割されており、大半がプロセスメモリに落ちるのシステムリソースのボトルネックを述べた比較的小さな占め引き起こしました。Javaプロセスのために、それは二つの問題にメモリ管理自動化ソリューションが付属しています:オブジェクトとどのようにガベージコレクション機構の中核であるオブジェクトに割り当てられたメモリを再利用するためのメモリを割り当てる方法。
ガベージコレクションは、効果的にメモリの有効利用を確保するために、メモリリークを防ぐことができますが、それはまだメモリの問題の範囲をもたらす万能薬で、不合理なパラメータの設定とコード・ロジック、ありませんが。また、早期のガベージコレクタ、及び機能回復効率のGCチューニングパラメータ、経験豊富な開発者に依存して非常に多く、非常に良いではありません。例えば、最大ヒープメモリはヒープオーバーフローまたはヒープショックおよび他の問題につながる可能性があり、適切に設定されていません。
アイデアの分析いくつかの一般的なメモリの問題で見てみましょう。
3.1不十分なシステムメモリ
のJavaアプリケーションは、典型的には、単一のメモリや水位監視クラスタ、スタンドアロンのメモリ使用率95%を超える場合、または80%よりもメモリの使用率以上のクラスタを持っている、それはそのメモリは潜在的な問題(注かもしれません意味:ここにメモリ・レベルのシステム・メモリ)。
もっと極端な場合、一般的なシステムメモリの一部に加えて、高確率は、Javaアプリケーションによって引き起こされます。トップコマンドを使用する場合、我々はRESのプロセスを使用した永久的なメモリを表し、Javaアプリケーションプロセスの実際のメモリフットプリントを見ることができ、VIRTは、仮想メモリの使用プロセスとの関係を示す、メモリサイズがある:実際に使用VIRT> RES> Javaアプリケーションヒープサイズ。次のようにヒープメモリ、Javaプロセス全体のメモリフットプリント、ならびに方法面積/素子空間、JITキャッシュおよび他の主要成分に加えて:
Javaアプリケーションのメモリフットプリント=ヒープ(ヒープ)+コードキャッシュ(コードキャッシュ領域)+メタスペース(要素スペース)+シンボルテーブル(シンボルテーブル)+スレッドスタック(スレッドのスタック領域)+ダイレクトバッファ(ヒープメモリ外)+ JVM構造マップファイル(メモリマップドファイル)+ネイティブライブラリ(ローカルライブラリ)+ ... +(いくつかの他のJVM自体によって占められる)
Javaプロセスのメモリー・フットプリントは、あなたは、出力電流の指標がヒープメモリを取得することができます参照してくださいJSTAT -gcコマンドを使用することができます地区、元のスペースの使用。ヒープ外部メモリと使用統計は、あなたは、NMT(HotSpot VMのネイティブメモリの追跡、使用することができます Java8が導入された)の取得を。スレッドスタックメモリが遅延読み込みモデルを使用していますが、使用するスレッドのスタックメモリ空間を簡単にすることができます、直接メモリを割り当てるために+ XSSのサイズを使用しませんが、あまりにも多くのスレッドが不要なメモリフットプリントにつながることができ、無視することができますこのスクリプトjstackmem全体的な統計スレッドが占有使用。
不足しているシステムメモリのトラブルシューティングのアイデア:
  1. 特定のメモリ使用量とメモリの増加傾向を参照してくださいまず、利用可能な空きメモリ空間の現在の使用を確認し、vmstatのを使用して、この段階では、一般的に最も高価なメモリプロセスとして位置付けています。
  2. 分析キャッシュ/メモリ使用量をバッファリングします。この値が少しずつ変更された場合、それは無視することができます。キャッシュが認められた場合は/バッファサイズが上昇を続け、それが使用pcstatすることができ、cachetop、他のツールをslabtop、特定の職業のキャッシュ/バッファを分析します。
  3. 除外キャッシュ効果の後/システムメモリのバッファが見つかった場合、メモリはまだメモリリークの可能性が高いがあることを示す、成長しています。
3.2 Javaのメモリオーバーフロー
メモリのオーバーフローは、新しいオブジェクトインスタンスのアプリケーション、ヒープ内の利用可能な空間よりも大きい必要なメモリ空間を指します。メモリオーバーフローのタイプは、より一般的なキーワードは、OutOfMemoryErrorのエラーログが表示されます。 メモリ・オーバーフローの一般的なタイプやアイデアを分析し、以下のとおりです。
1)java.lang.OutOfMemoryErrorを:Javaのヒープスペースを。理由:ヒープ(古いものと新しい世代の)はオブジェクトを割り当てるし続けることができない、いくつかのオブジェクト参照が長い発売されていない開催されている、ガベージコレクタはリサイクルできない、GCで回収されていないファイナライザオブジェクトを大量に使用そして他のサイクル。ないメモリリークが好適ヒープメモリを増加させることによって得ることが確認された場合にヒープオーバーフローは、一般に、メモリリークに起因しています。
2)java.lang.OutOfMemoryErrorを:GCオーバーヘッド制限を超え 。理由:ガベージコレクタガベージコレクションに時間の98%以上が、リカバリヒープメモリの2%未満、そこに一般的にメモリリークであるか、ヒープスペースが小さすぎるため。
3)java.lang.OutOfMemoryErrorを:メタスペースやjava.lang.OutOfMemoryErrorを:PermGenスペース。アイデアのトラブルシューティング:文字列定数の多くはプールかどうかを永久/次元空間に代わって、動的クラスローディングのためのチェックではなく、アンインストールすることはなかったが小さすぎるというように設定されています。
4)java.lang.OutOfMemoryErrorを:新しい作成することができませんでしネイティブスレッドを。理由:スタック領域の拡大に仮想マシンは、十分なメモリ空間に適用することはできません。各スレッドのスタックアプリケーションとスレッドの数の全体的なサイズを減少させるために適切であり得ます。また、プロセス/スレッドの作成システムの全体的なシステムはまた、空きメモリおよびオペレーティングシステムの合計数を制限して、慎重に確認してください。注:あまりにも深いメソッド呼び出しレベルによるものであり、このスタックオーバーフロー、とにStackOverflowError異なるが、スタックに割り当てられたメモリは十分な新しいスタックフレームのリードではありません。
また、そこにスワップパーティションのオーバーフロー、ネイティブメソッドスタックオーバーフロー、オーバーフローのOutOfMemoryErrorアレイ割り当てタイプ、それは非常に一般的ではないので、導入していません。
3.3 Javaのメモリがリーク
するJavaメモリリークは、開発者の悪夢、メモリリークおよびメモリオーバーフローが簡単、粗である、異なるということができる、サイトが比較的容易見つけることです。メモリリークのパフォーマンスは以下のとおりです。いくつかの時間のために実行中のアプリケーション、より多くの高いメモリ使用率、よりゆっくりと応答、で最高潮に達するプロセスまで、「仮死。」
Javaのメモリリークがように十分なシステムに使用可能なメモリ、仮死状態のプロセス、OOMとを引き起こす可能性があり、 調査はもう次の二つのアイデアよりませんでした:
  1. 周期的な統計ヒープオブジェクト、オブジェクトの位置の数と成長の大きさによってjmapの出力。
  2. 使用プロファイラツールアプリケーションプロファイリング、メモリ割り当てのホットスポットを探します。

ヒープが成長し続けると加えて、いくつかの分析を行うために、バックのスナップショットに基づいて、ヒープメモリのスナップショットをダンプ提案しました。が、スナップショットは瞬時値ですが、また、いくつかの意味を持ちます。
ガベージコレクションに関連3.4
指標のGC(ガベージコレクション、以下同じ)は、Javaプロセスのメモリ使用量健康かどうかを測定するための重要な基準です。ガベージコレクションコア指標:周波数と数(MinorGCとMajorGC含む)GC一時停止、ならびにそれぞれの詳細については、前者がGCログを分析する必要JSTATツールによって直接得ることができ、メモリを回収します。そのようなCMSのガベージコレクタのための注意、jstatは出力列FGC / FGCTは歳のガベージコレクションの数を表し、そのGC一時停止(すなわちストップ世界)の出現、あらゆる歳のガベージコレクションこの値は2ストップ-世界の舞台をマークし、再初期マーキング(2によって増加されます、この統計は2になります
GCのチューニングの必要性は?それは、このような応答時間など、アプリケーションの状況に依存する場合要件、要件、経験といくつかのシステムリソースの制約:. GC大幅な周波数の増加と時間のかかるが、ポーズGC平均時間等の500ms、1分未満の全GCの実行頻度を超え、満たすためにいくつかの機能が説明GC上記の場合のスループットGCはチューンアップする必要があります。
ガベージコレクタ異なる用途の幅広いので、チューニング戦略も多少異なっている、 ので、ここでGCのチューニングのいくつかの一般的な戦略です。
1)適切なGCコレクタを選択します。 遅延、スループットの用途に応じて、ガベージコレクタ、合理的な選択のそれぞれの特性。G1は、CMSのガベージコレクタを交換することが推奨され、G1の性能は徐々に8GBのメモリに最適化され、次のマシンは、様々な面での性能も追いつき、さらにはトレンドを超えてしなければなりません。G1パラメータ調整より便利に、CMSガベージコレクタのパラメータがあまりにも複雑でありそうなスペース、このような問題の高いCPU消費の原因の断片化のために、それは捨てられた状態で、現在もされている間。Javaの11年間ZGCは、新しいガベージコレクタを導入し、基本的な並行マークと完全復旧段階を行うために使用することができ、それは待つ価値があります。
2)合理的なヒープメモリサイズ。 ヒープサイズが大きすぎる設定しないでください、排出される回避システムメモリへのシステムメモリの75%を超えないことをお勧めします。最大ヒープ・サイズと一致すると避けヒープショック初期ヒープのサイズ。我々は、新世代の割合と古い時代、新世代の割合エデンエリア内やサバイバーエリア、これらを含め、新世代のサイズ変更には、周波数と時間のかかる、多くの時間を調整GC、より重要なの新しい世代のサイズを設定します。セットはまた、全体のプロセスを検討する必要がある、またはそれ以上のものを、オブジェクトの高齢者世代のプロモーションの比率を考慮する必要があります。たくさんでこの1の大きさを考慮するあなたはG1のガベージコレクタを使用している場合は、何か新世代のニーズ少ない適応戦略は、すべてリサイクルコレクション(CSET)を決定します。新世代のGCチューニングのコアの調整、経験に大きく依存しているが、一般に、小さな(または領域とサバイバー構成不合理エデン)、ヤングGC長い時間は、新生児意味の新世代を意味ヤングGC高周波、世代が大きすぎ、実質的に二方向違いはありません。
3)フルGCの頻度を減少させます。 [フルGC年が古いまたはGC頻繁場合は、そのオブジェクトがダンプメモリのスナップショットで分析し、長期保有者、一般的に問題を迅速に見つけることができますことを引き起こして、メモリリークである可能性が高いです。また、頻繁にオブジェクトにつながる新世代や不適切な古い時代の割合は、古い時代に直接割り当てられているが、また、フルGCが発生することがあり、今回はビジネスコードとメモリのスナップショットの包括的な分析の組み合わせを必要とします。また、私たちはこのような構成の-XXとしてチューニングGCの利点に必要な重要な情報の多くを得るのを助けることができGCパラメータの設定によって:+ PrintGCApplicationStoppedTime-XX:+ PrintSafepointStatistics-XX:それぞれ+ PrintTenuringDistributionを、GC一時停止の分布、時間のかかるセキュリティのポイントを得ることができ-XXと統計、ターゲットプロモーション情報の年齢分布、:+ PrintFlagsFinalは、私たちは力の最後のGCパラメータを知っているとようにすることができます。

 

4.ディスクI / O、ネットワークI / O
のアイデアをトラブルシューティング4.1ディスクI / O:
  1. ディスク関連指標を出力するツールの出力を使用して、一般的に使用される%のWA(iowaitの)は、ディスクI / O入力、UTIL%が重いI / O動作を示し、異常は、この指標utilのより高い%として、存在するか否かに応じて決定されます;
  2. pidstatターゲット特定処理、データのサイズと次の読み取りまたは書き込みの速度に焦点を使用します。
  3. +プロセスID lsofを使用すると、例外処理は、一般的にソースをターゲットに、ビジネス・コードと一緒に、(ディレクトリ、ブロックデバイス、動的ライブラリ、ネットワークソケット、等を含む)ファイルのリストを表示するために開くことができるI / O、および必要に応じて特定の分析、等、ツールトレースI / O源を位置決めPERF使用することができます。
アプリケーションプロセスのこの時点であれば、I / O操作が占有CPU時間を表し%のWA(iowaitの)が値のパーセンテージである、必ずしも増加したディスクI / Oボトルネックを意味するわけではありませんが、注目すべきです主な活動は、それが正常である、I / Oです。
4.2ネットワークI / Oボトルネック、考えられる理由としては以下のとおりです。
  1. 転送先は、GCが頻繁ながら、それは、要求に対する遅い応答をもたらすことができる、多すぎます。

  2. ネットワークI / Oモデルの選択は、応答時間が長い低い全体的なQPSのアプリケーションで、その結果、不合理です。

  3. RPCは、スレッドプールは無理設定を呼び出します。jstackスレッドの数の統計的分布を使用して、以上のスレッドのTIMED_WAITING待ち状態であれば、あなたが集中する必要があります。例:データベース接続プールは、スレッドスタックに反映され、十分ではないスレッドロック接続プール内の競争がたくさんあります。

  4. タイムアウトRPCコール不合理な、より多くの要求が得られませんでした。

Javaのスレッドのスタックのスナップショット・アプリケーションは、スレッドプールの構成無理上記に加えて、問題をトラブルシューティングするために有用であり、例えばCPUのようないくつかの他のシナリオでは、最初のスレッドのスタックを開始することができ、高い、遅い応答および他のアプリケーションを、急増しました。


便利なコマンドライン5は、
このセクションでは、迅速な位置決めのためのコマンドを配置するパフォーマンスの問題の数を示します。
1)現在のネットワーク接続システムを表示
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
2)オブジェクトトップ50の分布におけるヒープをチェック()メモリリークを探し
jmap –histo:live $pid | sort-n -r -k2 | head-n 50
CPU /メモリの使用の上面10に記載されている3)工程
#内存ps axo %mem,pid,euser,cmd | sort -nr | head -10#CPUps -aeo pcpu,user,pid,cmd | sort -nr | head -10
4)全体的なシステムとアイドルCPU使用率を示し
grep "cpu " /proc/stat | awk -F ' ' '{total = $2 + $3 + $4 + $5} END {print "idle \t used\n" $5*100/total "% " $2*100/total "%"}'

5)を押してスレッド状態の統計(強化版)のスレッド
jstack $pid | grep java.lang.Thread.State:|sort|uniq -c | awk '{sum+=$1; split($0,a,":");gsub(/^[ \t]+|[ \t]+$/, "", a[2]);printf "%s: %s\n", a[2], $1}; END {printf "TOTAL: %s",sum}';

 

6)ほとんどのCPUのを消費しているマシンのTop10スレッドスタック情報を確認してください

すぐにCPUが自動的にJavaプロセスが消費を実行している多くのスレッドを検出し、JavaのCPUのパフォーマンスの問題(最高すぎたち)のトラブルシューティングに使用することができますショービジーのjava-スレッドスクリプトの使用を推奨し、そのスレッドを印刷スクリプトを呼び出して、パフォーマンスの問題の原因を特定するための方法スタックはアリオンライン運用・保守環境を利用されています。リンクアドレスします。https://github.com/oldratlee/useful-scripts/。
7)難図発生(PERF、PERFマップエージェントに必要 FlameGraph これら三つの項目):
# 1. 收集应用运行时的堆栈和符号表信息(采样时间30秒,每秒99个事件);sudo perf record -F 99 -p $pid -g -- sleep 30; ./jmaps
# 2. 使用 perf script 生成分析结果,生成的 flamegraph.svg 文件就是火焰图。sudo perf script | ./pkgsplit-perf.pl | grep java | ./flamegraph.pl > flamegraph.svg
スワップパーティションの使用の上面10に記載されている8)プロセス
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head -10
9)JVMのメモリ使用量とガベージコレクション状態の統計情報
#显示最后一次或当前正在发生的垃圾收集的诱发原因jstat -gccause $pid
#显示各个代的容量及使用情况jstat -gccapacity $pid
#显示新生代容量及使用情况jstat -gcnewcapacity $pid
#显示老年代容量jstat -gcoldcapacity $pid
#显示垃圾收集信息(间隔1秒持续输出)jstat -gcutil $pid 1000
10)他のいくつかの毎日のコマンド
# 快速杀死所有的 java 进程ps aux | grep java | awk '{ print $2 }' | xargs kill -9
# 查找/目录下占用磁盘空间最大的top10文件find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 10

6.まとめ

パフォーマンスの最適化は大きなフィールドであり、どんな小さな点があります、詳しく説明する記事の数十に拡張することができます。アプリケーション・パフォーマンスの最適化に加えて、上記-、並びにフロント最適化、最適化アーキテクチャ(分散キャッシュ使用、等)、データ・ストレージの最適化、および(例えば、設計の最適化モードとして)コードの最適化の終わりとして、または、ここで、限られたスペースに限定されるような、一つ一つを開始し、この記事の内容は、単なる刺激として機能を果たしていませんでした。同時に、この記事のようなものは、私の経験と知識のいくつかは、必ずしもすべての権利、私はあなたが正しいとサプリメントを願っています。
パフォーマンスの最適化は、我々は常に自分自身のチューニング方法論を形成するために、改善するための学習、実際の戦闘経験に統合され、学習ツール、絶えず練習する必要があり、総合的な作品です。
また、パフォーマンスの最適化が重要ですが、早すぎる最適化にあまりにも多くの努力を入れて(もちろん、デザインの構造を改善し、コーディングが必要です)されていないが、時期尚早の最適化は諸悪の根源です。一方では、作業の最適化は急速にビジネスニーズの変化には適用されない場合があり、事前に行うために、実際に新たな要件に、新機能を妨害する役割を果たした。一方で、時期尚早の最適化は、使用量の削減、アプリケーションの複雑さが増加しますメンテナンス性。、最適化されたどの程度に最適化された場合には、マルチパーティのトレードオフの命題の必要性です。
参考文献:[1] https://github.com/superhj1987/awesome-scripts [2] https://github.com/jvm-profiling-tools/perf-map-agent ??
        [3] HTTPS:// github.com/brendangregg/FlameGraph?
     [4]  https://github.com/apangin/jstackmem/blob/master/jstackmem.py

おすすめ

転載: www.cnblogs.com/lyhero11/p/11974636.html