调试及性能分析
调试代码
打印调试法与日志
日志较普通的打印语句的优势:
- 可以将日志写入文件、socket或者甚至是发送到远端服务器而不仅仅是标准输出
- 日志可以支持严重等级,这使您可以根据需要过滤日志
- 对于发现新问题,很有可能日志中已经包含了可以帮助您定位问题足够的信息
第三方日志系统
对于UNIX系统来说,程序的日志通常存放在/var/log
大多数Linux系统都会使用systemd
,这是一个系统守护进程。systemd
会将日志以某种特殊格式存放于/var/log/journal
,可以使用journalctl
命令来显示这些消息。
大多数UNIX系统,可以使用dmesg
命令来读取内核的日志
调试器
调试器是一种可以允许我们和正在执行的程序进行交互的程序,它能做到:
- 当到达某一行时将程序暂停
- 一次一条指令地逐步执行程序
- 程序崩溃后查看变量的值
- 满足特定条件时暂停程序
- 其他高级功能
python的调试器是pdb
专门工具
当程序需要执行一些只有操作系统内核才能完成的操作时,它需要使用系统调用
在Linux中可以使用strace
静态分析
静态分析会将程序的源码作为输入然后基于编码规则对其进行分析并对代码的正确性进行推理。
性能分析
需要性能分析和监控工具,它们会帮助您找到程序中最耗时、最耗资源的部分,这样就可以有针对性的进行性能优化。
计时
真实时间、用户时间、系统时间
- 真实时间:从程序开始到结束流失掉的真实时间,包括其他进程的执行时间以及阻塞消耗的时间
- User:CPU执行用户代码所花费的时间
- Sys:CPU执行系统内核代码所花费的时间
性能分析工具
CPU
CPU性能分析工具有两种:追踪分析器及采样分析器
内存
可以使用Valgrind
这样的工具来检查内存泄漏的问题。
对于 Python 这类具有垃圾回收机制的语言,内存分析器也是很有用的,因为对于某个对象来说,只要有指针还指向它,那它就不会被回收。
事件分析
perf
命令将CPU的区别进行了抽象,它不会报告时间和内存的消耗,而是报告与您的程序相关的系统事件。
可视化
对于采样分析器来说,常见的显示CPU分析数据的形式是火焰图。火焰图同时还是可交互的,您可以深入程序的某一具体部分,并查看其栈追踪。
调用图和控制流图可以显示子程序之间的关系,它将函数作为节点并把函数调用作为边。
资源监控
- 通用监控
- I/O操作
- 磁盘使用
- 内存使用
- 打开文件
- 网络连接和配置
- 网络使用
专用工具
您只需要对黑盒程序进行基准测试,并依此对软件选择进行评估。 类似hyperfine
这样的命令行可以帮您快速进行基准测试。