一.多进程:

  查看程序所有进程与线程

  如果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. ElasticSearch删除type

    ElasticSearch版本5.X删除type操作 # index_name是index / type_name是type curl -XPOST -u user 'localhost:9200/i ...

  2. Ubuntu16.0安装Eclipse Neon

    eclipse在Ubuntu下安装先安装jdk,配置环境变量,之后下载eclipse安装包,解压,放置在目标目录,将jre链接到该目录或者将jdk下的jre目录复制到eclipse安装包目录下,双击文 ...

  3. Centos6.6升级python2到python3

    系统更新部分: 一.由于系统原有的源无法连接,需要更新为新的源.起初,首选163的源,但是由于更改源以后,无法使用yum等问题,所以直接使用上海交通大学提供的源. 修改前,将原来/etc/yum.re ...

  4. cJSON结构体构建

    cJSON结构体构建 一:cJSON的构建. int create_objects() { cJSON *root, *fmt, *img, *thm, *fld; char *out; int i; ...

  5. thinkpad t480s重装win10后小红点失灵 无法启用

    问题描述: thinkpad t480s重装win10纯净版系统后,小红点失效,控制面板中Track Point设置页面被禁用. 解决方法: 可打开下述网址,下载并安装TrackPoint Firmw ...

  6. crontab定期执行shell脚本

    [场景]: 需要定期运行Hadoop的MapReduce [解决办法]: 编写一个运行MapReduce的Shell脚本.然后使用crontab配置定时任务. [Shell脚本] #!/usr/bin ...

  7. Spring Boot利用poi导出Excel

    至于poi的用法就不多说了,网上多得很,但是发现spring boot结合poi的就不多了,而且大多也有各种各样的问题. public class ExcelData implements Seria ...

  8. 2015-08-13T17:39:15

    ACTION里 Date upateTime; 有setter getter 页面字符串 是'2015-08-13T17:39:15' 该字符串可以直接映射成Date .

  9. 大致(主要hadoop)软件下载地址

    jdk-8u181-linux-x64.tar.gz https://www.oracle.com/technetwork/java/javase/downloads/index.html hadoo ...

  10. [修正] Firemonkey Windows 控件有虚线残影问题

    说明:在 Wndows 显示时,有时控件左方会显示一条虚线 适用:Firemonkey Windows (Berlin 或更高版) 修正方法: 请将源码 FMX.Canvas.D2D.pas 复制到自 ...