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

推薦する

VMware 仮想化 KVM のインストールと展開のチュートリアルの概要

仮想化1. 環境セントオス7.3 selinuxとファイアウォールを無効にする2. 仮想化環境の構成...

MySQL 8.0.11 MacOS 10.13 のインストールと設定方法のグラフィックチュートリアル

MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...

JSはビデオの再生速度を制御するための簡単なサンプルコードを実装します

導入以前、ある問題に気づきました。学習ビデオを視聴しているとき、動きが遅すぎる、先生が黒板に書くのに...

nginx rewriteを使用してURLをリダイレクトする方法

最近仕事でnginxの設定を変更する必要が頻繁にあり、nginxでrewriteを使用する方法を学び...

Web デザインでフラッシュ オーバーレイ ポップアップ レイヤーの z-index プロパティを設定しても機能しない

デフォルトでは、Flash は常にページのトップレベルに表示されます。つまり、ページに DHTML ...

虫眼鏡効果を実現するJavaScript

この記事では、虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。...

MySQLのダウンロードとインストールのプロセスの詳細な説明

1: MySqlをダウンロードする公式サイトのダウンロードアドレス: https://dev.mys...

MySQLでデータをエクスポートするいくつかの方法の詳細な説明

MySQL データをエクスポートする目的は、データベースのバックアップ、テーブル構造のエクスポート、...

Vue バインディング オブジェクト、配列データを動的にレンダリングできないケースの詳細な説明

プロジェクトシナリオ: Dark Horse Vueプロジェクト管理の実践、製品分類の取得、拡張バー...

Linux DHCPサービスの詳細な説明

目次1. DHCP サービス (動的ホスト構成プロトコル) 1. 背景2. 概要3. 利点4.DHC...

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

Dockerコンテナのログ分析

コンテナログを表示するまず、 docker run -it --rm -d -p 80:80 ngi...

Vueはカウンターのシンプルな生成を実装します

この記事では、Vueカウンターの簡単な実装コードを例として紹介します。具体的な内容は以下のとおりです...

Linuxでプロセスが占有するポート番号を表示する

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

CSS3で線形グラデーションを実装するためのコードの詳細な説明

序文デモでは古いバージョンのブラウザのグラデーションが実装されています[IE9-]。 IE9 より前...