说明

本文是一个归纳总结,把常用的一些指令,及它们常用的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

第一行顾名思义,简单解释一下第二行

* 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

最新文章

  1. Google MapReduce/GFS/BigTable三大技术的论文中译版
  2. ZOJ 2477 Magic Cube 暴力,模拟 难度:0
  3. java io知识点汇总FIle类
  4. [置顶] 【Git入门之十一】标签管理
  5. JNI调用的helloworld(JNI_OnLoad映射方式)
  6. 对于zuul服务网关框架资料整理
  7. [原创]K8 Cscan 3.6大型内网渗透自定义扫描器
  8. Windows编程的本质
  9. 第一个Sprint第一天
  10. 写给Android开发者的混淆使用手册
  11. HDU 5791 Two(LCS求公共子序列个数)
  12. WPF Style
  13. 【Python】用Python打开csv和xml文件
  14. Python汉英/英汉翻译(百度API/有道API)
  15. git 常用命令--抓取分支-为自己记录(二)
  16. C语言的第一次实验报告
  17. 【洛谷】题解 P1056 【排座椅】
  18. 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)
  19. Django学习笔记之Class-Based-View
  20. KVC 原理及自定义实现

热门文章

  1. Linux下删除文件名带有空格的文件
  2. [leetcode]355. Design Twitter设计实现一个微博系统
  3. 广告计价方式:CPM,CPC,CPA
  4. idea中surround with
  5. Kali实现靶机远程控制
  6. 表单绑定v-model
  7. tep0.6.0更新聊聊pytest变量接口用例3个级别复用
  8. 关于一些视图的基本操作(结合YGGL.sql)
  9. vue的路由以后的页面整合
  10. mysql修改sql_mode为宽松模式