Linux常用性能调测命令简介

https://mp.weixin.qq.com/s?__biz=MjM5NTcxMTE2Nw==&mid=2653116870&idx=1&sn=db0f254e0c549eabc62a75*.f46505&chksm=bd23a8168a542.7a5cd6a5884dce9fd4809656ab7922417d0181ad342fc74136dbeb9e4663&scene=0#rd

一、 Linux常用命令

1 top

简介:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top使用格式:top[-] [d]

[q] [c] [C] [S] 展开 [n]

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。

p 通过指定监控进程ID来仅仅监控某个进程的状态。

q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。

S 指定累计模式 。

s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。

i 使top不显示任何闲置或者僵死进程。

c 显示整个命令行而不只是显示命令名。

top常用参数,top是交互式命令,以下几个参数经常用到,在top界面输入以下字母:

f或者F 从当前显示中添加或者删除项目。

o或者O 改变显示项目的顺序。

l 切换显示平均负载和启动时间信息。

m 切换显示内存信息。

t 切换显示进程和CPU状态信息。

c 切换显示命令名称和完整命令行。

M 根据驻留内存大小进行排序。

P 根据CPU使用百分比大小进行排序。

输出参数介绍:

total 进程总数

running 正在运行的进程数

sleeping 睡眠的进程数

stopped 停止的进程数

zombie 僵尸进程数

Cpu(s):

12.5% us 用户空间占用CPU百分比

8.4% sy 内核空间占用CPU百分比

0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比

74.67% id 空闲CPU百分比

1.4% wa 等待输入输出的CPU时间百分比

0.0%hi:硬件CPU中断占用百分比

3.1%si:软中断占用百分比

0.0%st:虚拟机占用百分比

按1切换过程查看单个 cpu详情模式

2 mpstat

简介:mpstat(multi-processor statistics),它能实时检测多处理器系统上的每个cpu的使用情况。

格式:mpstat [ -P {0|1|…|ALL} ] [interval] [count]

常用命令举例:mpstat -P ALL 1 *.

输出:

一般我们最关心的几个:

%usr 系统上程序运行在用户空间的时间占CPU总运行时间的比例 。

%sys 系统上所有进程运行在内核空间占CPU总时间的比例 。

%idle 系统空闲时间占CPU总运行时间的比例 。

%iowait CPU等待磁盘IO处理的时间占CPU运行总时间的比例。

3 free

命令格式:free -m

数据读取自/proc/meminfo文件

  1 2 3 4 5 6 
   total used free shared buffers cached 
1 Mem: 15793 14700*.* 0 3237922

2 -/+ buffers/cache: 64549339

3 Swap: 2039 2009 30

第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:

15793MB(缺省时free的单位为KB)物理内存,即F[1][1];

在这些物理内存中有14700MB(即F[1][2])被使用了;

还用*.*(即F[1][3])是可用的;

A buffer is something that has yet to be “written” to disk.

A cache is something that has been “read” from the disk and stored for later use.

也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

F[2][2]=F[1][2] - F[1][5] - F[1][6]

F[2][3] = F[1][3] + F[1][5] + F[1][6]

4 vmstat

简介:vmstat(virtual memory statistics),实时的输出系统各资源的使用情况,如进程信息,CPU使用率,内存使用及I/O使用等情况

[***]# vmstat 5 4

procs ———–memory———- —swap– —–io—- –system– —–cpu—–

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

0 0 2056748 283348 400532 8761*. 0 0 5 170 0 0 *.6 83 1 0

1 0 2056748 173896 400540 8761836 0 0 0 483 76313 112604 14 12 75 0 0

1 0 2056748 176040 400548 8762240 0 0 0 268 77209 *.122 11 8 80 0 0

1 0 2056748 178884 400556 8762576 0 0 0 234 76773 *.*24 11 9 79 0 0

注意,第1行是自系统启动以来的平均结果,后面输出的采样周期内的平均结果,输出结果的字段含义解释如下:

Procs:进程信息,r表示运行队列(就是说多少个进程真的分配到CPU)的进程数,b表示不可中断睡眠进程数,阻塞进程。

Memory:内存信息,swpd表示虚拟内存的使用数量,单位都是KB。

Swap:交换分区(虚拟内存)的使用信息,单位KB/s,si表示数据由磁盘交换至内存的速率,so表示数据由内存交换至磁盘的速率,如果这两个值经常变化,说明内存不足。

io: 块设备的使用信息,单位blocks/s,bi表示从块设备读取块的速率,bo表示向块设备写入块的速率。

System:系统信息,in表示每秒发生的中断次数,cs 表示每秒发生上下文切换(进程切换)次数。

CPU: CPU的使用信息,这四个参数见前面介绍

5 iostat

简介:iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。

命令:参数很多,这里只列了我常用的几个参数

iostat [-d] [-kx] [interval] [count]

-d 输出磁盘的详细信息

-k 单位k

-x 输出所有详细信息

输出:

[**_]# iostat -kx 1 *.

Linux 2.6.32.43-tlinux-1.0.17-default (V__...*) 07/16/17 x86_64 (8 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

1.86 0.00 1.60 0.07 0.00 96.46

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.12 39.41 0.95 6.78 92.35 184.79 71.78 0.06 8.33 0.75 0.58

%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是*.%表示设备已经接近满负荷运行了。

6 df

简介:df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。

命令:df

输出:

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda1 *.21208 5368524 4428396 55% /

/dev/sda3 20642428 9695556 9898296 50% /usr/local

/dev/sda4 928412856 742056300 139195844 85% /data

tmpfs 4025928 0 4025928 0% /dev/shm

补充一个查看文件大小举例:du -h –max-depth=1|sort -hr 按目录大小排序

7 lsof

简介:lsof(list open file),列出当前系统打开的文件描述符。用此命令查看进程打开了哪些文件描述符,常用于查看是否有文件句柄泄露。

格式:lsof

常用参数:

lsof -p pid //查看进程pid的所有句柄

lsof -i//显示所有打开的端口

lsof -i:80 //显示所有打开80端口的进程

输出:

8 Netstat

简介:Netstat 命令用于显示各种网络相关信息,如网络连接,路由表等。

参数说明:

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-n 拒绝显示别名,能显示数字的全部转化成数字

-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名

-r 显示路由信息,路由表

-e 显示扩展信息,例如uid等

-s 按各个协议进行统计

-c 每隔一个固定时间,执行该netstat命令

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

使用举例:

netstat -a 列出所有端口

netstat -at列出所有 tcp 端口

netstat -au列出所有 udp 端口

netstat -l只显示监听端口

netstat -p显示进程名

查看hlwmp信息:

9 sar

简介:sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。

查看网卡流量命令:sar -n DEV 2 *.

输出:

查看网卡流量的还有ifstat命令。

*.tcpdump

简介:tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

使用参数说明:

-i 指定tcpdump 需要监听的接口. 任意网口any,指定网口lo或者eth0等

-s 指定抓包长度 0,表示整个包都抓, 如果不设置默认将会是68字节

-w 把包数据直接写入文件而不进行分析和打印输出

-x 以十六进制显示输出内容

-n 不对地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换.

还有很多选项,这里不一一列出,可以查帮助文档

常用条件语句,不一一列举,可以查资料:

host

src host

dst host

Port

and or not

tcp

Udp

常见使用命令举例:

sudo /usr/sbin/tcpdump -i eth1 -s 0 src host .120...33 and port 26941 -w /tmp/captuer.cap

11 strace

简介:strace跟踪程序运行过程中执行系统调用的接收到的信号,并将系统调用名,参数,返回值,信息及消耗的时间输出到标准输出或者指定文件

命令参数说明:

-c 统计每个系统调用执行的时间,执行次数和出错次数

-f 跟踪由fork调用生成的子进程

-t 在输出的每一行前面加上时间信息

-e trace=set 只跟踪指定的系统调用如,-e trace=open, close, read等

-e trace=file 只跟踪文件操作相关的系统调用

-e trace=network 只跟踪网络相关的系统调用

-o 将结果输出到文件

-p pid指定进程

输出:

12 pstack

简介:pstack用来查看进程的堆栈快照

命令:pstack pid

输出:pstack pid,输出进程的各线程的堆栈

13 perf top -p pid

简介:perf是Linux kernel自带的系统性能优化工具,perf可以用于查看热点函数,从而帮助开发者来优化程序性能。

命令:perf top -p pid查看某个进程的函数热点

输出:

二、 GDB使用介绍

1 查看core文件

配置core文件大小, ulimit -c unlimited

查看生成的coredump文件

/home/user_00/services/spp_hlwcdkey/bin下

gdb ./spp_hlwcdkey_worker /data/coredump/core_xxxx

2 用GDB启动进程

gdb –args ./spp_hlwcdkey_worker ../etc/spp_worker.xml

3 gdb attach到已经运行的进程

/home/user_00/services/spp_hlwcdkey/bin

gdb -p 12509

BT查看堆栈

4 GDB里常用的命令

bt查看堆栈

f x进入某层调用的函数

P 打印某个变量

B 设置断点 b func b file.cpp:linenum b class:func

Info b 查看设置的断点

N 执行下一步

C 继续执行上一个命令

Run运行

Run运行

三、性能调测简介

1 CPU运算

聚合运算,减少循环次数,批量mt_access

2 内存拷贝

减少内存拷贝,内存池

引用传递

3 磁盘操作

聚合读写文件

sendfile,减少进程用户态到内核态切换及内存拷贝次数

当需要对一个文件进行传输的时候,其具体流程细节如下:

调用read函数,文件数据被copy到内核缓冲区

read函数返回,文件数据从内核缓冲区copy到用户缓冲区

write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区

数据从socket缓冲区copy到相关协议引擎

硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎

运行流程如下:

sendfile系统调用,文件数据被copy至内核缓冲区

再从内核缓冲区copy至内核中socket相关的缓冲区

最后再socket相关的缓冲区copy到协议引擎

硬盘->内核buf———————————————->socket相关缓冲区->协议引擎

传文件fd及读的offset即可

而在内核版本2.4之后,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作

4 收发包

Epoll边缘模式收发包

四、Spp自带工具查看qps

命令:

/home/user_00/services/spp_query_vipinfo/bin/stat.sh -worker

输出: