インターネット上には 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 でポップアップ ウィンドウをクリックしたときにクリック イベントを自動的にトリガーするソリューション (シミュレーション シナリオ)
入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...
この記事では、参考までに、簡単なスネークゲームを実装するためのjsキャンバスの具体的なコードを共有し...
以下のように表示されます。 SELECT prod_name,prod_price FROM pro...
最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...
前提条件: Mac、zsh がインストールされ、bash のときに mysql がダウンロードされ、...
まず、 esp8266 は mqtt を通じてメッセージを公開し、WeChat アプレットは mqt...
目次1. スクリプトvim環境2. シェルスクリプトで環境を定義する方法3. シェルスクリプト内の翻...
1. TEXTとBLOBの違いTEXT ファミリと BLOB ファミリの唯一の違いは、BLOB 型は...
次のコマンドを使用できます: docker tag [イメージID] [名前]:[バージョン]例えば...
この記事の例では、複数のカウントダウンを同時に設定するためのVueの具体的なコードを参考までに共有し...
目次1. ディレクトリを入力してプロジェクトを作成する2. 必要な設定項目を選択します2.1 Vue...
IE6 は PNG の透明度をサポートしていないと多くの人が言っています。実際、IE は 100%...
Linuxにunzipコマンドがない問題の解決策unzipコマンドを使用して.zipファイルを解凍す...
目次効果のデモンストレーション:メインJSコード実装 <div class="box...
JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...