オンライン メモリ オーバーフローの問題のトラブルシューティング プロセスを思い出してください - 高可用性

起因

私が担当しているAPPプロジェクトシステムは、略してシステムAと呼ばれています。他のプロジェクトの T システムが同じサーバー上にない場合、T システムの再起動により A システムの同時実行性が急激に増加し、最終的に A システムのメモリ オーバーフローが発生することが判明しました。電話を切る。

トラブルシューティング

1.サーバーログを確認する

XShell6ツールを使用して、システムサービスログの表示、ログのダウンロード、サーバダウン時の異常確認を行いますが、
ここに画像の説明を挿入
異常情報には具体的なインターフェースや方法が無いため、ヒープダンプファイルの運用保守に依頼し、 JDK の jvisualvm ツールを使用して分析します。

2. ツールによる分析

JDK の bin ディレクトリ内のツールの場所については、ツールの具体的な使用方法を参照してください。
ここに画像の説明を挿入
分析のためにヒープダンプ ファイルをインポートします。
ここに画像の説明を挿入
ツールによって検出される 2 つのインターフェイス。

3. 界面圧力試験

特定されたインターフェイスをストレス テスト用のテストに渡します。ストレス テストの結果、同時実行数が 50 のときにインターフェイスの 1 つに問題があり、オンラインにする前に最適化する必要があることがわかりました。

4. T システムがバージョンをリリースするまで待ちます

バージョンをリリースした後、システム A が依然としてハングアップしていることが判明しました

5. システム A のダウンタイム中のインターフェイス訪問の統計

統計コマンド
sed -n '/2021-12-22 21:27:01/,/2021-12-22 21:29:47/p' catalina.out|grep サードパーティによる作業指示の詳細の取得|wc -l が見つかりまし
ここに画像の説明を挿入
たこの時点でもアクセス量が急増していたので、Tシステムが使用しているインターフェースの状況と調査を行ったところ、ミドルウェアが異常に使用されており、正常なack機構が行えなくなっていたため、全てのアクセスを停止した。蓄積されたアクセスは再起動時に再度呼び出されます。

最後6

1. インターフェイスが最適化され、耐圧テストの結果: 1000 同時実行で異常なし
2. T システムのバグが修正されました
。 3. 運用保守の構成が修正されました。

#net.ipv4.tcp_tw_recycle = 1    将这个注释了

net.ipv4.tcp_keepalive_time = 500
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

その後、Tシステムを2度再起動しましたが、APPプロジェクトに異常はありませんでしたので、次期T​​システムのバージョンを再リリースし、システムを再起動して状況を監視する予定です。つづく


フォローアップ システムは依然としてメモリ オーバーフローを起こすことがありますが、Java VisualVM はいくつかの基本的な機能しか提供しておらず、問題を具体的に特定することはできません。
Eclipse Memory Analyzer を使用して分析します。

調査の結果、サードパーティは再起動してもインターフェイスを複数回呼び出し、場合によってはパラメータを渡さずに呼び出すため、インターフェイスはテーブル全体のデータをクエリし、データ量が多すぎてメモリが不足することがわかりました。オーバーフロー

Eclipse Memory Analyzerのダウンロードアドレス:
https://www.eclipse.org/mat/downloads.php

トラブルシューティングのプロセス

ダンプファイルを取得する

ここに画像の説明を挿入

マットメモリを変更する

ダンプ ファイルが 1G を超えており、マットの初期サイズが 1024 であるため、ファイルを変更せずに開くことはできません
ここに画像の説明を挿入

ここに画像の説明を挿入

ファイルを開く

ここに画像の説明を挿入
ここに画像の説明を挿入
使用される合計メモリは 1.2G です。Thread
オブジェクトは 755.2M を占有します。
特定のメモリ リーク レポートを表示するには、[リークの疑い] をクリックしてください。
ここに画像の説明を挿入
詳細は、円
ここに画像の説明を挿入
をクリックして参照関係を表示します。下の図に示すように、それがはっきりとわかります。 18W バイトが ArrayList に配置されていることを確認します。 配列によって引き起こされる詳細に戻り
ここに画像の説明を挿入
、「Java の基本」-「スレッドの詳細」をクリックして選択し、
スレッドでメモリ オーバーフローが発生する可能性があるコードの実行位置を確認し、1 つずつ確認し、最後に、
ここに画像の説明を挿入
サードパーティのパラメータが渡されないため、パラメータ ID を渡す必要があることがわかります。また、このメソッドには必須のパラメータ検証もありません。そのため、このメソッドはテーブル全体のデータをクエリします (テーブル全体のデータは、 18W)、これが ArrayList に 18W バイトの配列がある理由です。最終的にはメモリオーバーフローを引き起こします。

二重確認

ローカル構成とオンライン メモリを介して -Xms1536m -Xmx1536m
ここに画像の説明を挿入

次に、パラメータを渡さずにこのメソッドをローカルで呼び出すと、2 回目の呼び出しでも同じメモリ オーバーフロー エラーが発生します。
ここに画像の説明を挿入

解決

このメソッドの必要なパラメータを確認し、オンラインにした後にメモリ オーバーフローの問題が発生しないことを確認してください。


「Eclipse Memory Analyzer Getting Started Study Notes」を参照してください
インタビュアー: メモリ リーク、メモリ オーバーフローのトラブルシューティング方法を教えてください。

おすすめ

転載: blog.csdn.net/RoyRaoHR/article/details/122197013