出于对Linux操作系统的兴趣和对底层知识的强烈渴望,特编译本文。这篇文章也可以作为考基础知识的指标,文章涵盖了一个系统的方方面面。没有扎实的计算机系统知识、网络知识和操作系统知识,是不可能完全掌握文档中的工具的。此外,系统性能分析和优化是一个长期系列。本文档主要结合Netflix高级性能架构师Linux专家BrendanGregg更新Linux性能调优工具的博文,收集了Linux系统性能优化相关文章。主要结合博文中涉及的原理和性能测试工具。背景知识:拥有背景知识是分析性能问题时需要知道的。比如硬件缓存;另一个例子是操作系统内核。应用程序的行为细节往往与这些东西交织在一起。这些底层的东西会以意想不到的方式影响应用程序的性能。比如有些程序不能充分利用缓存,导致性能下降。比如无谓地调用过多的系统调用,导致频繁的内核/用户切换等。这只是为本文后续内容做铺垫。调音的东西还是很多的。我知道的不比我知道的多。希望大家一起学习,共同进步。性能分析工具先看一张图:上图是BrendanGregg的性能分析分享,里面的所有工具都可以通过man帮助文档获取,下面问题简单介绍下一般用法:vmstat–虚拟内存统计vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中常用的内存监控工具,可以监控操作系统的虚拟内存、进程、CPU等的整体情况。vmstat常规用法:vmstatintervaltimes表示每隔interval秒采样一次,共times采样次数,如果省略times,则一直采集数据,直到用户手动停止。一个简单的例子:你可以使用ctrl+c来停止vmstat收集数据。***行显示系统自启动以来的平均值。第二行开始显示现在正在发生的事情。下一行将显示每5秒发生的情况。每一列的含义在头部,如下所示:procs:r列表示有多少进程在等待cpu,b列表示有多少进程处于不可中断睡眠状态(等待IO)。memory:swapd列显示有多少块已从磁盘换出(页面交换),其余列显示有多少块空闲(未使用),有多少块用作缓冲区,以及有多少块正在使用操作系统缓存。swap:显示交换活动:每秒有多少块被换入(从磁盘)和换出(到磁盘)。io:显示从块设备读取(bi)和写入(bo)的块数,通常反映硬盘I/O。system:显示每秒的中断(in)和上下文切换(cs)的数量。cpu:显示所有cpu时间花在各种操作上的百分比,包括执行用户代码(非内核)、执行系统代码(内核)、空闲和等待IO。内存不足性能:freememory急剧减少,回收buffer和cacher无济于事,大量使用swap分区(swpd),频繁的pageswapping(swap),读写磁盘(io)数量增加,pagefault中断(在)。切换次数(cs)增加,等待IO的进程数(b)增加,大量CPU时间用于等待IO(wa)iostat——用于报告中央处理器统计信息iostat用于报告整个系统、适配器、tty设备、磁盘和CD-ROM的中央处理单元(CPU)统计信息和输入/输出统计信息。默认情况下,显示与vmstat相同的cpu使用信息。使用以下命令显示扩展设备统计信息:第一行显示sincesystemstartupTheaveragesincethen显示增量的平均值,每个设备一行。Linux常用磁盘IO指标的缩写习惯:rq是request,r是read,w是write,qu是queue,sz是size,a是verage,tm是time,svc是service。rrqm/s和wrqm/s:每秒合并的读取和写入请求。“合并”是指操作系统从队列中取出多个逻辑请求,合并为一个请求到实际磁盘。r/s和w/s:每秒发送到设备的读写请求数。rsec/s和wsec/s:每秒读写的扇区数。avgrq–sz:请求的扇区数。avgqu–sz:设备队列中等待的请求数。await:每次IO请求所花费的时间。svctm:实际请求(服务)时间。%util:花费在至少一个活动请求上的时间百分比。dstat–系统监控工具dstat显示CPU使用率、磁盘io状态、网络数据包发送状态和页面切换状态。输出是彩色的和可读的。相比vmstat和iostat的输入,更加详细直观。使用时直接输入命令即可,当然也可以使用具体的参数。如下:dstat–cdlmnpsyiotop–LINUX进程实时监控工具iotop命令是显示硬盘IO的专用命令。界面风格类似于top命令,可以显示IO负载是由哪个进程产生的。它是用于监视磁盘I/O使用情况的顶级工具。它有一个类似于top的UI,包括PID、用户、I/O、进程等相关信息。可以非交互方式使用:iotop–bodinterval,查看各个进程的I/O,可以使用pidstat,pidstat–dinstat。pidstat——监控系统资源状态pidstat主要用于监控所有或指定进程占用系统资源的情况,如CPU、内存、设备IO、任务切换、线程等。使用方法:pidstat–dinterval;pidstat也可以用来统计CPU的使用信息:pidstat–uinterval;统计内存信息:pidstat–r区间。toptop命令的汇总区显示了五个方面的系统性能信息:负载:时间、登录用户数、平均系统负载;进程:运行、休眠、停止、僵尸;cpu:用户态、核心态、NICE、空闲、等待IO、中断等;内存:总计、已用、空闲(系统角度)、缓冲区、缓存;swap分区:total、used、idle任务区默认显示:进程ID、有效用户、进程优先级、NICE值、进程使用的虚拟内存、物理内存和共享内存、进程状态、CPU占用率、内存占用率、累计CPU时间,并处理命令行信息。htophtop是Linux系统的交互式进程查看器,文本模式应用程序(在控制台或X终端中),需要ncurses。Htop允许用户交互操作,支持颜色主题,可以水平或垂直滚动??进程列表,支持鼠标操作。与top相比,htop有以下优点:可以水平或垂直滚动??进程列表,查看所有进程和完整的命令行。在启动时,它比top快。杀进程时不需要输入进程号。htop支持鼠标操作。mpstatmpstat是MultiprocessorStatistics的缩写,是一个实时系统监控工具。它报告有关CPU的一些统计信息,这些信息存储在/proc/stat文件中。在多CP??U系统中,不仅可以查看所有CPU的平均状态信息,还可以查看特定CPU的信息。常用用法:mpstat–PALL间隔时间。netstatnetstat用于显示IP、TCP、UDP和ICMP协议相关的统计数据,一般用于查看本机各端口的网络连接状态。常用用法:netstat–npl可以查看你要打开的端口是否已经打开。netstat-rn打印路由表信息。netstat-in提供系统的接口信息,打印每个接口的MTU、输入数据包数、输入错误、输出数据包、输出错误、冲突和当前输出队列长度。ps–显示当前进程的状态ps参数太多,具体用法可以参考manps,常用方法:psaux#hsserver;ps–ef|grep#hundsun杀程序的方法:psaux|grepmysqld|grep–vgrep|awk'{print$2}'xargskill-9杀死僵尸进程:ps–eal|awk'{if($2=="Z"){print$4}}'|xargskill-9stracetracer执行过程中产生的系统调用和接收到的信号有助于分析程序或命令执行过程中遇到的异常情况。示例:查看mysqld在linux上加载了哪个配置文件,可以运行如下命令:strace–estat64mysqld–print–defaults>/dev/nulluptime可以打印系统总运行时间和系统平均负载,uptime命令***输出的三个数字的含义分别是系统在1分钟、5分钟、15分钟内的平均负载。lsoflsof(listopenfiles)是一个列出当前系统打开文件的工具。您可以通过lsof工具查看此列表,以对系统进行检测和故障排除。常用用法:查看文件系统阻塞lsof/boot查看端口号被哪个进程占用lsof-i:3306查看用户打开了哪些文件lsof–uusername查看哪些进程打开了文件lsof–p4838查看远程打开的网络链接lsof–i@192.168.34.128perfperf是Linux内核内置的系统性能优化工具。优势在于与LinuxKernel的紧密结合。可充分应用于Kernel新增功能,查看热点功能和cashmiss率,从而帮助开发者优化程序性能。perf、Oprofile等性能调优工具的基本原理是对被监控对象进行采样。最简单的情况是根据tick中断进行采样,即在tick中断内触发采样点,在采样点判断程序的当前上下文。如果一个程序90%的时间花在函数foo()上,那么90%的采样点应该落在函数foo()的上下文中。运气是不可预测的,但我觉得只要采样频率足够高,采样时间足够长,那么以上推论还是比较靠谱的。因此,通过tick触发采样,我们可以了解程序中哪些地方消耗的时间最多,从而可以重点分析。更深入的了解这个工具可以参考:http://blog.csdn.net/trochiluses/article/details/10261339总结:结合以上常用的性能测试命令,联系性能分析工具的图在文章开头,大家可以开始了解在性能分析过程中使用哪方面的工具(命令)来了解哪方面的性能。常用的性能测试工具熟练掌握第二部分的性能分析命令工具,介绍几种性能测试工具。性能诊断工具,由内核社区维护和开发。Perf不仅可以用于应用程序的性能统计分析,还可以用于内核代码的性能统计和分析。更多参考:http://blog.sina.com.cn/s/blog_98822316010122ex.html。eBPFtools:使用bcc的性能跟踪工具,eBPFmap可以广泛用于使用自定义eBPF程序的内核调优,也可以读取用户级异步代码。重要的是这个外部数据可以在用户空间中管理。这种k-v格式的地图数据体是通过在用户空间调用bpf系统调用进行创建、添加、删除操作来管理的。更多:http://blog.csdn.net/ljy1988123/article/details/50444693。perf-tools:一套基于perf_events(perf)和ftrace的Linux性能分析和调优工具。Perf-Tools依赖库少,使用方便。支持Linux3.2及以上内核版本。更多:https://github.com/brendangregg/perf-tools。bcc(BPFCompilerCollection):一个使用eBPF的perf性能分析工具。用于创建高效内核跟踪和操作程序的工具包,包括几个有用的工具和示例。利用ExtendedBPF(BerkeleyDataFilter),正式名称为eBPF,这是Linux3.15中首次添加的新功能。多用途需要Linux4.1或更高版本BCC。更多参考:https://github.com/iovisor/bcc#tools。ktap:一个新的linux脚本动态性能跟踪工具。允许用户跟踪Linux内核动态。ktap被设计为可互操作的,允许用户调整操作洞察力、故障排除和扩展内核和应用程序。它类似于Linux和SolarisDTraceSystemTap。更多参考:https://github.com/ktap/ktap。FlameGraphs:是一款使用perf、systemtap和ktap可视化的图形软件,可以快速准确地识别最频繁的代码路径,可以使用github.com/brendangregg/flamegraph中的开源代码生成。更多参考:http://www.brendangregg.com/flamegraphs.html。1.Linux可观察性工具|Linux性能观察工具首先要学习的基本工具有:uptime、top(htop)、mpstat、isstat、vmstat、free、ping、nicstat、dstat。高级命令如下:sar、netstat、pidstat、strace、tcpdump、blktrace、iotop、slabtop、sysctl、/proc。更多参考:http://www.open-open.com/lib/view/open1434589043973.html,详细的命令用法可以参考man2,Linuxbenchmarkingtools|Linuxperformanceevaluationtool是一款性能评估工具,针对不同的模块可以使用相应的工具进行性能测试。如需深入了解,请参阅下面的附件。3.Linux调优工具|Linux性能调优工具是一款性能调优工具,主要从linux内核的源代码层进行调优。如果您想了解更多信息,可以参考下面的附件。4.Linux可观察性sar|linux性能观察工具sar(SystemActivityReporter系统活动报告)是目前LINUX上最全面的系统性能分析工具之一。它可以从多个方面报告系统活动,包括:文件读取写入状态、系统调用使用情况、磁盘I/O、CPU效率、内存使用情况、进程活动和IPC相关活动。sar常用的使用方式:sar[options][-A][-ofile]t[n]其中:t为采样间隔,n为采样次数,默认值为1;-ofile表示将命令结果转换成二进制格式存储在files中,其中file是文件名。options为命令行选项,更多参考:http://blog.csdn.net/mig_davidli/article/details/52149993
