共计 7227 个字符,预计需要花费 19 分钟才能阅读完成。
这篇文章给大家分享的是有关 Linux 下常用系统分析工具有哪些的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
1.CPU
对于 cpu 我们主要介绍 top,strace,perf,vmstat。
1.1 top
top 命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。
Top 常用的可选参数和其对应的含义如下:
(1)-c:显示完整的命令;
(2)-d:屏幕刷新间隔时间;
(3)-i 时间:设置间隔时间;
(4)-u 用户名:指定用户名;
(5)-p 进程号:指定进程;
(6)-n 次数:循环显示的次数。
top 执行起来的效果如下:
前五行是系统整体的统计信息。*** 行是任务队列信息,第二行和第三行为进程和 CPU 的信息,*** 两行为内存信息。下面对一些比较重要的参数进行说明。
Load average:0.60,0.94,1.04。load average 表示系统在过去 1 分钟 5 分钟 15 分钟的任务队列的平均长度。这个值越大就表示系统 CPU 越繁忙。
Cpu(s):5.0%us(用户空间占用的 cpu***),3.9%sy(系统空间占用的 cpu 百分比),0.0%ni(用户进程空间内改变过优先级的用户占用的 cpu 百分比),90.9%id(空闲 cpu 的百分比),0.2%wa(等待输入输出 cpu 的百分比)。
Mem:817280k buffers(用作内核缓存的内存量)。
Swap:磁盘交换区容量。
1.2 strace
strace 可以跟踪到一个进程产生的系统调用,包含参数、返回值、执行消耗的时间。
strace 的常用的选项以及选项对应的含义如下:
(1)-c 统计每一系统调用的所执行的时间, 次数和出错的次数等
(2)-f 跟踪由 fork 调用所产生的子进程
(3)-t 在输出中的每一行前加上时间信息
(4)-tt 在输出中的每一行前加上时间信息(微妙级)
(5)-T 显示每一调用所耗的时间
(6)-e trace=set 只跟踪指定的系统调用。例如:-e trace=open,close,read,write 表示只跟踪这四个系统调用。默认的为 set=all
(7)-e trace=file 只跟踪有关文件操作的系统调用
(8)-e trace=process 只跟踪有关进程控制的系统调用
(9)-e trace=network 跟踪与网络有关的所有系统调用
(10)-e strace=signal 跟踪所有与系统信号有关的 系统调用
(11)-e trace=ipc 跟踪所有与进程通讯有关的系统调用
(12)-o filename 将 strace 的输出写入文件 filename -p pid 跟踪指定的进程 pid
例如执行 strace cat /dev/null,会得到如下输出:
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。如果你知道你要找的是什么,你可以让 strace 只跟踪一些类型的系统调用。例如你需要看看在 loadconfigure 脚本里面执行的程序里面系统调用 ececve 的调用情况,则只需要输入这样一条 shell 命令:strace -f -o loadconfigure-strace.txt -e execve ./loadconfigure
再例如,我们知道 ActLogicSvr 的进程号是 16789,则可以执行 strace -p 16789 - c 来统计 ActLogicSvr 在某一段时间系统调用的统计情况。结果如下所示:
这里很清楚的告诉你调用了那些系统函数,调用次数多少,消耗了多少时间等等这些信息,这个对我们分析一个程序来说是非常有用的。
1.3 Perf
perf 是 Linux 的性能调优工具。perf 工具的常用命令包括 top,record,report 等。
perf top 命令用来显示程序运行的整体状况。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。Perf stat 的运行效果如下:
perf record 命令则用来记录指定事件在程序运行过程中的信息,而 Perf report 命令则用来报告基于前面 record 命令记录的事件信息生成的程序运行状况报告。我们通常用命令 perf record -g -p pid 将进程在命令运行期间的各项指令运行所占 CPU 的比例存在 perf.data 里面(- g 表示记录函数之间的调用关系)。再用 perf report –call-graph –stdio 将刚刚的统计结果展示出来。
perf record 带 - g 选项时,perf report 的运行效果:
perf record 不带 - g 选项时,perf report 的运行效果:
1.4 vmstat
vmstat 是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的 IO、中断、上下问切换、CPU 使用等。
vmstat 的输出如下:
procs:
– r:运行队列中进程数量,这个值也可以判断是否需要增加 CPU。(长期大于 1)
– b:因为 io 处于阻塞状态的进程数。
memory:
-swap:使用虚拟内存大小
-free:空闲物理内存大小
-buff:用作缓冲的内存大小
-cache:用作缓存的内存大小
swap:
si:每秒从交换区写到内存的大小,由磁盘调入内存
so:每秒写入交换区的内存大小,由内存调入磁盘
io:
– bi:从块设备读入的数据总量(读磁盘)(KB/s)
– bo:写入到块设备的数据总量(写磁盘)(KB/s)
system:
– in: 每秒产生的中断次数
– cs:每秒产生的上下文切换次数
cpu:
– us:用户进程消耗的 CPU 时间百分比
– sy:内核进程消耗的 CPU 时间百分比
– wa:IO 等待消耗的 CPU 时间百分比
– id:CPU 处在空闲状态时间百分比
2. 网络
2.1 netstat 命令
netstat 命令用来打印 Linux 中网络系统的状态信息,可让你得知整个 Linux 系统的网络情况。
netstat 的常用的选项如下:
(1)-a(all)显示所有选项
(2)-t(tcp)仅显示 tcp 相关选项
(3)-u(udp)仅显示 udp 相关选项
(4)-l(listen)仅列出有在 Listen(监听)的服务状态
(5)-p(program)显示建立相关链接的程序名
(6)-r(route)显示路由信息,路由表
(7)-e(extend)显示扩展信息
(8)-c 每隔一个固定时间,执行该 netstat 命令。
在这里我们简单复习一下 TCP 三次握手和四次挥手的过程,便于下面解释 netstat 中 tcp 的各种状态。
TCP 三次握手的过程如下:
(1)主动连接端发送一个 SYN 包给被动连接端;
(2)被动连接端收到 SYN 包后,发送一个带 ACK 的 SYN 包给主动连接端。
(3)主动连接端发送一个带 ACK 标志的包给被动连接端,握手动作完成。
TCP 的四次挥手过程如下:
(1)主动关闭端发送一个 FIN 包给被动关闭端。
(2)被动关闭端收到 FIN 包后,发送一个 ACK 包给主动关闭端。
(3)被动关闭端发送了 ACK 包后,再发送一个 FIN 包给主动关闭端。
(4)主动关闭端收到 FIN 包后,发送一个 ACK 包。当被动关闭端收到 ACK 后,四次挥手动作完成,连接断开。
下面我们解释一下 netstat 中 tcp 连接对应的各种状态。
(1)LISTEN:侦听状态,等待远程机器的连接请求。
(2)SYN_SEND:在 TCP 三次握手期间,主动连接端发送了 SYN 包后,进入 SYN_SEND 状态,等待对方的 ACK 包。
(3)SYN_RECV:在 TCP 三次握手期间,主动接收端收到 SYN 包后,进入 SYN_RECV 状态。
(4)ESTABLISHED:完成 TCP 三次握手后,主动连接端进入 ESTABLISHED 状态。此时,TCP 连接已经建立,可以进行通信。
(5)FIN_WAIT_1:在 TCP 四次挥手时,主动关闭端发送 FIN 包后,进入 FIN_WAIT_1 状态。
(6)FIN_WAIT_2:在 TCP 四次挥手时,主动关闭端收到 ACK 包后,进入 FIN_WAIT_2 状态。
(7)TIME_WAIT:在 TCP 四次挥手时,主动关闭端发送了 ACK 包之后,进入 TIME_WAIT 状态,等待最多 2MSL 时间,让被动关闭端收到 ACK 包。
(8)CLOSING:在 TCP 四次挥手期间,主动关闭端发送了 FIN 包后,没有收到对应的 ACK 包,却收到了对方的 FIN 包,此时进入 CLOSING 状态。
(9)CLOSE_WAIT:在 TCP 四次挥手期间,被动关闭端收到 FIN 包后,进入 CLOSE_WAIT 状态。
(10)LAST_ACK:在 TCP 四次挥手时,被动关闭端发送 FIN 包后,进入 LAST_ACK 状态,等待对方的 ACK 包。
netstat -te(显示出所有的 tcp 连接)执行起来的效果如下:
netstat 的常用方法:
(1)netstat -p | grep 19626:得到进程号 19626 的进程所打开的所有端口
(2)netstat -tpl:查看当前 tcp 监听端口, 需要显示监听的程序名。
(3)netstat -c 2:隔两秒执行一次 netstat,持续输出
2.2 lsof
lsof 命令用于查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在使用 TCP 的 UDP 的时候,系统在后台都为该应用程序分配了一个文件描述符。无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
lsof 的使用示例如下:
输出的各项的含义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如 cwd、txt 等
TYPE:文件类型,如 DIR、REG 等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
Lsof 的常用方法:
(1)lsof abc.txt:查看所有打开了文件 abc.txt 的进程。
(2)lsof -p pid:显示进程打开的所有的文件。
2.3 tcpdump
tcpdump 可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你去掉无用的信息。
tcpdump 的常用参数:
(1)-nn,直接以 IP 及 Port Number 显示,而非主机名与服务名称。
(2)-i,后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。
(3)-w,如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。
(4)-c,监听的数据包数,如果没有这个参数,tcpdump 会持续不断的监听,直到用户输入 [ctrl]-c 为止。
(***,数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
(6)-e,使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。
(7)-q,仅列出较为简短的数据包信息,每一行的内容比较精简。
(8)-X,可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。
(9)-r,从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件,并且这个「文件」是由 -w 所制作出来的。
tcpdump 的常见用法:
(1)tcpdump -i eth2 host ***.***.***.***:抓取所有经过 eth2,目的或源地址是 ***.***.***.*** 的网络数据。
(2)tcpdump -i eth2 dst host ***.***.***.***:抓取所有经过 eth2,目的地址是 ***.***.***.*** 的网络数据。
(3)tcpdump -i eth2 src host ***.***.***.***:抓取所有经过 eth2,源地址是 ***.***.***.*** 的网络数据。
(4)tcpdump -i eth2 port 36000:抓取所有经过 eth2,目的端口或源端口是 36000 的网络数据。
(5)tcpdump -i eth2 src port 36000:抓取所有经过 eth2,源端口是 36000 的网络数据。
(6)tcpdump -i eth2 dst port 36000:抓取所有经过 eth2,目的端口是 36000 的网络数据。
(7)tcpdump -i eth2 src host ***.***.***.*** src port 36000:抓取所有经过 eth2,目的地址是 10.136.12.1 且目的端口是 36000 的网络数据。
(8)在 10.136.12.1 机器上我们通过 top 知道了 ActLogicSvr 的进程 id 为 16789。然后通过 netstat -ap | grep 16789 得到 ActLogicSvr 监听的端口是 10014。如下图所示:
然后我们通过 tcpdump -i eth2 port 10014 -xxx 抓取通过 10014 端口的所有的包。我们通过模拟接口测试的方法给 ActLogicSvr 发一条请求。抓到的包结果如下:
从抓到的包上我们可以清楚的看到 tcp 连接建立的三次握手到数据传输到 tcp 连接断开四次挥手的过程(前三个数据包是三次握手的过程,*** 四个数据包是四次挥手的过程,中间的为数据传输所产生的网络数据包)。
3 内存
3.1 valgrind
valgrind 是在 Linux 程序中广泛使用的调试应用程序。它尤其擅长发现内存管理的问题,可以检查程序运行时的内存泄漏问题等。我们在使用 valgrind 时也主要用到它的内存泄漏检测功能,即 memcheck 功能。它检查所有对内存的读 / 写操作,并截取所有的 malloc/new/free/delete 调用。因此 memcheck 工具能够探测到以下问题:
(1)使用未初始化的内存
(2)读 / 写已经被释放的内存
(3)读 / 写内存越界
(4)读 / 写不恰当的内存栈空间
(5)内存泄漏
(6)使用 malloc/new/new[]和 free/delete/delete[]不匹配。
(7)src 和 dst 的重叠 valgrind 的可选的参数以及对应的含义如下所示:
(1)-version 显示 valgrind 内核的版本,每个工具都有各自的版本。
(2)q ndash;quiet 安静地运行,只打印错误信。
(3)v ndash;verbose 更详细的信息, 增加错误数统计。
(4)-trace-children=no|yes 跟踪子线程
(5)-track-fds=no|yes 跟踪打开的文件描述
(6)-time-stamp=no|yes 增加时间戳到 LOG 信息
(7)-log-fd= number 输出 LOG 到描述符文
(8)-log-file= file 将输出的信息写入到 filename.PID 的文件里,PID 是运行程序的进行 ID
(9)-log-file-exactly= file 输出 LOG 信息到 file
(10)-log-file-qualifier= VAR 取得环境变量的值来做为输出信息的文件名。
(11)-log-socket=ipaddr:port 输出 LOG 到 socket,ipaddr:port
LOG 信息输出:
(1)-xml=yes 将信息以 xml 格式输出,只有 memcheck 可用
(2)-num-callers= number show number callers in stack traces [12]
(3)-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
(4)-error-exitcode= number 如果发现错误则返回错误代码 [0=disable]
(5)-db-attach=no|yes 当出现错误,valgrind 会自动启动调试器 gdb。[no]
(6)-db-command= command 启动调试器的命令行选项 [gdb -nw %f %p] 适用于 Memcheck 工具的相关选项:
(1)–leak-check=no|summary|full 要求对 leak 给出详细信息? [summary]
(2)–leak-resolution=low|med|high how much bt merging in leak check [low]
(3)–show-reachable=no|yes show reachable blocks in leak check? [no]
示例:valgrind –leak-check=full /usr/local/app/taf/tafnode/data/TenFortune.WeChatProxySvr/bin/WeChatProxySvr –config=/usr/local/app/taf/tafnode/data/TenFortune.WeChatProxySvr/conf/TenFortune.WeChatProxySvr.config.conf -trace-child=yes。执行的结果:
4 磁盘
4.1 iotop
iotop 命令是一个用来监视磁盘 I / O 使用状况的 top 类工具。iotop 具有与 top 相似的 UI,其中包括 PID、用户、I/O、进程等相关信息。Linux 下的 IO 统计工具如 iostat,nmon 等大多数是只能统计到 per 设备的读写情况,如果你想知道每个进程是如何使用 IO 的就比较麻烦,使用 iotop 命令可以很方便的查看。
iostat 命令选项:
-o:只显示有 io 操作的进程
-n NUM:显示 NUM 次,主要用于非交互式模式。
-d SEC:间隔 SEC 秒显示一次。
-p PID:监控的进程 pid。
-u USER:监控的进程用户。
iotop 的执行效果:
感谢各位的阅读!关于“Linux 下常用系统分析工具有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!