Pythonプロセス制御の一般的なツールの詳細な説明

私たちの仕事では、ddagentver。 5収集ツールとして、ホスティングサーバーのパフォーマンスインジケーターを収集して報告し、ddagentをある程度カスタマイズします。多くの機能を繰り返した後、実行時間が長いオンラインホスティングサーバーのバッチがメモリを大量に消費することがわかりました。問題のあるマシンのプロセスツリーの各ノードの占有率を分析すると、ddagent収集プロセスのメモリ占有率がまだ高いことがわかります。

次のような最も基本的なプロセス制御ツールについて学習します。

ループwhileループの条件付き判断の場合

ビジネスシステムの安定した運用を保証する監視コンポーネントとして、当然のことながら非常に深刻なメモリリークが発生するため、「トラブルシューティングの旅」を開始しました。

if-elif-else判断

分析

Pythonプログラムのメモリステータスを分析してエクスポートするためのツールはたくさんあります。ここでは、実行中のPythonプログラムにアタッチし、メモリスナップショットを生成し、現在どのオブジェクトタイプがどのくらいのメモリを占有しているかを確認し、それらを最大から最小に並べ替えることができるピラサイトを使用します。

コマンドは非常に単純です:pyrasite-memory-viewer <PID ,同时会生成一份快照文件: /tmp/pyrasite-<PID -objects.json。

実際の本番データを提供できないため、以下に記載されているすべてのデータは、テスト環境で12時間実行した後の問題のあるバージョンのサンプリングからのものです。

ピラサイトが提供するCuiビューでは、辞書タイプのオブジェクトインスタンスが最も多くのメモリを占有し、3.4 MBに達し、6621インスタンスであることがはっきりとわかります。

whileループ

whileループも一般的なループ方式です。この種のループは通常、ループ本体または条件付きの方法で終了します。それは無期限に続くことはできません。

漏えいに関しては、以下の事実と推測があります。

1つ以上の場所が空の辞書オブジェクトを作成し続け、それらを再利用できないため、メモリリークが発生し、メモリリークが時間の経過とともに増加します。インデックス収集ビジネスでは、リークは各収集プロセス中に発生する可能性があり、間隔の後に繰り返しトリガーされます。現在依存しているddagentバージョンに、カスタマイズプロセスにある可能性のある未解決の関連する問題があることはわかりません。で導入されたエラー

[[["... /embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],[".../modules/monitor/bot/task.py",18,"run","self.check()"],[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]],[[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],[".../modules/monitor/bot/task.py",18,"run","self.check()"],[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]],[[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],[".../modules/monitor/bot/task.py",18,"run","self.check()"],[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]],...

リプレイ

「設計レビューと仕様レビューで良い仕事をしている」や「実験段階で品質検査作業を強化する」などの古い決まり文句については言及していませんが、これも私たちの反省に値します。

メモリリークを完全に防止および制御することはほとんど不可能であり、rustのような安全なプログラミング言語では、プログラムがメモリをリークしないことを保証できません。

範囲外のアレイアクセス、解放されたメモリへのアクセスなど、メモリの不安定さを引き起こす多くの動作は、より厳密なプログラミングモデル(錆によって提案された所有権+ライフサイクルルールなど)やデータ競合の問題を定式化することで回避できます。

ただし、レース条件などのメモリリークを引き起こす動作では、開発者は開発コンポーネントをビジネスルールと組み合わせる必要があります。手動で更新する必要があるデータキューを想像してみてください。その結果、データをプッシュするときに呼び出すのを忘れていました。このメモリリークは、従来の検査ルールでは特定できません。

キーワード機能は、着信パラメータの場所と特定の使用法をより鮮明に説明することです。関数に4つまたは5つのパラメーターがあり、一度に渡されるパラメーターが多すぎる場合、人々を魅了することは困難です。 key = valueを使用して渡す場合。

総括する

このセクションの調査を通じて、コードフローを制御し、さまざまな条件下でさまざまなコードを実行する方法を学びました。 for / whileと関数の定義方法には、関数の戻り値とパラメーターの受け渡し方法、位置パラメーターの受け渡し、およびパラメーターを関数に渡すときのkey = valueパラメーターの受け渡しの2つの異なるループメソッドがあります。

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

Pythonプロセス制御の一般的なツールの詳細な説明
Pythonオブジェクトの属性アクセスプロセスの詳細な説明
pythonバックトラッキングテンプレートの詳細な説明
pythonシーケンスタイプの詳細な説明
PythonIOポート多重化の詳細な説明
pythonコマンドの-uパラメーターの詳細な説明
Python推測アルゴリズムの問題の詳細な説明
Python super()メソッドの原理の詳細な説明
python標準ライブラリOSモジュールの詳細な説明
Pythondecimalモジュールの使用法の詳細な説明
pythonがコンカレントメソッドをサポートする方法の詳細な説明
Pythonに基づくデータタイプの詳細な説明
09.Python3の共通モジュール
Python関数パラメータ分類の原理の詳細な説明
Pythonタイマースレッドプールの原理の詳細な説明
Pythonインターフェース開発の実装手順の詳細な説明
PythonWebページパーサーの使用例の詳細な説明
pythonに基づく残りの問題の詳細な説明(%)
Python共通モジュールのコレクション
Pythonプラグインメカニズムの詳細な実装
Pythonは詳細な開発のためにC / C ++を組み込んでいます
gpg2を使用したubuntuの詳細な説明
Pythonエラー処理は詳細な説明を主張します
Python条件付き制御ステートメントの分析
Pythonでの辞書の詳細な使用法
Python関数のいくつかの一般的なモード
Windowsでのpython共通ライブラリのインストール
ubuntu18用のpython3.7のインストールに関する詳細なチュートリアル
Pythonガベージコレクションメカニズムの詳細な分析
属性からプロパティまでのPython詳細な説明
Pythonタイムモジュールの一般的な操作の概要
Python仮想環境venvの使用法の詳細な説明
Pythonマルチプロセスプログラミングの一般的な方法の分析
Ubuntu20.04インストールPython3仮想環境チュートリアル詳細な説明
Python操作の一般的なメソッドの分析Jiraライブラリ
Pythonを学ぶためのいくつかのウェブサイトの推奨事項
FMEに基づくPythonプロセスの使用図
CentOS6.5でのHadoop環境の構築に関する詳細な説明
Pythonを使用してKSを計算する詳細な例