当前位置: 首页 > Linux

计算机教育漏课-MIT-L7-调试与性能分析

时间:2023-04-07 01:00:09 Linux

https://missing.csail.mit.edu/https://missing-semester-cn.g...https://www.bilibili.com/vide...notesdebugging打印调试方式与log日志相比有以下优点:可以将日志写入文件、socket甚至发送到远程服务器而不仅仅是标准输出;日志可以支持严重级别(如INFO、DEBUG、WARN、ERROR等),允许您根据需要过滤日志;对于新发现的问题,很可能您的日志中已经包含了足够的信息,可以帮助您定位问题信息。这是一个用于类演示的带有日志记录的Python程序。ls和grep等程序使用ANSI转义码,这是一系列特殊字符,可使您的shell更改其输出的颜色。#!/usr/bin/envbashforRin$(seq020255);为$(seq020255)中的G做;在$(seq020255)中为B做;做printf"e[38;2;${R};${G};${B}m█e[0m";donedoneone第三方日志系统程序的日志通常存储在/var/log大部分Linux系统使用systemd,它是一个系统守护进程,控制着你系统中的很多事情,比如哪些服务应该启动并运行systemd会存储以特殊格式登录/var/log/journal,可以使用journalctl命令显示这些信息macOS系统在/var/log/system.log中,但是使用系统日志的工具较多,其可以使用logshow显示内容。对于大多数UNIX系统,您还可以使用dmesg命令使用logger读取内核日志此shell程序将日志添加到系统日志中有些工具如lnav提供了更好的方式来显示和浏览日志文件Debugger调试器可以:暂停程序当到达某条线时;逐步执行程序;查看程序崩溃后变量的值;当满足某些条件时暂停程序;其他高级功能。常见的调试器有:pdb:Python的调试器ipdb:一个增强的pdb,它使用IPython作为REPL,并启用tab补全、语法高亮、更好的回溯和更好的内省,同时保留与pdb模块gdb相同的接口(及其改进版本pwndbg)和lldb:C和类C语言的调试器,还可以探索任意进程及其机器状态:寄存器、堆栈、程序计数器等。专用工具跟踪普通二进制程序执行的系统调用:strace(Linux)和dtrace(macOS和BSD),一个名为dtruss的包装器使得dtruss具有与strace类似的接口(更多信息请参见此处)网络数据包分析工具:tcpdump和Wireshark网络开发:Chrome/Firefox的开发者工具根据编码规则输入并分析代码的正确性。大多数编辑器和IDE都支持在编辑界面显示这些工具的分析结果(以及样式检查或安全检查),突出显示警告和错误的位置。这个过程通常称为代码检查。静态分析工具pyflakes:Python的静态分析工具mypy:另一个Python静态分析工具,可以对代码进行类型检查black:所有Python风格检查工具gofmt:Go风格检查工具rustfmt:Rust风格检查工具prettier:JavaScript、HTML和CSS风格检查工具bandit:Python安全检查工具Vim代码linting插件alesyntastic性能分析时序最常用的方法是打印两段代码的时间差,得到执行时间(挂钟时间),比如使用Python的time模块。但是,执行时间也可能会产生误导,因为您的计算机可能同时还在运行其他进程,或者可能在这段时间等待。一般来说,用户时间+系统时间代表你的进程实际消耗的CPU(更详细的解释可以参考这篇文章)。实时-从程序开始到结束实际经过的时间,包括其他进程的执行时间和阻塞所花费的时间(例如等待I/O或网络);User-CPU执行用户代码所花费的时间;Sys-CPU执行时间花在系统内核代码上。例如,尝试执行发出HTTP请求并为其添加时间前缀的命令。当网络不好时,您可能会看到以下输出。请求用了2s完成,但是这个过程只用了15ms的CPU用户时间和12ms的CPU内核时间。$timecurlhttps://missing.csail.mit.edu&>/dev/null`real0m2.561suser0m0.015ssys0m0.012s分析工具(分析器)CPURuby&Python分析器如何工作?大多数情况下,当人们提到分析工具时,他们通常指的是CPU分析工具。以Python的性能分析工具为例:跟踪分析器(tracing)cProfile:函数调用的耗时跟踪。请注意,它显示了每个函数调用的时间。它的速度可能看起来违反直觉,特别是如果您在代码中使用第三方库,因为内部函数调用也被视为函数调用line_profiler:LineProfiler。采样(定期监控你的程序,记录程序堆栈)pyflame内存可能存在内存泄漏对于手动管理内存的语言,如C、C++,你可以使用Valgrind等工具检查GC,Python等语言,Java、JavaScript、memoryprofiler也很有用,因为对于一个对象来说,只要有指向它的指针就不会被回收,可以使用memory-profiler来分析Python代码进行内存分析事件分析如前所述早些时候,strace可以用来跟踪程序执行的系统调用,perf命令可以跟踪和报告特定的系统事件,例如缓存局部性差、大量页面错误或活锁。下面简单介绍一下常用命令:perflist——列出pref可以跟踪的事件;perfstatCOMMANDARG1ARG2-收集与进程或指令相关的事件;perfrecordCOMMANDARG1ARG2-记录命令执行的采样信息并将统计数据存储在perf.data中;perfreport-在perf.data中格式化和打印数据。可视化对于采样分析器,常见的CPU分析数据展示形式是火焰图,在Y轴上展示函数调用关系,在X轴上展示耗时比例。调用图和控制流图可以显示子程序之间的关系,以函数为节点,以函数调用为边。调用图与分析器信息(如调用次数、花费时间等)一起使用时会非常有用,它可以帮助我们分析程序的流程。在Python中,您可以使用pycallgraph生成这些图形。资源监控通用监控htop是top的改进版,常用的快捷键有:进程排序,t显示树结构和h打开或折叠线程一览,类似实现但更好的用户界面如有必要,dstat,mergemeasurementprocess,可以实时计算不同子系统资源的测量数据,如I/O、网络、CPU利用率、上下文切换等。I/O操作iotop可以显示实时I/O占用信息,可以查看一个处理起来非常方便无论你是在进行大量的磁盘读写操作,使用df显示每个分区的信息,使用du显示当前目录下每个文件的磁盘使用情况(diskusage)。-h选项允许命令以更人性化的格式显示数据。ncdu是一个更具交互性的du,可以在不同的目录中导航并删除文件和文件夹。Memory使用free显示系统当前可用的内存。内存,也可以使用htop之类的工具来显示打开的文件lsof可以列出进程打开的文件的信息。当我们需要检查某个文件是由哪个进程打开时,这个命令非常有用;网络连接和配置ss可以帮助我们监控网络包的发送和接收以及网络接口的显示信息。ss的一个常见的使用场景是查找端口进程占用的信息ip命令可以显示路由、网络设备和接口信息netstat和ifconfig这两个命令已经被之前的工具所取代网络使用nethogs和iftop非常好监控网络占用的交互式工具命令行工具如果你想测试这些工具,你可以使用stress命令来人为地加载系统。hyperfine等命令行工具可以帮助您快速进行基准测试。例如,在我们关于shell工具和脚本的课程中,我们建议使用fd而不是find。我们可以在这里使用hyperfine来比较它们。$hyperfine--warmup3'fd-ejpg''查找.-iname"*.jpg"'浏览器(比如Chrome和Firefox)也包含了很多不错的性能分析工具,可以用来分析页面加载,让我们可以弄清楚时间都花在了哪些地方(加载、渲染、脚本等)。课后练习调试练习2学习本pdb练习教程,熟悉相关命令。有关更深入的信息,您可以参考本教程。练习3安装Vim的ale插件后:修改后:forfin$(glob'*.m3u')dogrep-qi"hq.*mp3""$f"\&&echo"Playlist$fcontainsaHQfile以mp3格式”完成练习4阅读可逆调试并尝试创建一个工作示例(使用rr或RevPDB)。PerformanceAnalysisExercise2Simplerecursivecallgraph:Recursivecallgraphwithmemo:Exercise3Exercise4执行stress-c3时,在htop中可以看到三个CPU核心在满负荷工作(不一定是0,1,2这三个).在执行taskset--cpu-list0,2stress-c3时,在htop中可以看到stress程序只占用0和2两个CPU,这是taskset命令的参数指定的。如果改成taskset--cpu-list0-2stress-c3,会占用0,1,2三个CPU。使用cgroups实现同样的操作:参考Cgrouplimitcpuusageandmanagecpuresourceswithcgroups。