系统硬件性能分析工具
1.硬件瓶颈
• CPU、内存、磁盘I/O、网络I/O、进程和线程
2. CPU评估:
字段说明:
Procs(进程)
r: 运行和等待CPU时间片的进程数,如果长期大于系统CPU的个数,CPU遇到瓶颈,需要扩展CPU。
b: 等待资源的进程数,比如正在等待磁盘I/O、网络I/O等。
Memory(内存)
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
CPU(以百分比表示)
us: 用户进程执行时间百分比(usertime)
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time)
sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
us + sy参考值为80%,如果us + sy大于80%,说明可能存在CPU不足
wa: IO等待时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比
3. 内存评估:
[root@PV-portal01 ~]# free -m
total used free shared buffers cached
Mem: 8000 7864 136 0 30 4033
-/+ buffers/cache: 3800 4200
Swap: 12191 4991 7200
• 应用程序可用内存数量: 程序可用 free + cached
– 经验值
应用程序可用内存/系统物理内存 > 70% 内存充足
应用程序可用内存/系统物理内存<20% 内存不足,需要增加内存
20%<应用程序可用内存/系统物理内存<70%内存基本够用
4. 磁盘评估:
iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态
[root@localhost ~]# iostat -d -x -k 1
rkB/s每秒读取数据量kB;
wkB/s每秒写入数据量kB;
svctm I/O请求的平均服务时间,单位毫秒;
await I/O请求的平均等待时间,单位毫秒;值越小,性能越好;
util 一秒中有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需 要优化程序或者增加磁盘;
rkB/s、wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数 据读写,肯定不正常,需要优化程序读取。
svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await 的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁 盘。
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)
4.1 根据device找到具体的分区和目录
1.查找dm-N对应的挂载点
显示dev253-0,dev253-1,即主设备号为dev253(sda设备号为dev8,这是linux为设备生成的内部设备号),次设备号为0,1
2.查看/dev/dm-N,以及映射
即 dm-0对应 rhel-root, dm-1对应 rhel-swap
3.查看磁盘状况
4.查看目录状况
可以看出来dm-0 对应的就是目录 /, dm-1 对应swap分区
5. 网络评估:
5.1 ifstat
RX Pkts/Rate 数据包接收流量(包的数量 每秒)
RX Errs/Drop 丢包
TX Pkts/Rate 数据包发送流量
RX Data/Rate 数据接收流量 (字节数 每秒)
TX Data/Rate 数据发送流量
5.2 iftop
1. yum -y install iftop
2. iftop -i ens192
第一行:宽带显示
中间部分:外部连接列表,即记录了哪些ip正在和本机的网络连接
中间部分右边:实时参数分别是该让问ip连接到本机2,10,40秒的平均流量
=>代表发送数据;<=代表接收数据
底部三行:代表发送,收到和全部网络流量
cum:为运行iftop到目前的总流量
peak:流量峰值
rates:2s,10s,40s的平均流量
3.使用帮助:
iftop -h 显示帮助
iftop -F 显示指定网段/ip的进出流量
iftop -F 10.10.1.0/24
下面这些选项都可以的通过按键切换:
iftop -n 显示本机的ip,不加-n则显示主机名;也可以iftop进入监控后,按n切换是否显示ip;
iftop -t 切换显示格式为2行/1行/只显示发送的流量/只显示接收的流量
iftop -N 显示端口号或端口服务名称
iftop -S 切换是否显示本机的端口信息
iftop -D 切换是否显示远端目标主机的端口信息
iftop -P 显示端口号;或者进入iftop,按p切换是否显示端口信息
iftop -s 切换是否显示远程目标主机的host信息
iftop 按键切换显示
按p:切换是否显示端口信息
按P:切换暂停/继续显示
按T:切换是否显示每个连接的总流量
按o:切换是否固定只显示当前的连接
按l:打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,就只能显示这个ip相关的流量信息
实现iftop -F X.X.X.X/24的功能
按j或k:可以向上或下滚动屏幕显示连接记录
按b:切换是否显示平均流量图形条
按B:切换计算2,10,40秒内的平均流量
按L:切换显示画面上边的刻度,刻度不同,流量图形条就会有变化
按1或2或3:可以根据右侧显示的三列流量数据进行排序
按<:根据左边的本机名和ip排序
按>:根据远端目标主机的主机名或ip排序
按f:编辑过滤代码,很少用
按!:可以使用shell命令,很少用
q:退出监控
5.3 vnstat
记录指定网卡每日的传输流量日志。是通过分析文件系统/proc实现的,而非基于网络包的过滤,所以nstat不需要root权限就可以使用。
yum -y install vnstat
vnstatd -d 初始化
1. vnstat -i ens192 -h 显示每小时的流量统计,默认eth0网卡,需指定网卡
2. vnstat -l -i ens192 显示实时网卡流量
6. 进程和线程:
6.1 pidstat
cpu使用情况统计(-u)
内存使用情况统计(-r)
IO情况统计(-d)
[root@sx-sj-dportal-nengli-1 ~]# jps
25126 Jps
16189 Bootstrap
--cpu查看
[root@sx-sj-dportal-nengli-1 ~]# pidstat -p 16189 -u 1 5-u 监控cpu
以上输出,除最开头一行显示内核版本、主机名、日期和cpu架构外,主要列含义如下:
09:48:12: pidstat获取信息时间点
PID: 进程pid
%usr: 进程在用户态运行所占cpu时间比率
%system: 进程在内核态运行所占cpu时间比率
%CPU: 进程运行所占cpu时间比率
CPU: 指示进程在哪个核运行
Command: 拉起进程对应的命令
执行pidstat默认输出信息为系统启动后到执行时间点的统计信息,因而即使当前某进程的cpu占用率很高,输出中的值有可能仍为0。
[root@sx-sj-dportal-nengli-1 ~]# pidstat -p 16189 -u 1 5 -t-t监控进程中的线程
Linux 3.10.0-693.11.1.el7.x86_64 (sx-sj-dportal-nengli-1.novalocal) 05/22/2018 _x86_64_ (8 CPU)
09:49:31 PM UID TGID TID %usr %system %guest %CPU CPU Command
09:49:32 PM 0 16189 - 0.00 0.00 0.00 0.00 0 java
09:49:32 PM 0 - 16189 0.00 0.00 0.00 0.00 0 |__java
09:49:32 PM 0 - 16191 0.00 0.00 0.00 0.00 1 |__java
09:49:32 PM 0 - 16192 0.00 0.00 0.00 0.00 4 |__java
09:49:32 PM 0 - 16193 0.00 0.00 0.00 0.00 0 |__java
-- 内存查看
以上各列输出的含义如下:
minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
VSZ: 该进程使用的虚拟内存(以kB为单位)
RSS: 该进程使用的物理内存(以kB为单位)
%MEM: 该进程使用内存的百分比
Command: 拉起进程对应的命令
--io查看
[root@mytest1 ~]# pidstat -p 18513 1 1 -d -t
Linux 3.10.0-514.el7.x86_64 (mytest1) 2018年05月22日 _x86_64_ (8 CPU)
21时54分53秒 UID TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
21时54分54秒 0 18513 - 0.00 3.96 0.00 java
21时54分54秒 0 - 18513 0.00 0.00 0.00 |__java
21时54分54秒 0 - 18514 0.00 0.00 0.00 |__java
21时54分54秒 0 - 18515 0.00 0.00 0.00 |__java
21时54分54秒 0 - 18516 0.00 0.00 0.00 |__java
21时54分54秒 0 - 18517 0.00 0.00 0.00 |__java
kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
Command: 拉起进程对应的命令
7.系统负载
7.1 top
[root@master ~]# top
top - 05:34:32 up 162 days, 6:45, 5 users, load average: 0.02, 0.01, 0.00
Tasks: 244 total, 1 running, 243 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16335704k total, 7641236k used, 8694468k free, 232644k buffers
Swap: 8241144k total, 0k used, 8241144k free, 4891276k cached
7.2 uptime
[root@master ~]# uptime
05:34:47 up 162 days, 6:45, 5 users, load average: 0.02, 0.01, 0.00