Python ベースの Linux システムにおける特定のプロセスのパフォーマンス監視の考え方の詳細な説明

Python ベースの Linux システムにおける特定のプロセスのパフォーマンス監視の考え方の詳細な説明

インターネット上には Linux サーバーを監視するためのツール、コンポーネント、プログラムが多数ありますが、サーバー上では同時に多数のプロセスが実行されます。特にパフォーマンス テストを行う場合、複数のサービスがサーバー上に展開されることがあります。サーバー全体の CPU とメモリのみを監視すると、サービスにパフォーマンス上の問題がある場合、効果的かつ正確にその問題を特定できません (もちろん、他のツールを使用しても実現できます)。したがって、特定のプロセスのみを監視する必要があります。要件は明確だったので、パフォーマンス監視スクリプトの作成を開始しました。

1. 全体的な考え方

1. 監視の開始と停止、監視結果を確認したいときにいつでも便利に監視を開始および停止し、監視結果を確認できるように、Flask でサービスを開始します。get リクエストを送信することで、いつでも監視を開始および停止し、監視結果を確認できます。
2. CPU、メモリ、IO を監視するかどうかを制御するには、マルチスレッド監視を有効にします。
3. 他のコンポーネントへの依存を減らすために、監視結果はログに書き込まれます。
4. 監視結果を容易に確認できるように、結果は HTML 形式で直接返されます。

ここに画像の説明を挿入

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 とポート。監視対象サービスと同じサーバー上にある必要があります。
BACKUP_COUNT: デフォルト値は 9 です。これは、過去 9 日間の監視結果のみが保持されることを意味します。
INTERVAL: 2 つの監視間の時間間隔。デフォルト値は 1 秒です。主に CPU とメモリの監視に使用されます。複数のポートまたはプロセスを同時に監視する場合は、この値を小さい値に設定してください。
ERROR_TIMES: コマンド実行の失敗回数。この数値を超えると、監視は自動的に停止します。主に、指定されたプロセスを監視するために使用されます。プロセスが強制終了された場合、監視は自動的に停止され、監視を再開するには手動でトリガーする必要があります。指定されたポートを監視する場合、ポートのプロセスが強制終了されると、監視も停止します。ポートが再起動されると、監視は自動的に開始されます。
IS_JVM_ALERT: Java アプリケーションの場合のみ、FullGC が頻繁に発生すると電子メールによるリマインダーが送信されます。一般的なパフォーマンス テストの場合、FullGC の頻度は 3600 秒未満にしないでください。
IS_MONITOR_SYSTEM: システムの合計 CPU 使用率と残りのメモリを監視するかどうか。
IS_MEM_ALERT: システムのメモリ残量が少なくなった場合に電子メールで通知を送信するかどうか。
MIN_MEM: システムで許可される最小残りメモリ(GB 単位)。
ECHO: 残りのシステム メモリが少なすぎる場合にキャッシュを解放するかどうか。0 は解放しない、1 はページ キャッシュを解放する、2 は dentry および inode キャッシュを解放する、3 は 1 と 2 を解放することを意味します。
DISK: ディスク番号。IO を監視する場合は、ディスク番号を入力し、df -h ファイル名を使用して、現在のファイルがマウントされているディスクを確認する必要があります。
START_TIME: 各監視が手動で開始されるようにトリガーされた時刻を記録します。
FGC_TIMES: トラブルシューティングのために各 FullGC の時間を記録します。

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
isRun: 1 は監視の開始を意味し、0 は監視の停止を意味します。
type と num: type=pid は num がプロセス番号であることを示し、type=port は num がポート番号であることを示します。複数のポートまたはプロセスを同時に監視でき、複数のポートまたはプロセスは英語のカンマで区切られます。
totalTime: 合計監視時間(秒単位)。totalTime が渡されない場合、システムはデフォルトで常時監視します。

2. 監視結果を表示する

http://127.0.0.1:
5555/plotMonitor?type=port&num=23121&system=1&startTime=2019-08-03 08:08:08&duration=3600
type と num: type=pid は num がプロセス番号であることを示し、type=port は num がポート番号であることを示します。
system: システム監視結果を確認することを示します。type と num が渡された場合、sysytem が渡されたかどうかに関係なく、プロセス監視結果のみを表示できます。type と num が渡されず、system のみが渡された場合、システム監視結果を表示できます。
startTime: 監視結果の開始時刻を確認します。
期間: 監視結果を表示する期間 (秒単位)。
startTime とduration が渡されない場合、デフォルトでは最後の監視開始以降のすべての結果が表示されます。特定の期間内の監視結果を表示する必要がある場合は、startTime とduration を渡す必要があります。監視結果を表示する時間範囲は、startTime から startTime+duration までです。
注意: 監視結果を表示する期間内にサービスが再起動されると、プロセス番号が変更されます。再起動前にプロセス番号を入力した場合は、対応する期間内の対応するプロセス番号の監視結果のみを表示できます。通常、ポート番号は簡単に変更されません。監視結果を表示する場合は、ポート番号を入力することをお勧めします。

4. 監視

パフォーマンスモニター.py

top コマンドを使用して CPU とメモリを監視し、jstat コマンドを使用して JVM メモリ (Java アプリケーションのみ) を監視し、iotop コマンドを使用してディスクの読み取りと書き込みのプロセスを監視し、iostat コマンドを使用してディスク IO を監視し、netstat コマンドを使用してポートに基づいてプロセスを確認し、ps コマンドを使用してサービスの起動時間を表示します。したがって、サーバーは上記のコマンドをサポートしている必要があります。サポートしていない場合は、インストールしてください。

注: プロセスは複数のスレッドを開始できるため、プロセスの IO を表示しても IO は表示されません。プロセスによって開始されたスレッドの IO は表示できますが、IO は表示されますが、スレッドは常に変化しています。そのため、指定されたプロセスの IO の監視は現在サポートされていません。

5. 監視結果を表示する

描画パフォーマンス.py

1. CPU グラフ、メモリと JVM グラフ、IO グラフ、ハンドル数グラフをそれぞれ描画します。
2. CPU と IO の使用状況の統計を容易にするためにパーセンタイルを計算します。
3. ガベージ コレクション情報の統計を容易にするために、Java アプリケーションの ygc、fgc、およびそれぞれの頻度を計算します。

監視結果は次のとおりです。

ここに画像の説明を挿入

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)入力された開始時刻と終了時刻に基づいて、この期間を含むすべてのログファイルを検索します。
(2)見つかったログファイルに基づいて、監視結果を含むすべてのログを検索する。
(3)グラフを描くときは、見つかったログをすべて走査します。

補充する

1. 最新の監視開始時刻を簡単に確認できるように、各監視開始時刻が startTime.txt ファイルに書き込まれます。

2. Java アプリケーションで発生する可能性のある問題のトラブルシューティングを容易にするために、各 Full GC の時間を FullGC.txt ファイルに書き込みます。

プロジェクトアドレス: https://github.com/leeyoshinari/performance_monitor

要約する

上記は、編集者が紹介した Python ベースの Linux システム指定のプロセス パフォーマンス監視です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Linuxパフォーマンス監視コマンドの簡単な紹介
  • PHP+swoole+linuxによるシステム監視とパフォーマンス最適化の操作例
  • Linux システムのパフォーマンスを分析するための top コマンドの詳細な説明
  • Linux サーバーのステータスとパフォーマンスに関連するコマンドの詳細な説明
  • Linux パフォーマンステスト pmap コマンドの詳細な説明
  • 収集する価値のある Linux サーバーのパフォーマンス最適化のヒント 20 選
  • Linux での Web パフォーマンス ストレス テスト ツール http_load の使用に関するチュートリアル
  • Linux で Web データの同期を実現する 4 つの方法 (パフォーマンス比較)
  • Linux+Nginx+Phpで高性能WEBサーバーを構築
  • Linux パフォーマンス監視ツール nmon のインストールと使用方法のチュートリアル分析

<<:  Vue でポップアップ ウィンドウをクリックしたときにクリック イベントを自動的にトリガーするソリューション (シミュレーション シナリオ)

>>:  ES6分解課題の原理と応用

推薦する

一般的な nginx コマンドをシェル スクリプトに組み込む方法の詳細な説明

1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...

6つの珍しいHTMLタグ

まず: <abbr> または <acronym>これら 2 つの記号は同じ意...

Vueはカスタムツリーコンポーネントを再帰的に実装します

この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...

基本構造、ドキュメント タイプ、ヘッダー、本文などの一般的な HTML 要素の概要。

1. 基本構造:コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBL...

nginx共有メモリの仕組みの詳細な説明

Nginx の共有メモリは、高いパフォーマンスを実現できる主な理由の 1 つであり、主にファイル キ...

MySQLの起動失敗の解決策

MySQLの起動失敗の解決策MySQLを起動できませんmysqlを停止した後、いくつかの操作(ホスト...

IE6 および IE7 で DIV コンテナの固定高さを使用するためのヒント

IE6 と IE7 では CSS の解釈に多くの違いがあります。今日はそのうちの 1 つである高さに...

CSS3で作られたレインボーボタンスタイル

結果: 実装コード: html <div class="buttons"&...

Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

CSS での配置の使用方法の詳細な研究 (要約)

CSS における位置指定の概要position属性は英語で位置を意味し、 CSSでの主な機能は要素...

Web ページのデザインを学ぶときに習得すべきコードは何ですか?

この記事では、Web ページ制作を学ぶ過程で習得すべきテクニックの一部を詳しく紹介します。これらの内...

docker.service 起動エラーの詳細なトラブルシューティング

エラーを報告するには次のコマンドを実行しますsystemctl dockerを再起動しますエラーメッ...

WeChatミニプログラムでトークンの有効期限を処理する方法

目次まず結論から質問解決Promiseを使用してコールバック関数をカプセル化する要約するまず結論から...

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...