说明

本文是一个归纳总结,把常用的一些指令,及它们常用的option简单记录了一下,目的是当我们需要工具去定位问题的时候,能够从中找到合适的工具,具体的用法网上有很多博文了,当然还有man手册。参考了一些博客和网站的内容,为了阅读体验,将原文链接均放置在了文末。水平有限,难免有差错,欢迎指出。(此文写于2016年,2018再次回顾发现有不少理解错误的地方,同时归纳的也不全,日后再重新整理)

目录


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

  1. 第一行顾名思义,简单解释一下第二行
  2. * TID:线程id,该栏可以调整显示进程id
  3. * PRIO:磁盘io优先级,磁盘io优先级是值越大,优先级越高,与进程调度优先级相反
  4. * USER:即进程所属用户
  5. * DISK READ:即磁盘读取速率
  6. * DISK WRITE:磁盘写入速率
  7. * SWAPIN:该取样周期内磁盘数据换入内存所花时间百分比
  8. * IO>:该取样周期内io等待所花时间百分比
  9. <h3 id = "2.2">option解释</h3>
  10. * -o 只展示该周期内在进行io的进程或者线程
  11. * -b top,开启批处理模式,主要是为了将信息写入文件或者交给其它程序处理
  12. * -n top,设置刷新次数
  13. * -d top,设置刷新间隔
  14. * -p top,指定进程
  15. * -P 显示进程id,默认是显示线程id
  16. * -u top,指定用户
  17. * -a 显示自命令开启以来,进程或者线程的io总量,默认情况下是显示该取样周期内的数据
  18. iotop下的交互命令,常用的有如下
  19. * r - 反向排序,默认是从大到小排
  20. * o - option中的-o
  21. * p - 进行切换,显示进程id或者显示线程id
  22. * a - option中的-a
  23. * i - 改变线程或者进程的io优先级
  24. * q - 退出
  25. ---
  26. <h1 id = "3">netstat</h1>
  27. <h3 id = "3.1">简介</h3>
  28. 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

...

  1. 第一类是网络套接字,第二类是Unix域套接字,只能用于本机通信,但性能比网络套接字要好,关于Unix域套接字可以google相关信息。Recv-QSend-Q需要关注一下,如果值过大的话说明有大量网络包堆积在队列中
  2. <h3 id = "3.2">option解释</h3>
  3. netstat命令常用的option有如下
  4. * -a 显示所有状态的socket,默认情况下Listen状态的socket是不会显示的
  5. * -c 每隔一段时间执行一次netstat命令
  6. * -n ip和端口均显示数字,而不是别名
  7. * -t 仅显示tcp协议的socket
  8. * -u 仅显示udp协议的socket(该选项需要配合-a或者-l来用,不然是没有信息展示的)
  9. * -l 仅显示Listen状态的socket
  10. * -p 显示保持该连接的进程名
  11. * -r 显示路由信息
  12. * -s 分协议来显示统计信息
  13. ---
  14. <h1 id = "4">ss</h1>
  15. <h3 id = "4.1">简介</h3>
  16. 显示socket统计信息,显示的内容和netstat类似,但是比netstat快,当服务器socket连接数很大的时候,建议使用ss命令,同时能够得到更多的跟socket相关的信息。Recv-QSend-Q需要关注一下,如果值过大的话说明有大量网络包堆积在队列中。输入ss,可以看到如下内容

State Recv-Q Send-Q Local Address:Port Peer Address:Port

...

  1. 常用的optionss -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

    1. 0 - -

RAW 0 0 0

UDP 23 23 0

TCP 35 33 2

INET 58 56 2

FRAG 0 0 0

  1. <h3 id = "4.2">option解释</h3>
  2. 常用的option有如下
  3. * -n 同netstat的-n,数字化ip/port
  4. * -o 显示tcp的计时器信息,关于tcp的计时器信息[TCP的四种定时器][3]
  5. * -a 展示所有套接字,包括listen状态和established状态的
  6. * -l 仅展示listen状态的套接字
  7. * -t 只展示tcp套接字
  8. * -u 只展示udp套接字
  9. * -d 只展示dccp套接字
  10. * -w 只展示raw套接字
  11. * -x 只展示unix域套接字
  12. * -4 只展示ipv4的套接字
  13. * -6 只展示ipv6的套接字
  14. ss的强大之处还在于它可以对socket信息进行过滤,包括state,src,dst,sport,dport等,详细请参考[ss命令][4]
  15. ---
  16. <h1 id = "5">vmstat</h1>
  17. <h3 id = "5.1">简介</h3>
  18. vmstat是信息更加全面的监控工具,通过它可以查看机器的整体状况,包括cpu使用率,内存使用,磁盘io等。
  19. 输入vmstat可以看到如下信息

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

...

  1. * r 表示运行队列中的进程数
  2. * b 表示阻塞中的进程数,即进程状态为ps命令中的D状态,不可中断睡眠状态中的进程数,多为等待io
  3. * swpd 表示已经使用的交换分区大小,该值可对应到top命令中Swap中的used
  4. * buff 表示用为缓存的内存大小,该值可对应到top命令中Mem中的buffers
  5. * cache 表示交换空间位于内存中的缓存大小,该值可以对应到top命令中Swap中的cached
  6. * si 每秒从交换空间换入内存中的大小
  7. * so 每秒从内存中写入到交换空间中的大小
  8. * bi 每秒读取的块数量,这个数字乘以块大小差不多就是磁盘读取速度
  9. * bo 每秒写入的块数量,这个数字乘以块大小差不多就是磁盘写入速度
  10. * in 每秒的中断数,包括时钟中断
  11. * cs 每秒的上下文切换数
  12. * us 用户进程消耗的cpu时间百分比
  13. * sy 内核占用cpu时间百分比
  14. * id 空闲cpu时间百分比,这个时间包括了
  15. * wa io等待占用的cpu时间百分比
  16. * st steal time,主机上别的虚拟机所占用的cpu百分比
  17. <h3 id = "5.2">option解释</h3>
  18. 常用的option有如下
  19. * -a 显示活动内存和非活动内存的大小,在linux内核中的内存页面LRU算法中,有两种LRU list,一种是active list,一种是inactive list,刚访问过的页面放进active list中,长时间未访问过的页面放进inactive list中。[详情点击 active/inactive memory][5]
  20. * -t 将时间戳也一同显示出来
  21. * -S 后面跟k或者m,调整显示单位为kb还是mb,默认为k
  22. * delay delay为一个数字,用于设置信息展示间隔
  23. * count count为一个数字,用于设置展示几次信息,默认值为无穷大。示例

vmstat 2 4

  1. 为两秒展示一次信息,共展示4
  2. ---
  3. <h1 id = "6">ltrace</h1>
  4. <h3 id = "6.1">简介</h3>
  5. 追踪进程的库函数调用,一般用来辅助调试,查找性能瓶颈,比如对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) +++

  1. 等号左边是函数名即相应的参数,右边是返回值,这里输入了-T,会显示该调用所消耗的时间,位于尖括号内,单位是秒
  2. <h3 id = "6.2">option解释</h3>
  3. 常用的大概有如下
  4. * -c 输出统计信息,包括函数的耗时,调用次数等
  5. * -e 只追踪指定的函数,示例

ltrace -e puts ./xx

  1. 表示只追踪puts函数调用
  2. * -l 只追踪指定的库中的函数
  3. * -L 不展示库函数调用,一般配合-S使用
  4. * -S 显示系统调用,默认是不显示
  5. * -T 显示调用所耗时间
  6. * -r 每行前面显示一个相对时间戳
  7. * -t 每行前面显示当前的时间(咋一看跟-r似乎一样的,man ltrace,再动手试试就清楚了)
  8. * -tt 同-t,时间精确到ms
  9. * -ttt 同-tt,不过变成了秒的形式
  10. * -p 追踪指定的进程
  11. ---
  12. <h1 id = "7">strace</h1>
  13. <h3 id = "7.1">简介</h3>
  14. 追踪进程的系统调用,一般用来辅助调试,查找性能瓶颈,使用起来跟ltrace类似,不过多阐述了
  15. <h3 id = "7.2">option解释</h3>
  16. 常用的有如下
  17. * -c 输出统计信息,包括函数的耗时,调用次数,错误次数等
  18. * -e 作用和ltrace的-e一样,不过使用上更丰富,具体参考man strace
  19. * -T 显示调用所耗时间
  20. * -r 每行前面显示一个相应的时间戳
  21. * -t 每行前面显示当前的时间
  22. * -tt 同-t,时间精确到ms
  23. * -ttt 同-tt,不过变成了秒的形式
  24. * -p 追踪指定的进程
  25. ---
  26. <h1 id = "8">tcpdump</h1>
  27. <h3 id = "8.1">简介</h3>
  28. 这个不必多说,神器之一,tcpdump有很多高级用法,但是这里只简单介绍基础应用
  29. <h3 id = "8.2">option解释</h3>
  30. 只介绍几个最常用的
  31. * -A ASCII码打印出包的具体信息来
  32. * -nn 以端口号,ip来显示,而不是主机名和服务名称
  33. * -i 后面跟想要监听的网络接口,如eth1
  34. * -w 后面接文件名,将抓去到的信息都写入该文件中
  35. * -c 抓取的数据包数,抓到这么多之后就停止抓取,默认是一直抓下去的
  36. 一般我们都会对网络包进行一些筛选,常用的关键字有如下
  37. * 指定属性
  38. hostport,分别用于指定ip和端口
  39. * 指定传输方向
  40. src , dst
  41. * 指定协议
  42. tcp , udp
  43. 这些关键字可以用 !, || ,&& 来进行组合。从而构造出更强大的筛选条件
  44. 上面这些都是最基础的应用,更强大的过滤技巧参照链接[tcpdump高级过滤技巧][6]
  45. ---
  46. <h1 id = "9">ngrep</h1>
  47. <h3 id = "9.1">简介</h3>
  48. 抓包利器,非常实用的一个工具,就像用grep匹配文本一样来匹配网络包
  49. <h3 id = "9.2">option解释</h3>
  50. 常用的指令有如下
  51. * -d 指定网络接口,如any或者eth1
  52. * -W byline,解析包中换行符,更人性化的显示数据
  53. * -q 静默模式,如果不打开此模式,未匹配的包将会以#打印出来
  54. ngrep同样支持srcdstporthost等关键字来对数据包进行过滤,比如说我有一个cgi接口,接口名叫hello_worldproxy监听的端口为8080,可以输入以下命令来匹配请求该接口的网络包

sudo ngrep -q -d any -W bylne 'hello_world' 'dst port 8080'

  1. ---
  2. <h1 id = "10">gdb</h1>
  3. <h3 id = "10.1">简介</h3>
  4. 这个不必多说,调试神器,这里只是粗浅介绍
  5. <h3 id = "10.2">常用指令</h3>
  6. 调试程序的时候最常用的几个
  7. * l 展示源码
  8. * i 查看已设置的指令,如i b 是查看已设置的断点
  9. * b 设置断点,除了指定符号,也可以指定文件的代码行数
  10. * r 启动程序
  11. * n 在进入断点后,执行下一行代码
  12. * s 在进入断点后,执行下一行代码,与n的区别是:如果是有函数的话会进入到函数中
  13. * p 打印某个变量的值,也可以打印寄存器的值如p /x $eax
  14. * watch 设置观察点,值有变化时,停住程序,类似的还有rwatchawatch等,详情man gdb
  15. * catch 设置捕捉点,指定的事件发生时,停住程序,详情man gdb
  16. * bt 查看堆栈
  17. * disassembly 反汇编,查看当前桢的汇编码

对于处于进入断点的程序,或者调试core文件时,可以输入bt,查看当前堆栈,也可以指定显示多少层堆栈,如

bt -3

则显示3层(如果有3层的话)

输入bt时,顶层的栈即第0层,也就是程序当前所处的栈,如果需要切换到别的层,可以输入f 加上对应的层数,即

f n

n是一个从0开始的整数,0即栈顶也就是第一层,1即第二层,也可以输入up或者down加上n来进行上下切换


  1. 对于已经在运行中的程序,可以使用如下命令来进行调试

gdb ProgramFile Pid

如:

gdb hello 19202

  1. 值得注意的是要使用gdb调试程序的话,程序在编译阶段最好加上-g选项,生成调试信息供gdb使用。同时产生core文件时,可以简单的用如下指令来查看core时的堆栈,一般情况下根据core时的堆栈就能定位到问题。需要注意生成的core文件是否被截断,如果被截断可以通过ulimit -c [数值/unlimited] 来设置一个合理的值

gdb ProgramFile CoreFile

如:

gdb hello core_hello


  1. <h1 id = "11">其它</h1>
  2. 比较常用的命令还有nm,readelf,objdump三个,这三个命令都是用于分析elf文件,包括查看文件头,符号,各个section的信息,反汇编等等,功能非常强大。举个例子,我们的程序在链接过程中,如果代码规范做的不好,又或者自己私自拷贝了一份公共库中的代码至本地目录,且对其中函数做了修改,在链接的时候是很容易出现符号覆盖的问题的,导致程序运行出错,通过这几个命令可以分析出程序链接的使用的是哪个库中的符号。这里只做个记录。不再对它们阐述。
  3. ---
  4. ### 参考博文链接
  5. top指令解析:http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html
  6. swap交换空间:https://wiki.archlinux.org/index.php/Swap_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  7. 关于top指令中的PR与NI以及RT: https://www.quora.com/What-is-the-difference-between-the-NI-and-PR-values-in-the-top-1-commands-output
  8. ss命令:http://www.cnblogs.com/peida/archive/2013/03/11/2953420.html
  9. [1]: http://heipark.iteye.com/blog/1340384
  10. [2]: https://zh.wikipedia.org/wiki/Hypervisor
  11. [3]: http://blog.csdn.net/macrossdzh/article/details/5967676
  12. [4]: http://www.ttlsa.com/linux-command/ss-replace-netstat/
  13. [5]: http://linuxperf.com/?p=97
  14. [6]: http://blog.csdn.net/lepton126/article/details/8162926

后台故障&性能分析常用工具的更多相关文章

  1. Linux性能分析命令工具汇总

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  2. Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档

    Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm        # 它用来在基于 Linux的系统上获取或 ...

  3. JavaScript 性能分析新工具 OneProfile

    OneProfile 是一个网页版的小工具,可以用全新的方式展示 JavaScript 性能分析的结果,帮助开发者洞悉函数调用关系,优化应用性能. 点击打开 OneProfile 背景 Chrome ...

  4. linux 性能分析常用命令汇总

    CPU性能分析工具: vmstatpssartimestracepstreetop Memory(内存)性能分析工具:vmstatstracetopipcsipcrmcat /proc/meminfo ...

  5. Android性能分析Systrace工具

    一.概述 保证系统流畅度,也就是保证系统能连续不间断地提供每秒60帧的运行状态.当出现掉帧时(也可称为Jank),需要知道当前整个系统所处的状态,systrace便是最佳的选择,它能手机检测Andro ...

  6. Linux Performance Analysis and Tools(Linux性能分析和工具)

    首先来看一张图: 上面这张神一样的图出自国外一个Lead Performance Engineer(Brendan Gregg)的一次分享,几乎涵盖了一个系统的方方面面,任何人,如果没有完善的计算系统 ...

  7. Linux测试硬盘读性能的常用工具-hdparm

    通常情况下可以使用fdisk.df等命令查看硬盘的分区情况以及当前已使用空间大小.剩余空间大小等信息.但是如果要查看硬盘的硬件信息如 硬盘型号.序列号.已运行时间等信息该用什么工具查看呢? 在Linu ...

  8. 性能分析之工具使用——cpu、io 、mem【工具分析】

    nmon nmon 是一种在aix 与各种 Linux 操作系统上广泛使 用的监控与与分析工具,他主要记录以下内容: • cpu 占用率 • 内存使用情况 • 磁盘I/O 速度.传输和读写比率 • 文 ...

  9. java性能优化常用工具jmap、jstack

    jmap:java内存映像工具 jmap用于生成堆转储快照,比较常用的option包括-heap,-histo,-dump [root@localhost script]# jmap -h Usage ...

随机推荐

  1. CentOS7 实战源码部署nginx网站服务器

    简介:实战演练nginx网站服务器的搭建 nginx 简介: Nginx是一款高性能的 HTTP 和反向代理服务器   Nginx的优点: 1.高并发量:根据官方给出的数据,能够支持高达 50,000 ...

  2. Sharding jdbc 强制路由策略(HintShardingStrategy)使用记录

    背景 随着项目运行时间逐渐增加,数据库中的数据也越来越多,虽然加索引,优化查询,但是数据量太大,还是会影响查询效率,也给数据库增加了负载. 再加上冷数据基本不使用的场景,决定采用分表来处理数据,从而来 ...

  3. 在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。

    建立测试计划,确定测试标准和测试范围 设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等 根据测试用例,开发自动测试脚本和场景: 录制测试脚本:新建一个脚本(Web/HTML协议):点 ...

  4. mapboxgl实现带箭头轨迹线

    最近在使用mapboxgl实现轨迹展示时,想实现类似高德地图导航轨迹效果,然而并未在网上找到类似示例.经一番研究与尝试,最终解决,效果如下. 添加箭头核心代码如下,只需在配置layout中添加symb ...

  5. 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?

    作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...

  6. 三目运算符(C++)

    一.简介 固定格式 ?: 三目运算符:可用于赋值语句 三目运算表达式:<表达式1>?<表达式2>:<表达式3> 注:"?"运算符的含义是: 先求 ...

  7. .NET Core 中的日志与分布式链路追踪

    目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...

  8. .NET Core 处理 WebAPI JSON 返回烦人的null为空

    前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段 ...

  9. FastApi学习(一)

    前言 学习不止 正文 介绍 FastApi是PythonWeb框架的'新晋干员',虽然年轻但是很能打 目前已有 12k start GitHub 官网 为什么说他能打呢?它内部使用了 Python 的 ...

  10. C中的dll 、lib和exe文件

    参考:链接1   链接2 DLL 动态链接库(Dynamic Link Library,缩写为DLL),运行时加载是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接 ...