一.多进程:

  查看程序所有进程与线程

  如果python程序启动后形成多个进程如何判断其关系

  显示进程的树状结构。-cp 表示树展开,且显示进程号码

$pstree -cp

  显示结果

        │               │               │            ├─pycharm.sh(5146)───java(5194)─┬─fsnotifier64(5232)
│ │ │ │ ├─python2.7(5314)─┬─python2.7(5327)─┬─{python2.7}(5329)
│ │ │ │ │ │ ├─{python2.7}(5330)
│ │ │ │ │ │ ├─{python2.7}(5341)
│ │ │ │ │ │ └─{python2.7}(5344)
│ │ │ │ │ ├─python2.7(5328)─┬─{python2.7}(5339)
│ │ │ │ │ │ ├─{python2.7}(5340)
│ │ │ │ │ │ ├─{python2.7}(5354)
│ │ │ │ │ │ └─{python2.7}(5355)
│ │ │ │ │ ├─python2.7(5331)─┬─{python2.7}(5342)
│ │ │ │ │ │ ├─{python2.7}(5343)
│ │ │ │ │ │ ├─{python2.7}(5359)
│ │ │ │ │ │ └─{python2.7}(5360)
│ │ │ │ │ ├─python2.7(5332)─┬─{python2.7}(5346)
│ │ │ │ │ │ ├─{python2.7}(5347)
│ │ │ │ │ │ ├─{python2.7}(5364)
│ │ │ │ │ │ └─{python2.7}(5365)
│ │ │ │ │ ├─python2.7(5333)─┬─{python2.7}(5348)
│ │ │ │ │ │ ├─{python2.7}(5350)
│ │ │ │ │ │ ├─{python2.7}(5368)
│ │ │ │ │ │ └─{python2.7}(5369)
│ │ │ │ │ ├─python2.7(5334)─┬─{python2.7}(5356)
│ │ │ │ │ │ ├─{python2.7}(5358)
│ │ │ │ │ │ ├─{python2.7}(5376)
│ │ │ │ │ │ └─{python2.7}(5377)
│ │ │ │ │ ├─python2.7(5335)─┬─{python2.7}(5352)
│ │ │ │ │ │ ├─{python2.7}(5353)
│ │ │ │ │ │ ├─{python2.7}(5373)
│ │ │ │ │ │ └─{python2.7}(5375)
│ │ │ │ │ ├─python2.7(5336)─┬─{python2.7}(5362)
│ │ │ │ │ │ ├─{python2.7}(5363)
│ │ │ │ │ │ ├─{python2.7}(5378)
│ │ │ │ │ │ └─{python2.7}(5379)
│ │ │ │ │ ├─python2.7(5337)─┬─{python2.7}(5372)
│ │ │ │ │ │ ├─{python2.7}(5374)
│ │ │ │ │ │ ├─{python2.7}(5382)
│ │ │ │ │ │ └─{python2.7}(5383)
│ │ │ │ │ ├─python2.7(5338)─┬─{python2.7}(5366)
│ │ │ │ │ │ ├─{python2.7}(5370)
│ │ │ │ │ │ ├─{python2.7}(5380)
│ │ │ │ │ │ └─{python2.7}(5381)
│ │ │ │ │ ├─{python2.7}(5317)
│ │ │ │ │ ├─{python2.7}(5318)
│ │ │ │ │ └─{python2.7}(5319)
│ │ │ │ ├─{java}(5195)

  从上面可以看到,python程序起了一个主进程5314,然后这个主进程又起了10个左右的子进程。再结合以下命令可以判断出启动的程序的组成主进程是那个,以及子进程是那个。

$ps aux|grep 程序名 

  查看某个进程的状态

$top -H -p N  ###N是进程号
$cat /proc/N/status ###N是进程号

  例子1:查看主进程5314

$cat /proc//status

  显示信息如下

Name:    python2.7               ###进程名字
State: S (sleeping)             ###进程状态
Tgid: 5314                  ###进程线程组id(主线程),也就是进程id;每个进程有一个主线程,有其他线程;主线程id即进程id 
Ngid: 0                    ###
Pid: 5314                   ###线程或者进程id(主线程),linux中线程进程是同一个数据结构
PPid: 5194                  ###父进程id
TracerPid: 0                 ###跟踪当前进程的进程id,0表示无跟踪
Uid: 1000    ###用户id
Gid: 0           ###组id
FDSize: 512                 ###文件描述符上限,ls /proc/5314/fd;查看文件描述符
Groups:   ###用户组
VmPeak: kB            ###进程运行占用内存的峰值
VmSize: kB            ###目前占用内存量
VmLck: kB             ###进程锁住的内存,不能交换到磁盘
VmPin: kB             ###
VmHWM: kB             ###程序得到分配到物理内存的峰值
VmRSS: kB             ###程序得到分配到物理内存
VmData: kB            ###表示进程数据段的大小
VmStk: kB             ###表示进程堆栈段的大小
VmExe: kB             ###表示进程代码的大小.
VmLib: kB             ###表示进程所使用LIB库的大小.
VmPTE: kB             ###占用的页表的大小
VmSwap: kB            ###进程占用Swap交换区的大小
Threads: 4                  ###进程下面的线程个数
SigQ: /64045               ###表示当前待处理信号的个数
SigPnd: 0000000000000000         ###屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShdPnd: 0000000000000000         ###屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk: 0000000000000004         ###存放被阻塞的信号,等同于BLOCKED信号.
SigIgn: 0000000001001000         ###存放被忽略的信号,等同于IGNORED信号.
SigCgt: 0000000180004003         ###存放捕获的信号,等同于CAUGHT信号.
CapInh: 0000000000000000         ###能够被当前进程执行的程序继承的能力.
CapPrm: 0000000000000000         ###表示进程能够使用的能力
CapEff: 0000000000000000         ###当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapBnd: 0000003fffffffff         ###是系统的边界能力,我们无法改变它.
Seccomp: 0                  ###
Cpus_allowed: ffffffff           ###该进程可以使用CPU的亲和性掩码,如果我们指定为两块CPU,这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list: -31          ###进程可以使用的cpu的id号码列表
Mems_allowed: ,00000001     ###内存资源
Mems_allowed_list: 0            ###内存资源
voluntary_ctxt_switches: 376135     ###进程主动切换的次数
nonvoluntary_ctxt_switches: 5992    ###进程被动切换的次数

二.内存

  查看可执行文件的镜像

$readelf -s xxx   ###xxx为可执行文件的路径,linux上可执行文件是elf文件格式的。

  例子1:

  查看python执行程序

$readelf -s /usr/bin/python2.

  可以看到该执行文件的结构,但是python程序本身是字节码文件,不是elf文件。因此这个对我们作用不大

  : 0000000000503ef0     FUNC    GLOBAL DEFAULT    PySequence_Size
: 0000000000934cd0 OBJECT GLOBAL DEFAULT _PyIO_locale_module
: 00000000005b6150 FUNC GLOBAL DEFAULT _PyLong_Sign
: 000000000043aa0b FUNC GLOBAL DEFAULT PyCodec_Register
: 00000000004c9ff0 FUNC GLOBAL DEFAULT PyObject_CallFunction
: 0000000000465e20 FUNC GLOBAL DEFAULT _Py_c_prod
: 00000000004554c1 FUNC GLOBAL DEFAULT PyFunction_GetModule
: 000000000044d09b FUNC GLOBAL DEFAULT PyImport_ReloadModule
: 0000000000465adb FUNC GLOBAL DEFAULT PyFloat_GetMin
: 000000000090f6e0 OBJECT GLOBAL DEFAULT PyCell_Type
: 0000000000456f41 FUNC GLOBAL DEFAULT PyComplex_FromDoubles
: OBJECT GLOBAL DEFAULT _PyOS_opterr
: 000000000091a6c0 OBJECT GLOBAL DEFAULT PyExc_OverflowError
: 000000000051ce20 FUNC GLOBAL DEFAULT PyClass_IsSubclass
: 000000000090e3a0 OBJECT GLOBAL DEFAULT PyProperty_Type
: OBJECT GLOBAL DEFAULT PyRange_Type
: 00000000004667c2 FUNC GLOBAL DEFAULT _Py_svnversion
: 0000000000581a10 FUNC GLOBAL DEFAULT PyNumber_Float

  查看进程内存镜像

$cat /proc/N/maps

三.执行时间

  系统自带的时间分析

$ time python xxx.py     

  显示结果为

real    0m1.028s    ###真实执行时间,等待IO时间,在cpu内核与用户态执行时间
user 0m0.001s    ###用户态cpu执行时间
sys 0m0.003s    ###系统态cpu执行时间

  使用python的time模块

import time

class Timer(object):
def __init__(self, verbose=False):
self.verbose = verbose def __enter__(self):
self.start = time.time()
return self def __exit__(self, *args):
self.end = time.time()
self.secs = self.end - self.start
self.msecs = self.secs * 1000 # millisecs
if self.verbose:
print 'elapsed time: %f ms' % self.msecs

  使用cprofile工具,

 

$python -m cProfile -o result.out xxx.py    ###result.out为保存结果的文件

    使用pstats分析result.out

$python -m pstats result.out 

    结果如下

8 function calls in 0.042 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1 0.000 0.000 0.042 0.042 test.py:5(<module>)
1 0.002 0.002 0.042 0.042 test.py:12(test)
2 0.035 0.018 0.039 0.020 test.py:5(sum_num)
3 0.004 0.001 0.004 0.001 {range}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

    结果列分别为:调用次数,总时间,每次调用平均时间,函数与子函数总时间,函数与子函数平均时间,文件名称,行号

    使用图形化分析工具Gprof2Dot,visualpytune,KCacheGrind分析result.out

$python gprof2dot.py -f pstats result.out | dot -Tpng -o result.png

  工具

  工具line_profiler

    可以分析每行代码的执行时间

  工具memory_profiler

    可以分析每行代码的内存变化

  工具objgraph

    查看内存泄漏

  工具RunSnakeRun:使用图形化分析

$runsnake result.out

  工具KCachegrind  

$apt-get install kcachegrind

    工具Meliae

      首先在你的代码中需要导出内存映像的某时刻,输入以下代码

from meliae import scanner
scanner.dump_all_objects( filename ) # you can pass a file-handle if you prefer

      然后分析导出的镜像

$runsnakemem <filename>

  

如何分析python的性能(linux)的更多相关文章

  1. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  2. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  3. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  4. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  5. 对于Python语音性能的一些个人见解

    虽然运行速度慢是 Python 与生俱来的特点,大多数时候我们用 Python 就意味着放弃对性能的追求.但是,就算是用纯 Python 完成同一个任务,老手写出来的代码可能会比菜鸟写的代码块几倍,甚 ...

  6. 关于Python Profilers性能分析器

    1. 介绍性能分析器 作者:btchenguang profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProf ...

  7. python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...

  8. 如何在Python中使用Linux epoll

    如何在Python中使用Linux epoll 内容 介绍 阻塞套接字编程示例 异步套接字和Linux epoll的好处 epoll的异步套接字编程示例 性能考量 源代码 介绍 从2.6版开始,Pyt ...

  9. Python下调用Linux的Shell命令

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

随机推荐

  1. 657. Judge Route Circle机器人能否返回

    [抄题]: Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this r ...

  2. Mule ESB 安装基本配置要求

    Hardware Requirements* 2GHz, dual-core CPU, or 2 virtual CPUs in virtualized environments 2GB of RAM ...

  3. 19-字符切割函数c++模板

    https://www.cnblogs.com/stonebloom-yu/p/6542756.html #include <cstring> #include <cstdio> ...

  4. Shiro 集成Spring 使用 redis时 使用redisTemplate替代jedisPool(五)

    1.添加依赖架包: <dependency> <groupId>org.springframework.data</groupId> <artifactId& ...

  5. 相机IMU融合四部曲(三):MSF详细解读与使用

    相机IMU融合四部曲(三):MSF详细解读与使用 极品巧克力 前言 通过前两篇文章,<D-LG-EKF详细解读>和<误差状态四元数详细解读>,已经把相机和IMU融合的理论全部都 ...

  6. Openssl pkcs7命令

    一.简介 pkcs7命令用于处理DER或者PEM格式的pkcs#7文件.   二.语法 openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in ...

  7. [C++] Type Conversion(类型转换)

    Type Conversion(类型转换) Two kinds of type conversion explict type conversion(显式类型转换) impict type conve ...

  8. It's not too late to start!

    It's not too late to start! 以此鼓励,希望能坚持下去,一个半路自学PHP的准PHPer!

  9. CMDB和运维自动化

    IT运维,指的是对已经搭建好的网络,软件,硬件进行维护.运维领域也是有细分的,有硬件运维和软件运维 硬件运维主要包括对基础设施的运维,比如机房的设备,主机的硬盘,内存这些物理设备的维护 软件运维主要包 ...

  10. MVC4 WebAPI(一)(转)

    出处:http://www.cnblogs.com/wk1234/archive/2012/04/28/2468491.html 不管是因为什么原因,结果是在新出的MVC中,增加了WebAPI,用于提 ...