インターネット上には Linux サーバーを監視するためのツール、コンポーネント、プログラムが多数ありますが、サーバー上では同時に多数のプロセスが実行されます。特にパフォーマンス テストを行う場合、複数のサービスがサーバー上に展開されることがあります。サーバー全体の CPU とメモリのみを監視すると、サービスにパフォーマンス上の問題がある場合、効果的かつ正確にその問題を特定できません (もちろん、他のツールを使用しても実現できます)。したがって、特定のプロセスのみを監視する必要があります。要件は明確だったので、パフォーマンス監視スクリプトの作成を開始しました。 1. 全体的な考え方1. 監視の開始と停止、監視結果を確認したいときにいつでも便利に監視を開始および停止し、監視結果を確認できるように、Flask でサービスを開始します。get リクエストを送信することで、いつでも監視を開始および停止し、監視結果を確認できます。 2. 設定ファイルconfig.py IP = '127.0.0.1' ポート = '5555' LEVEL = 'INFO' # ログレベル BACKUP_COUNT = 9 # ログバックアップカウンタ LOG_PATH = 'logs' # ログパス INTERVAL = 1 # 間隔、コマンド間隔を実行します。 SLEEPTIME = 3 # 間隔、モニターを停止する場合、条件を満たす場合にモニターを開始するためにポーリングします。 ERROR_TIMES = 5 # 回、実行中のコマンドの数。等しい場合、モニターは自動的に停止します。 IS_JVM_ALERT = True # Full GC の頻度が高すぎる場合に警告するかどうか。 IS_MONITOR_SYSTEM = True # システムの CPU とメモリを監視するかどうか。 IS_MEM_ALERT = True # メモリが不足している場合に警告するかどうか。電子メールを送信して警告します。 MIN_MEM = 2 # Minxium メモリ、uint: G # 0: キャッシュをクリアしない、1: ページ キャッシュをクリアする、2: dentry および inode キャッシュをクリアする、3: 1 と 2 を含める。 # エコー 1 >/proc/sys/vm/drop_caches エコー = 0 SMTP_SERVER = 'smtp.sina.com' # SMTPサーバー SENDER_NAME = '张三' # 送信者名 SENDER_EMAIL = '[email protected]' # 送信者のメールアドレス PASSWORD = 'UjBWYVJFZE9RbFpIV1QwOVBUMDlQUT09' # 電子メールのパスワード、base64 エンコード。 RECEIVER_NAME = 'baidu_all' # 受信者名 RECEIVER_EMAIL = ['[email protected]', '[email protected]'] # 受信者のメールアドレス DISK = 'device1' # アプリケーションが実行されるディスク START_TIME = 'startTime.txt' # 監視開始時刻を保存します。 FGC_TIMES = 'FullGC.txt' # すべての FullGC 時間を保存します。 #html HTML = '<html><body>{}</body><html>' エラー = '<p style="color:red">{}</p>' ヘッダー = '<div id="header"><h2 align="center">パフォーマンス モニター (pid={})</h2></div>' 分析 = '<div id="container" style="width:730px; margin:0 auto">{}</div>' IP とポート: サービスが有効になっているサーバーの IP とポート。監視対象サービスと同じサーバー上にある必要があります。 3. インターフェースとサービスサーバー.py サーバー = Flask(__name__) パーモン = PerMon() # マルチスレッドを有効にする t = [threading.Thread(target=permon.write_cpu_mem, args=()), スレッド化.Thread(ターゲット=permon.write_io、引数=())] iが範囲内(len(t))の場合: t[i].開始() # 監視を開始# http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600 @server.route('/runMonitor', メソッド=['get']) runMonitor() を定義します:...... # 監視結果のグラフを描画します# http://127.0.0.1:5555/plotMonitor?type=pid&num=23121 @server.route('/plotMonitor', メソッド=['get']) def plotMonitor():....... server.run(port=cfg.PORT, debug=True, host=cfg.IP) # サービスを開始します ブラウザのアドレスバーに対応する URL を入力すると、監視を開始および停止したり、監視結果を表示したりできます。 URLパラメータの受け渡し: 1. 監視を開始する http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600 2. 監視結果を表示する http://127.0.0.1: 4. 監視パフォーマンスモニター.py top コマンドを使用して CPU とメモリを監視し、jstat コマンドを使用して JVM メモリ (Java アプリケーションのみ) を監視し、iotop コマンドを使用してディスクの読み取りと書き込みのプロセスを監視し、iostat コマンドを使用してディスク IO を監視し、netstat コマンドを使用してポートに基づいてプロセスを確認し、ps コマンドを使用してサービスの起動時間を表示します。したがって、サーバーは上記のコマンドをサポートしている必要があります。サポートしていない場合は、インストールしてください。 注: プロセスは複数のスレッドを開始できるため、プロセスの IO を表示しても IO は表示されません。プロセスによって開始されたスレッドの IO は表示できますが、IO は表示されますが、スレッドは常に変化しています。そのため、指定されたプロセスの IO の監視は現在サポートされていません。 5. 監視結果を表示する描画パフォーマンス.py 1. CPU グラフ、メモリと JVM グラフ、IO グラフ、ハンドル数グラフをそれぞれ描画します。 監視結果は次のとおりです。 6. 拡張関数extern.pyには2つの関数がある 1. ポート転送プロセス 試す: 結果 = os.popen(f'netstat -nlp|grep {port} |tr -s " "').readlines() res = [line.strip() 結果の行の場合、行内に str(port) があるかどうか] p = res[0].split(' ') pp = p[3].split(':')[-1] str(port) == ppの場合: pid = p[-1].split('/')[0] 例外を err として除く: ロガー.ロガー.エラー(err) 2. 監視結果を含むログを見つける 全体的なアイデア: (1)入力された開始時刻と終了時刻に基づいて、この期間を含むすべてのログファイルを検索します。 補充する 1. 最新の監視開始時刻を簡単に確認できるように、各監視開始時刻が startTime.txt ファイルに書き込まれます。 2. Java アプリケーションで発生する可能性のある問題のトラブルシューティングを容易にするために、各 Full GC の時間を FullGC.txt ファイルに書き込みます。 プロジェクトアドレス: https://github.com/leeyoshinari/performance_monitor 要約する 上記は、編集者が紹介した Python ベースの Linux システム指定のプロセス パフォーマンス監視です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Vue でポップアップ ウィンドウをクリックしたときにクリック イベントを自動的にトリガーするソリューション (シミュレーション シナリオ)
1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...
まず: <abbr> または <acronym>これら 2 つの記号は同じ意...
この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...
1. 基本構造:コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBL...
Nginx の共有メモリは、高いパフォーマンスを実現できる主な理由の 1 つであり、主にファイル キ...
MySQLの起動失敗の解決策MySQLを起動できませんmysqlを停止した後、いくつかの操作(ホスト...
IE6 と IE7 では CSS の解釈に多くの違いがあります。今日はそのうちの 1 つである高さに...
結果: 実装コード: html <div class="buttons"&...
Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...
1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...
CSS における位置指定の概要position属性は英語で位置を意味し、 CSSでの主な機能は要素...
この記事では、Web ページ制作を学ぶ過程で習得すべきテクニックの一部を詳しく紹介します。これらの内...
エラーを報告するには次のコマンドを実行しますsystemctl dockerを再起動しますエラーメッ...
目次まず結論から質問解決Promiseを使用してコールバック関数をカプセル化する要約するまず結論から...
Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...