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分解課題の原理と応用

推薦する

MySQLインデックスの基礎となるデータ構造の詳細

目次1. インデックスの種類1. B+ツリー2. MyISAM と InnoDB の B+ ツリー ...

nginx における proxy_pass のさまざまな使用法の詳細な説明

目次プロキシ転送ルール最初のもの: 2番目のタイプ: 3番目のタイプ: 4番目のタイプ: 5番目:プ...

Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決する

以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...

Dockerコンテナが停止できない問題の解決方法

解決策は次のとおりです。 1. コンテナを強制削除する docker rm -f ジェンキンス2. ...

Linux ipcsコマンドの使用

1. コマンドの紹介ipcs コマンドは、Linux のプロセス間通信機能の状態を報告するために使用...

JS で async と await を使用する方法

目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...

Linux 環境に mysql5.7.36 データベースをインストールするチュートリアル

ダウンロードアドレス: https://dev.mysql.com/downloads/mysql/...

MySQL のデフォルトのストレージ エンジンを変更する方法

mysql ストレージ エンジン: MySQL サーバーはモジュール スタイルを採用しており、特にス...

XHTMLタグには終了タグがある

<br />オリジナルリンク: http://www.dudo.org/article....

CSSを使用して複数の画像を中央に水平に表示する方法

まず実装手順について説明します。最終結果 2. コードの実装HTML部分 <div class...

ウェブ画像のホットリンクと座標値を設定するサンプルコード

時には、画像上に複数の領域を設定する必要があります。マウスで画像のさまざまな領域をクリックしてさまざ...

Linux環境でIPV6接続をサポートするようにmysql5.6を設定する方法

導入:この記事では主に、Linux システムで IPV6 接続をサポートするように MySQL を構...

キャンバス操作プラグイン fabric.js の使い方を詳しく解説

Fabric.js は非常に便利なキャンバス操作プラグインです。ここでは、日常のプロジェクトで使用さ...

MySQL 学習ノート: データ エンジン

現在のデータベースでサポートされているエンジンを表示します エンジンを表示 +-----------...

複数の条件を持つ MySQL クエリ メソッド

複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...