Skip to main content

Periodic stack-trace sampler for Python performance profiling.

Project description

pysttl

pysttl (Python Sampling Thread Trace Logger) は、Python アプリケーションのパフォーマンスのボトルネックを特定するためのスタックトレース定期サンプラーです。SIGALRM を利用して指定間隔ごとに全スレッドのスタックトレースを取得し、JSON Lines 形式でログファイルに追記します。

得られたログを解析することで、どの関数・どの行で時間を費やしているかを統計的に把握できます (poor-man's profiler の発想)。

動作要件

  • Python 3.11 以上
  • POSIX 系 OS (Linux / macOS) — 内部で signal.SIGALRM を使用するため、Windows では動作しません。
  • start() はメインスレッドからのみ呼び出せます (signal.signal() の制約)。
  • signal.SIGALRM / signal.setitimer(ITIMER_REAL, ...) を内部で利用するため、同じシグナル/タイマーを使う他のコードとは併用できません。

インストール

pip install pysttl

ローカルチェックアウトから直接インストールする場合:

pip install .

開発用の追加依存 (ビルド/PyPI アップロード用) も入れる場合:

pip install -e '.[dev]'

使い方

1. コンテキストマネージャ (推奨)

import pysttl

with pysttl.trace():
    do_heavy_work()

ブロックを抜けると自動的に stop() が呼ばれ、SIGALRM ハンドラと setitimer の状態は呼び出し前に復元されます。

2. 関数 API

import pysttl

pysttl.start(log_file_path="/tmp/backtrace.log", interval=1.0)
try:
    do_heavy_work()
finally:
    pysttl.stop()

3. デフォルト値の上書き

log_file_pathinterval のデフォルト値はモジュール属性として公開されており、外部から上書き可能です。start() / trace() は呼び出し時にその時点の値を参照します。

import pysttl

pysttl.DEFAULT_LOG_FILE_PATH = "/var/log/myapp/backtrace.log"
pysttl.DEFAULT_INTERVAL = 0.5  # 500ms 間隔でサンプル

pysttl.start()  # 上記の上書き値が適用される

引数を明示的に渡した場合はそちらが優先されます。

出力フォーマット

ログは JSON Lines で書き出されます。1 行 = 1 サンプル = その時点の全スレッドのスタックトレースです。

{
  "threads": [
    {
      "backtrace": [
        "<FrameSummary file '/path/to/main.py', line 14 in main>",
        "<FrameSummary file '/path/to/core.py', line 80 in busy_loop>"
      ],
      "datetime": "2026-05-08T21:00:00.123456",
      "thread_name": "MainThread",
      "thread_ident": 140123456789
    }
  ]
}

backtrace は呼び出し元 → 呼び出し先の順 (root -> leaf) に並んでいます。

解析 CLI

pysttl-parsepysttl が出力した JSON Lines ログを解析し、スタックツリーとステップランキングを出力します。

# ファイルを解析して結果を保存
pysttl-parse < /tmp/backtrace.log > log/tree.txt

# パイプ経由でも利用可能
cat /tmp/backtrace.log | pysttl-parse

出力には以下の2セクションが含まれます。

  • ### Stack trace log analysis tree
  • ### Step load ranking

壊れた JSON 行は警告を stderr に出力し、解析は継続します。

API リファレンス

シンボル 種別 説明
pysttl.start(log_file_path=None, interval=None) 関数 サンプリング開始。None の場合は対応する DEFAULT_* を参照。
pysttl.stop() 関数 サンプリング停止 + SIGALRM ハンドラ復元。未起動なら no-op。
pysttl.trace(log_file_path=None, interval=None) コンテキストマネージャ start() / stop() のラッパー。
pysttl.DEFAULT_LOG_FILE_PATH 定数 (str) 既定の出力先。初期値 "/tmp/backtrace.log"
pysttl.DEFAULT_INTERVAL 定数 (float) 既定のサンプリング間隔 [秒]。初期値 1.0

制限事項

  • signal.SIGALRMpysttl が占有するため、signal.alarm()setitimer(ITIMER_REAL, ...) を別途使用するコードと併用できません。
  • シグナルハンドラ内でファイル I/O (JSON シリアライズ + 追記書き込み) を行うため、I/O が遅い環境では実際の処理スレッドを意図せずブロックする可能性があります。本番常用ではなく調査用途を想定しています。
  • start() 中の二重起動はエラーになります。設定変更時はいったん stop() してから再 start() してください。

ビルドと公開

# ビルド (sdist + wheel を dist/ に生成)
python -m build

# 動作確認用に別 venv へインストール
pip install dist/pysttl-*.whl

# PyPI へアップロード (要 ~/.pypirc)
twine upload dist/*

uv ユーザーは uv build / uv publish も利用可能です。

ライセンス

MIT License。詳細は pyproject.toml を参照してください。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pysttl-0.1.2.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pysttl-0.1.2-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file pysttl-0.1.2.tar.gz.

File metadata

  • Download URL: pysttl-0.1.2.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pysttl-0.1.2.tar.gz
Algorithm Hash digest
SHA256 28faac68c94c58d19c03e5dad92296d786cdcc5c02ffbc173270f0eb0cf5b512
MD5 e1dbccee9ba2e14737b2ef30fcad85b6
BLAKE2b-256 e34ac53d435c5779441408971eea36b589f44ea34e38951a1f4ea14791f1c828

See more details on using hashes here.

File details

Details for the file pysttl-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pysttl-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 7.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pysttl-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ca9b2f11dbddf08011e8b548ad7d856179775fb9087a3d4180a320910908bcdf
MD5 eabfd9b31af080079f69dd6d22642148
BLAKE2b-256 c577f29be953f78d6fa31cd8184ac5bda3faef14ad031f69ec099157d7c1e21d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page