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) に並んでいます。

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.1.tar.gz (5.0 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.1-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pysttl-0.1.1.tar.gz
  • Upload date:
  • Size: 5.0 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.1.tar.gz
Algorithm Hash digest
SHA256 616737e4957f6b0b09963ffc11d33f1c2337fd4810b0cd375493c2c3e0662b46
MD5 fdbd7d5a11c33e61342f18b51ea2a724
BLAKE2b-256 e492e10901fd545012565f53e0d7bb775c8584ae27ee1410ace2ce81ce92ae61

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pysttl-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 5.5 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ef13d9ea7dc55b0be877e46a4bb82b87eaf6036e252986f5c149b6bea2f81c32
MD5 7a1a06a34d08189153cf630408c964e9
BLAKE2b-256 8c75c6598f287c0e342131221b546b82433ac073789d245d59769e85e0966270

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