python 3.12.0 perf 试用
python 3.12.0 的发布,官方支持了基于perf 的调用链分析,基于容器搞了一个简单的环境测试下
环境准备
包含了包含perf 的python 基础镜像,以及一个使用flask 的web 服务, 使用flamescope 的可视化页面分析
- docker-compose 文件
version: '3'
services:
flamescope:
image: dalongrong/flamescope
ports:
- "9080:5000"
volumes:
- "./profiles:/profiles"
app:
build:
context: ./
dockerfile: Dockerfile-app
privileged: true
environment:
- PYTHONPERFSUPPORT=1
volumes:
- ./app.py:/app/app.py
- ./profiles:/profiles
ports:
- 3000:3000
cap_add:
- ALL
perf-base:
profiles:
- perf
build: .
image: dalongrong/python:3.12.0-perf
- dockerfile 说明
基础镜像
FROM python:3.12.0
RUN apt update && apt-get install -y linux-perf procps && apt-get clean
Dockerfile-app app
FROM dalongrong/python:3.12.0-perf
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
COPY app.py /app/app.py
ENTRYPOINT [ "flask", "--app", "app","run", "--host", "0.0.0.0", "--port", "3000" ]
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
体验
- 注意需要先构建基础镜像
- 启动
docker-compose up -d
- perf 采样数据
容器kernel 配置
sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
sh -c " echo 0 > /proc/sys/kernel/perf_event_paranoid"
perf record -ag -F 999p -p 1
perf script --header > /profiles/myappperf.perf
- flamescope 查看
从效果上来看,似乎并不是很好
说明
目前python 对于perf 的支持是以linux 为主的,同时从体验上来说不是很好
参考资料
https://github.com/pyenv/pyenv
https://pythoninsider.blogspot.com/2023/10/python-3120-final-now-available.html