Python内存/性能分析总结

| 标签 python  浏览次数: -

环境信息

centos1@root➜  ~ uname -a
Linux centos1 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
centos1@root➜  ~ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
centos1@root➜  ~ python --version
Python 2.7.5
centos1@root➜  ~

gdb

详细信息可以自行查阅官网

  • 安装
yum install -y gdb python-debuginfo

objgraph

  • 安装
pip install objgraph

graphviz 工具

将 objgraph 库生成的 dot 文件生成图片

line_profiler

tracemalloc

cProfile

guppy

pympler

memory-profiler

使用memory_profiler进行分析

  • 官方示例

example.py

@profile
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    my_func()

运行

  • 通过提供的工具运行
mprof run example.py
  • 通过模块运行
python -m memory_profiler example.py

火焰图

火焰图的生成依赖 perf 获取程序运行堆栈,perf 只能在 Linux 下使用。

  • 1.安装 perf
# Ubuntu
sudo apt-get install bindfs linux-tools-common

# Centos
yum install perf perl

FlameGraph

Github 地址,真正生成火焰图的项目。

#!/usr/bin/env bash

set -xe

# https://github.com/brendangregg/FlameGraph#2-fold-stacks

pid=$1

sudo perf record -F 99 -p ${pid} -g -- sleep 10 > /tmp/flame/perf_${pid}.data
sudo perf script --header > /tmp/flame/out_${pid}.perf

./stackcollapse-perf.pl /tmp/flame/out_${pid}.perf > /tmp/flame/out_${pid}.folded

./flamegraph.pl /tmp/flame/out_${pid}.folded > /tmp/flame/flame_${pid}.svg

/tmp/flame/out.perf 文件可以通过 FlameScope 项目进行解析

Pyflame 不再维护了

Github 地址获取堆栈后还是需要依赖 FlameGraph 项目才能渲染出火焰图

pid=$1
sudo pyflame -s 60 -r 0.01 -p ${pid} | ./flamegraph.pl > /tmp/flame/pyflame-${pid}.svg

FlameScope

Github 地址

git clone https://github.com/Netflix/flamescope
cd flamescope
pip install -r requirements.txt
pip install python-magic-bin
python run.py

此项目并不能生成火焰图,用途是用于解析火焰图,本质上市一个可视化分析工具

猜想

计算密集型的任务表现在 CPU 的持续高占用

并发量导致负载过重是最常见的瓶颈原因,表现应该是进程会占用极多的磁盘 I/O 读写带宽和 CPU

现象

并发数不断增加,TPS 上不去,CPU 耗用不高

压力测试

重点指标(TPS,响应时间,带宽流量,CPU,内存,DB)等。

什么是压力测试

不断地向系统施加”压力”,测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷。

为什么需要压力测试

压测的目的是在于找到系统的瓶颈,对于 web 应用来说,系统瓶颈往往会是数据库,如果系统满负荷执行,数据库服务器的 CPU 和内存没有跑满,那一定是系统其他方面达到瓶颈了,只有反复测试定位系统瓶颈,进行优化。

小结

压测的目的是在于找到系统的瓶颈,一定是要确定系统某个方面达到瓶颈了,压力测试才算是基本完成。当我们说系统可以支撑某某压力时,一定要同时能够清楚的说出系统的瓶颈是在哪里;也就是说,当瓶颈得到改善的时候,系统的性能可以得到提高。对于 web 应用,系统的瓶颈往往会是数据库;系统满负荷运作的时候,数据库的 CPU 或者是磁盘 IO 是否跑满了?如果没有,那么很可能是说明瓶颈是在别的地方;如果是在应用,那么应用服务器的 CPU、内存、IO 等等也应该有所体现。找到系统的瓶颈,是需要反复做不同测试、优化,然后分析出来的。


上一篇 OpenStack单机环境搭建     下一篇 Knockout学习
目录导航