2017.11.28 七周第二次课

10.6 监控io性能

Linux系统出现了性能问题,一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。
  1. 基本使用

$iostat -d -k 1 10

参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。

输入图片说明

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是39.29,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)

2.-x 参数

使用-x参数我们可以获得更多统计信息。

输入图片说明

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。

rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;

await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。

%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

3.-c 参数

iostat还可以用来获取cpu部分状态值:

输入图片说明

4.常见用法

$iostat -d -k 1 10 #查看TPS和吞吐量信息

iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)

iostat -c 1 10 #查看cpu状态

5.实例分析

$$iostat -d -k 1 |grep sda10

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda10 60.72 18.95 71.53 395637647 1493241908

sda10 299.02 4266.67 129.41 4352 132

sda10 483.84 4589.90 4117.17 4544 4076

sda10 218.00 3360.00 100.00 3360 100

sda10 546.00 8784.00 124.00 8784 124

sda10 827.00 13232.00 136.00 13232 136

上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。 iostat -d -x -k 1

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

sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29

sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25

sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

10.7 free命令

[root@localhost ~]# free

         total       used       free     shared    buffers     cached

Mem: 1938820 114080 1824740 0 10920 42060

-/+ buffers/cache: 61100 1877720

Swap: 4194296 0 4194296

第一行的buffers 和 cached 下面的数据,表示还剩下多少缓冲和缓存。

free查看当前系统的总内存大小以及使用内存的情况。第二行看出内存的情况,但实际上第二行才是真正的内存used和free情况,因为系统初始化的时候,分了很大一部分内存给缓存,这部分缓存用来随时提供给程序使用。如果程序不用,就空闲。第二行真正的可用量==第一行物理剩余free +第一行 buffers + 第一行cached;第一行total==第二行used+第二行free

缓存是介于CPU和磁盘之间的介质,速度比CPU慢,比磁盘快。从磁盘取出数据的时候,速度很慢,事先可以先把数据取出来,放到缓存里面,等CPU想用的时候,再从缓存里面去拿,相比较起来,速度会快一点。CPU处理完结果的数据,写入到磁盘的时候,速度很慢,也会先把数据放到内存里面。然后在后台慢慢的写入。

buffer是即将写入到磁盘里去的数据暂存的内存区域,

cached是从磁盘里读出来的数据暂存的内存区域。

-m 使用Mb单位显示 free -m

-g 使用Gb单位显示

增加了上述两个选项会导致实际结果不精准,最好是什么都不加,然后自己换算。

10.8 ps命令

top命令可以查看当前系统运行的进程,ps 更合适,专门显示系统进程。

-A Select all processes. Identical to -e.

-e Select all processes. Identical to -A.

T Select all processes associated with this terminal. Identical to the t option without any argument. 【只显示当前终端的信息】

f ASCII-art process hierarchy (forest)

-f does full-format listing. This option can be combined with many other UNIX-style options to add additional columns. It also causes the command arguments to be printed. When used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added. See the c option, the format keyword args, and the format keyword comm.

-L 线程相关NLWP 线程数量

LWP线程编号

#ps 不加任何选项,表示查看当前终端的进程。类似-T的功能,terminal

#ps aux 查看系统所有进程

#ps -eLf 出现线程相关的信息。

UID为User ID.

PID为processid,进程标识符

PPID为 parent processid,父进程标识符2,

LWP为light weight process orthread, 轻量级进程,即线程标识符

NLWP为,number oflwps(threads) in the process, 线程的数量

kill命令

killall 进程名 批量杀同名的多个进程

kill -9 进程号 #强制杀掉

#ps aux

输入图片说明

#ps -elf

输入图片说明

PID 进程的ID,pid来识别和管理进程

kill -9 pid 强制kill进程

%CPU 占用多少CPU

%MEM 占用多少内存

VSZ 虚拟内存大小

RSS 实际内存大小

TTY 从哪里启动,?表示后台,pts/0表示终端

STAT 表示进程的状态,分为以下几种,了解,无需掌握

D 不能中断的进程,通常为IO

R 正在运行的进程 running

S 已经中断的进程 sleep

T 已经停止或者暂停的进程,sleep 100; ctrl z ; 此时是T状态,ps可以查看到

W 没有足够的内存页分配

X 已经死掉的进程

Z 僵尸进程,杀不掉,打不死,占一小点资源,没有关系,如果太多,就有问题。Zombie < 高优先级进程

N 低优先级进程

L 内存中被锁了内存分页 lock

s 主线程

l 多线程进程

  • 在前台运行的进程

S< 高优先级正在休眠的进程

SN 低优先级正在休眠的进程

S<s 高优先级的主进程,处于休眠状态

Ss+ 前台运行的主进程

TIME 占用了CPU多少时间

COMMAND 进程的名称

ps经常搭配管道符使用

#ps aux |grep -c mingetty 【查看进程是否启动】

-c的作用是只显示数量,但是显示的数量比实际的多一个,因为grep里面的命令也被计算到里面。

输入图片说明

休眠和前台后台没有关系。 这里的休眠是Sleep,是进程等待cpu的一个状态。 因为没有什么进程会一直处于Running的状态。

10.9 查看网络状态

netstat 用来查看 网络连接状态、系统所开放端口、路由表等信息。

最常用命令

#netstat -lnp 打印当前系统启动正在监听的端口

#netstat -anp 打印所有端口状态,包括Established,LISTEN

两者差别在a和l,注意区别

#netstat -lnp

输入图片说明

Address冒号后面是端口号,22端口远程登录。

其中foreign address为外来IP,面试中统计外来IP数量,或访问本机的IP数量

#netstat -an

查看服务端和客户端的通信,去衡量服务器有没有压力。p代表服务,program。

输入图片说明

输入图片说明

ESTABLISHED 已经建立连接,正在通信

TIME_WAIT 已经传输完,并没有断开,保持连接

#netstat -an |grep 122.112.39.86:80 【查看80端口进行通讯的网络状态】

#netstat -an |grep 122.112.39.86:80 |grep -ic established 【统计established的有多少,-i忽略大小写,-c统计数量,该数量表示这1秒之内有多少个链接】

如果管理的服务器是一台提供 web 服务(80端口)服务器,那么可以用 #netstat -an |grep 80 查看当前连接web服务的有哪些IP了。

如果web服务就是一个静态页,并发可能很高,到两三万,如果加上后端的php,mysql,那么并发不会很高,一两千是没有什么问题。

#netstat -an |grep -v unix 【不显示下方的socket信息】

#netstat -an |grep -v unix 【不显示下方的socket信息】

10.10 linux下抓包

抓包工具,可以查看某个网卡上面有哪些数据包,了解有哪些IP在访问,或者哪些IP在攻击。

tcpdump 工具 tcp 传输控制协议 dump 仓库

#yum install -y tcpdump

-nn 让第三列和第四列显示成IP+端口号的形式,不加显示的是 主机名+服务名称。

-i 后跟设备名称,如eth1 或 eth0,不加默认eth0

-c 指定包数量

-w 将包的内容写入指定文件里

-t Don[24m[4mt print a timestamp on each dump line. 增加时间戳

-s 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包,即65535字节。

#tcpdump

00:40:26.656410 IP localhost.bootps > localhost.bootpc: BOOTP/DHCP, Reply, length 300

00:40:26.716302 IP localhost.54248 > 239.255.255.250.ssdp: UDP, length 173

00:40:26.849787 IP localhost.domain > localhost.58467: 15255 0/1/0 (81)

00:40:26.850705 IP localhost.56165 > localhost.domain: 44028+ PTR? 254.247.168.192.in-addr.arpa. (46)

#tcpdump -nn -i eth0

00:41:28.366550 IP 192.168.247.254.67 > 192.168.247.1.68: BOOTP/DHCP, Reply, length 300

00:41:28.400210 IP6 fe80::127:c346:1ff:af04.50693 > ff02::1:3.5355: UDP, length 22

00:41:28.400267 IP 192.168.247.1.63730 > 224.0.0.252.5355: UDP, length 22

00:41:28.439061 IP6 fe80::127:c346:1ff:af04.63987 > ff02::1:3.5355: UDP, length 22

输入图片说明

第一列时间,时:分:秒:毫秒 来源IP和端口 > 目标IP和端口

第三列第四列显示的信息为哪个(IP1+port) 在连接哪个(IP2+port)。

#tcpdump -nn -c 100 【只抓100个包】

#tcipdump -nn -i eth1 -c 1000

#tcpdump -nn port 22 【只抓22端口】

#tcpdump -nn tcp and port 22 【抓22端口的TCP协议】

#tcpdump -nn udp 【只抓udp协议的包】

#tcpdump -nn host ....... and port ....... and tcp 【其它选项可以用and连接】

#tcpdump -nn tcp and port 80 -w 1.cap 【将80端口的tcp协议的包写入到1.cap,不会停止,知道按ctrl C】

#tcpdump -nn -i eth0 host 192.168.1.100 and port 80 -c 100 - w 1.cap

tcpdump -nn -i eth0 src host 1.1.1.1 and dst net 1.1.1.0/24

可以用host指定ip,port指定端口,-c 指定包数量,-w写入指定文件里。这样1.cap文件里面是包的内容,而如果不加-w直接在屏幕上显示的不是数据包,而是数据流量。 这个1.cap可以下载到windows上面,然后使用 wireshark查看。不能用cat查看,tcpdump -r 1.cap可以查看到流向,但不是内容,只能看到IP信息,端口信息,而抓的包,还包括图片或者文档或者其他文件。

#tcpdump -nn -i eth0 -c 100 > 2.cap

此时的2.cap可以用cat查看到流向,并不是包的内容,如果要抓包的内容,需要增加-w。

#tcpdump -nn -s0 tcp and port 80 -c 100 -w 2.cap 【增加-s0才能抓取到包的完整功能】

wireshark工具

#yum install -y wireshark

#tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

Mar 21, 2014 15:37:08.857507000 199.30.20.38 k168.123.com GET /thread-4861-1-1.html

转载于:https://my.oschina.net/u/3461300/blog/1581237

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值