后台故障&性能分析常用工具
说明
本文是一个归纳总结,把常用的一些指令,及它们常用的option简单记录了一下,目的是当我们需要工具去定位问题的时候,能够从中找到合适的工具,具体的用法网上有很多博文了,当然还有man手册。参考了一些博客和网站的内容,为了阅读体验,将原文链接均放置在了文末。水平有限,难免有差错,欢迎指出。(此文写于2016年,2018再次回顾发现有不少理解错误的地方,同时归纳的也不全,日后再重新整理)
目录
- top
- 简介
- option解释
- iotop
- 简介
- option解释
- netstat
- 简介
- option解释
- ss
- 简介
- option解释
- vmstat
- 简介
- option解释
- ltrace
- 简介
- option解释
- strace
- 简介
- option解释
- tcpdump
- 简介
- option解释
- ngrep
- 简介
- option解释
- gdb
- 简介
- 常用指令
- 其它
top
简介
top命令用于实时显示系统中各进程的资源占用情况
top关键参数解释
```
1 top - 15:08:41 up 193 days, 3:01, 12 users, load average: 0.01, 0.04, 0.05
2 Tasks: 254 total, 1 running, 253 sleeping, 0 stopped, 0 zombie
3 Cpu(s): 0.3%us, 0.2%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
4 Mem: 16170624k total, 15668840k used, 501784k free, 5233320k buffers
5 Swap: 2104508k total, 142188k used, 1962320k free, 6907808k cached
6
7 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
```
系统整体信息
- 15:08:41 : 系统时间
- up 193 days, 3:01 : 系统运行时间
- 12 users : 当前有12个用户登录了系统
- load average: 系统负载,这三个值从右往左看可以大致清楚系统负载的变化趋势,值越小说明系统负载越趋良好 [关于load average的介绍][1]
- taks: total即进程总数,runing,sleeping,stopped,zombie分别表示各状态的进程数,zombie即僵尸进程数,由子进程结束但是父进程未回收产生,将会占用进程号,不利于调度,太多的话甚至可能导致无法产生新的进程,可通过ps结合kill命令干掉它们,必要时还有它们的父进程
- Mem:内存状况,total即总量,used代表使用中的,free代表空闲状态的,buffers主要用于存储文件信息
- Swap:交换空间(位于硬盘),内存以分页的形式进行访问,物理内存中被淘汰的页面将会放在这一空间中,用于释放内存,加载新的页面。顾名思义,total是交换空间总量,used为已使用的,free为空闲状态,cached主要用于缓存文件数据
系统可用内存的近似计算公式:Mem的free + Mem的buffers + Swap的cached
CPU各参数解释
- us:用户态进程占用cpu的百分比
- sy:内核占用cpu的百分比
- ni:优先级改变过的进程占用cpu的百分比
- id:空闲cpu百分比
- wa:io等待占用cpu的百分比
- hi:硬中断占用cpu的百分比
- si:软中断占用cpu的百分比
- st:steal time,主机上别的虚拟机所占用的cpu百分比。[点击参看Hypervisor][2]
各进程信息
- PID:进程id
- USER:进程所属用户
- PR:进程的优先级,默认为20,值越低,优先级越高
- NI:nice值,一般情况下PR值 = nice值 + 20
- VIRT:进程使用的虚拟内存总量
- RES:进程使用的未被换出的物理内存大小
- SHR:共享内存大小
- S:进程状态,D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU:上次更新到现在的cpu时间占用百分比
- %MEM:进程使用的物理内存百分比
- TIME+:进程使用的cpu时间总结,单位1/100秒
- COMMAND:进程名
option解释
版本不同可能导致支持的option有差别,常用的大概有如下
- -a 按内存占用来排序
- -b 批处理模式,该模式常用于将top命令得到的信息写到文件中或者被其他程序处理
- -c 显示完整的进程名(命令行)
- -d 设置屏幕刷新间隔
- -n 循环显示的次数
- -p 指定进程
- -u 指定用户
- -M 内存单位使用K/M/G,默认只有K
- -S 累计模式,会把已完成的子进程占用的CPU时间累计到父进程中
默认是以cpu占用百分比来排序的,通过 Shift + < 或者 Shift + > 可以调整按什么来排序。另外在多核机器上按1可以显示每个cpu的状况
top下的交互命令,常用的有如下
- q - 退出程序
- k - 干掉一个进程
- u - 选择只显示某个用户的进程
- r - 修改某个进程的nice值,间接修改了进程的优先级
iotop
简介
iotop是用于监视各进程磁盘i/o状况的工具,与top命令类似,输入iotop命令,可以看到头两行如下所示
```
Total DISK READ: 0.00 B/s | Total DISK WRITE: 312.13 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
第一行顾名思义,简单解释一下第二行
* TID:线程id,该栏可以调整显示进程id
* PRIO:磁盘io优先级,磁盘io优先级是值越大,优先级越高,与进程调度优先级相反
* USER:即进程所属用户
* DISK READ:即磁盘读取速率
* DISK WRITE:磁盘写入速率
* SWAPIN:该取样周期内磁盘数据换入内存所花时间百分比
* IO>:该取样周期内io等待所花时间百分比
<h3 id = "2.2">option解释</h3>
* -o 只展示该周期内在进行io的进程或者线程
* -b 同top,开启批处理模式,主要是为了将信息写入文件或者交给其它程序处理
* -n 同top,设置刷新次数
* -d 同top,设置刷新间隔
* -p 同top,指定进程
* -P 显示进程id,默认是显示线程id
* -u 同top,指定用户
* -a 显示自命令开启以来,进程或者线程的io总量,默认情况下是显示该取样周期内的数据
iotop下的交互命令,常用的有如下
* r - 反向排序,默认是从大到小排
* o - 同option中的-o
* p - 进行切换,显示进程id或者显示线程id
* a - 同option中的-a
* i - 改变线程或者进程的io优先级
* q - 退出
---
<h1 id = "3">netstat</h1>
<h3 id = "3.1">简介</h3>
netstat用于显示各种网络相关的信息,输入netstat后,可以看到信息一共分为两类来进行显示
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
.....
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
...
第一类是网络套接字,第二类是Unix域套接字,只能用于本机通信,但性能比网络套接字要好,关于Unix域套接字可以google相关信息。Recv-Q和Send-Q需要关注一下,如果值过大的话说明有大量网络包堆积在队列中
<h3 id = "3.2">option解释</h3>
netstat命令常用的option有如下
* -a 显示所有状态的socket,默认情况下Listen状态的socket是不会显示的
* -c 每隔一段时间执行一次netstat命令
* -n ip和端口均显示数字,而不是别名
* -t 仅显示tcp协议的socket
* -u 仅显示udp协议的socket(该选项需要配合-a或者-l来用,不然是没有信息展示的)
* -l 仅显示Listen状态的socket
* -p 显示保持该连接的进程名
* -r 显示路由信息
* -s 分协议来显示统计信息
---
<h1 id = "4">ss</h1>
<h3 id = "4.1">简介</h3>
显示socket统计信息,显示的内容和netstat类似,但是比netstat快,当服务器socket连接数很大的时候,建议使用ss命令,同时能够得到更多的跟socket相关的信息。Recv-Q和Send-Q需要关注一下,如果值过大的话说明有大量网络包堆积在队列中。输入ss,可以看到如下内容
State Recv-Q Send-Q Local Address:Port Peer Address:Port
...
常用的option是ss -s,可以统计当前socket使用状况,如
Total: 214 (kernel 0)
TCP: 50 (estab 26, closed 15, orphaned 0, synrecv 0, timewait 15/0), ports 0
Transport Total IP IPv6
0 - -
RAW 0 0 0
UDP 23 23 0
TCP 35 33 2
INET 58 56 2
FRAG 0 0 0
<h3 id = "4.2">option解释</h3>
常用的option有如下
* -n 同netstat的-n,数字化ip/port
* -o 显示tcp的计时器信息,关于tcp的计时器信息[TCP的四种定时器][3]
* -a 展示所有套接字,包括listen状态和established状态的
* -l 仅展示listen状态的套接字
* -t 只展示tcp套接字
* -u 只展示udp套接字
* -d 只展示dccp套接字
* -w 只展示raw套接字
* -x 只展示unix域套接字
* -4 只展示ipv4的套接字
* -6 只展示ipv6的套接字
ss的强大之处还在于它可以对socket信息进行过滤,包括state,src,dst,sport,dport等,详细请参考[ss命令][4]
---
<h1 id = "5">vmstat</h1>
<h3 id = "5.1">简介</h3>
vmstat是信息更加全面的监控工具,通过它可以查看机器的整体状况,包括cpu使用率,内存使用,磁盘io等。
输入vmstat可以看到如下信息
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
...
* r 表示运行队列中的进程数
* b 表示阻塞中的进程数,即进程状态为ps命令中的D状态,不可中断睡眠状态中的进程数,多为等待io
* swpd 表示已经使用的交换分区大小,该值可对应到top命令中Swap中的used
* buff 表示用为缓存的内存大小,该值可对应到top命令中Mem中的buffers
* cache 表示交换空间位于内存中的缓存大小,该值可以对应到top命令中Swap中的cached
* si 每秒从交换空间换入内存中的大小
* so 每秒从内存中写入到交换空间中的大小
* bi 每秒读取的块数量,这个数字乘以块大小差不多就是磁盘读取速度
* bo 每秒写入的块数量,这个数字乘以块大小差不多就是磁盘写入速度
* in 每秒的中断数,包括时钟中断
* cs 每秒的上下文切换数
* us 用户进程消耗的cpu时间百分比
* sy 内核占用cpu时间百分比
* id 空闲cpu时间百分比,这个时间包括了
* wa io等待占用的cpu时间百分比
* st steal time,主机上别的虚拟机所占用的cpu百分比
<h3 id = "5.2">option解释</h3>
常用的option有如下
* -a 显示活动内存和非活动内存的大小,在linux内核中的内存页面LRU算法中,有两种LRU list,一种是active list,一种是inactive list,刚访问过的页面放进active list中,长时间未访问过的页面放进inactive list中。[详情点击 active/inactive memory][5]
* -t 将时间戳也一同显示出来
* -S 后面跟k或者m,调整显示单位为kb还是mb,默认为k
* delay delay为一个数字,用于设置信息展示间隔
* count count为一个数字,用于设置展示几次信息,默认值为无穷大。示例
vmstat 2 4
为两秒展示一次信息,共展示4次
---
<h1 id = "6">ltrace</h1>
<h3 id = "6.1">简介</h3>
追踪进程的库函数调用,一般用来辅助调试,查找性能瓶颈,比如对helloworld程序调用ltrace命令,结果示例
ltrace -T ./hello
__libc_start_main(0x4004c4, 1, 0x7fffc0aced48, 0x4004f0, 0x4004e0 <unfinished ...>
puts("hello world"hello world
) = 12 <0.000125>
+++ exited (status 0) +++
等号左边是函数名即相应的参数,右边是返回值,这里输入了-T,会显示该调用所消耗的时间,位于尖括号内,单位是秒
<h3 id = "6.2">option解释</h3>
常用的大概有如下
* -c 输出统计信息,包括函数的耗时,调用次数等
* -e 只追踪指定的函数,示例
ltrace -e puts ./xx
表示只追踪puts函数调用
* -l 只追踪指定的库中的函数
* -L 不展示库函数调用,一般配合-S使用
* -S 显示系统调用,默认是不显示
* -T 显示调用所耗时间
* -r 每行前面显示一个相对时间戳
* -t 每行前面显示当前的时间(咋一看跟-r似乎一样的,man ltrace,再动手试试就清楚了)
* -tt 同-t,时间精确到ms
* -ttt 同-tt,不过变成了秒的形式
* -p 追踪指定的进程
---
<h1 id = "7">strace</h1>
<h3 id = "7.1">简介</h3>
追踪进程的系统调用,一般用来辅助调试,查找性能瓶颈,使用起来跟ltrace类似,不过多阐述了
<h3 id = "7.2">option解释</h3>
常用的有如下
* -c 输出统计信息,包括函数的耗时,调用次数,错误次数等
* -e 作用和ltrace的-e一样,不过使用上更丰富,具体参考man strace
* -T 显示调用所耗时间
* -r 每行前面显示一个相应的时间戳
* -t 每行前面显示当前的时间
* -tt 同-t,时间精确到ms
* -ttt 同-tt,不过变成了秒的形式
* -p 追踪指定的进程
---
<h1 id = "8">tcpdump</h1>
<h3 id = "8.1">简介</h3>
这个不必多说,神器之一,tcpdump有很多高级用法,但是这里只简单介绍基础应用
<h3 id = "8.2">option解释</h3>
只介绍几个最常用的
* -A 以ASCII码打印出包的具体信息来
* -nn 以端口号,ip来显示,而不是主机名和服务名称
* -i 后面跟想要监听的网络接口,如eth1
* -w 后面接文件名,将抓去到的信息都写入该文件中
* -c 抓取的数据包数,抓到这么多之后就停止抓取,默认是一直抓下去的
一般我们都会对网络包进行一些筛选,常用的关键字有如下
* 指定属性
如 host,port,分别用于指定ip和端口
* 指定传输方向
如 src , dst
* 指定协议
如 tcp , udp
这些关键字可以用 !, || ,&& 来进行组合。从而构造出更强大的筛选条件
上面这些都是最基础的应用,更强大的过滤技巧参照链接[tcpdump高级过滤技巧][6]
---
<h1 id = "9">ngrep</h1>
<h3 id = "9.1">简介</h3>
抓包利器,非常实用的一个工具,就像用grep匹配文本一样来匹配网络包
<h3 id = "9.2">option解释</h3>
常用的指令有如下
* -d 指定网络接口,如any或者eth1
* -W byline,解析包中换行符,更人性化的显示数据
* -q 静默模式,如果不打开此模式,未匹配的包将会以#打印出来
ngrep同样支持src,dst,port,host等关键字来对数据包进行过滤,比如说我有一个cgi接口,接口名叫hello_world,proxy监听的端口为8080,可以输入以下命令来匹配请求该接口的网络包
sudo ngrep -q -d any -W bylne 'hello_world' 'dst port 8080'
---
<h1 id = "10">gdb</h1>
<h3 id = "10.1">简介</h3>
这个不必多说,调试神器,这里只是粗浅介绍
<h3 id = "10.2">常用指令</h3>
调试程序的时候最常用的几个
* l 展示源码
* i 查看已设置的指令,如i b 是查看已设置的断点
* b 设置断点,除了指定符号,也可以指定文件的代码行数
* r 启动程序
* n 在进入断点后,执行下一行代码
* s 在进入断点后,执行下一行代码,与n的区别是:如果是有函数的话会进入到函数中
* p 打印某个变量的值,也可以打印寄存器的值如p /x $eax
* watch 设置观察点,值有变化时,停住程序,类似的还有rwatch,awatch等,详情man gdb
* catch 设置捕捉点,指定的事件发生时,停住程序,详情man gdb
* bt 查看堆栈
* disassembly 反汇编,查看当前桢的汇编码
对于处于进入断点的程序,或者调试core文件时,可以输入bt,查看当前堆栈,也可以指定显示多少层堆栈,如
bt -3
则显示3层(如果有3层的话)
输入bt时,顶层的栈即第0层,也就是程序当前所处的栈,如果需要切换到别的层,可以输入f 加上对应的层数,即
f n
n是一个从0开始的整数,0即栈顶也就是第一层,1即第二层,也可以输入up或者down加上n来进行上下切换
对于已经在运行中的程序,可以使用如下命令来进行调试
gdb ProgramFile Pid
如:
gdb hello 19202
值得注意的是要使用gdb调试程序的话,程序在编译阶段最好加上-g选项,生成调试信息供gdb使用。同时产生core文件时,可以简单的用如下指令来查看core时的堆栈,一般情况下根据core时的堆栈就能定位到问题。需要注意生成的core文件是否被截断,如果被截断可以通过ulimit -c [数值/unlimited] 来设置一个合理的值
gdb ProgramFile CoreFile
如:
gdb hello core_hello
<h1 id = "11">其它</h1>
比较常用的命令还有nm,readelf,objdump三个,这三个命令都是用于分析elf文件,包括查看文件头,符号,各个section的信息,反汇编等等,功能非常强大。举个例子,我们的程序在链接过程中,如果代码规范做的不好,又或者自己私自拷贝了一份公共库中的代码至本地目录,且对其中函数做了修改,在链接的时候是很容易出现符号覆盖的问题的,导致程序运行出错,通过这几个命令可以分析出程序链接的使用的是哪个库中的符号。这里只做个记录。不再对它们阐述。
---
### 参考博文链接
top指令解析:http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html
swap交换空间:https://wiki.archlinux.org/index.php/Swap_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
关于top指令中的PR与NI以及RT: https://www.quora.com/What-is-the-difference-between-the-NI-and-PR-values-in-the-top-1-commands-output
ss命令:http://www.cnblogs.com/peida/archive/2013/03/11/2953420.html
[1]: http://heipark.iteye.com/blog/1340384
[2]: https://zh.wikipedia.org/wiki/Hypervisor
[3]: http://blog.csdn.net/macrossdzh/article/details/5967676
[4]: http://www.ttlsa.com/linux-command/ss-replace-netstat/
[5]: http://linuxperf.com/?p=97
[6]: http://blog.csdn.net/lepton126/article/details/8162926
后台故障&性能分析常用工具的更多相关文章
- Linux性能分析命令工具汇总
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
- Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档
Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm # 它用来在基于 Linux的系统上获取或 ...
- JavaScript 性能分析新工具 OneProfile
OneProfile 是一个网页版的小工具,可以用全新的方式展示 JavaScript 性能分析的结果,帮助开发者洞悉函数调用关系,优化应用性能. 点击打开 OneProfile 背景 Chrome ...
- linux 性能分析常用命令汇总
CPU性能分析工具: vmstatpssartimestracepstreetop Memory(内存)性能分析工具:vmstatstracetopipcsipcrmcat /proc/meminfo ...
- Android性能分析Systrace工具
一.概述 保证系统流畅度,也就是保证系统能连续不间断地提供每秒60帧的运行状态.当出现掉帧时(也可称为Jank),需要知道当前整个系统所处的状态,systrace便是最佳的选择,它能手机检测Andro ...
- Linux Performance Analysis and Tools(Linux性能分析和工具)
首先来看一张图: 上面这张神一样的图出自国外一个Lead Performance Engineer(Brendan Gregg)的一次分享,几乎涵盖了一个系统的方方面面,任何人,如果没有完善的计算系统 ...
- Linux测试硬盘读性能的常用工具-hdparm
通常情况下可以使用fdisk.df等命令查看硬盘的分区情况以及当前已使用空间大小.剩余空间大小等信息.但是如果要查看硬盘的硬件信息如 硬盘型号.序列号.已运行时间等信息该用什么工具查看呢? 在Linu ...
- 性能分析之工具使用——cpu、io 、mem【工具分析】
nmon nmon 是一种在aix 与各种 Linux 操作系统上广泛使 用的监控与与分析工具,他主要记录以下内容: • cpu 占用率 • 内存使用情况 • 磁盘I/O 速度.传输和读写比率 • 文 ...
- java性能优化常用工具jmap、jstack
jmap:java内存映像工具 jmap用于生成堆转储快照,比较常用的option包括-heap,-histo,-dump [root@localhost script]# jmap -h Usage ...
随机推荐
- springboot项目中使用jsp
在pom文件中 1.方法一 <!-- 引入tomcate内嵌的jsp解析包--> <dependency> <groupId>org.apache.tomcat.e ...
- sql语句查询,limit与order by 同时出现,应该order by在前面
eg:select orderid,status,createtime from orders where appid = :appId and userid = :userId order by c ...
- java nio中,HeapByteBuffer与DirectByteBuffer的区别
HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...
- eclipse 4.4安装aptana插件
eclipse 4.4安装aptana插件: 1.地址: http://download.aptana.com/studio3/plugin/update/index.html.在线安装即可成功! 2 ...
- 对CROS OPTIONS预检请求的一些思考
前后端分离模大势所趋,跨域问题更是老生常谈. 问题背景: 浏览器最基本的安全规范-同源策略.所谓同源是指域名.协议.端口相同.不同源的浏览器脚本(javascript.ActionScript.can ...
- 2020DevOps状态报告——平台模型:扩展DevOps的新方法
平台模型是我们在这个领域看到越来越多的方法,它源于负责产品或服务的端到端交付的产品团队的理念.如果只应用于单一的产品,或者几个产品,它的效果很好. 但如果有数百种产品或服务,把一个产品团队用于这些产品 ...
- SICP 课程总结 & 复习
SICP 课程总结 & 复习 小作文 有赖于那个终极的.伟大的.命定的教务系统,我选上了这门课:SICP,Structure and Interpret of Computer Program ...
- 想学Python不知如何入门,教你!
一.入门引导 想必有很多小伙伴想学习Python,又不知道如何入门,总觉得学习一定要头悬梁,锥刺股!NO,今天给大家分享下如何轻松入门Python! 首先,我们要学习Python,那一定要和你 ...
- 【SpringBoot1.x】SpringBoot1.x 数据访问
SpringBoot1.x 数据访问 简介 对于数据访问层,无论是 SQL 还是 NOSQL,Spring Boot 默认采用整合 Spring Data 的方式进行统一处理,添加大量自动配置,屏蔽了 ...
- 【SpringBoot】前缀树 Trie 过滤敏感词
1.过滤敏感词 Spring Boot实践,开发社区核心功能 完成过滤敏感词 Trie 名称:Trie也叫做字典树.前缀树(Prefix Tree).单词查找树 特点:查找效率高,消耗内存大 应用:字 ...