码迷,mamicode.com
首页 > 其他好文 > 详细

2018.1.23 7周2次课

时间:2018-01-23 20:26:22      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:识别   写入   记录   被占用   ota   pdu   io性能   僵尸进程   技术   

七周二次课(1月23日)

10.6 监控io性能

10.7 free命令

10.8 ps命令

10.9 查看网络状态

10.10 linux下抓包

10.6 监控io性能

1. iostat来对linux硬盘IO性能进行检测

使用iostat,需要先安装sysstat ,即yum -y install sysstat

iostat可以产生三种类型的报告:CPU利用情况报告、设备利用情况报告、网络文件系统利用情况报告。

iostat命令格式可概述为:

iostat[参数][时间][次数]

其中,时间以秒为单位。

1)iostat命令的参数说明

-c 仅显示 CPU 统计信息。与 -d 选项互斥。

-d 仅显示磁盘统计信息。与 -c 选项互斥。

-k 以 KB为单位显示每秒的磁盘请求数,默认单位块。

-m 以MB为单位显示每秒的磁盘请求数。

-N 显示磁盘阵列信息

-n 显示网络文件系统NFS报告。此选项仅适用于Linux内核2.6.17以上版本。

-p device | ALL

与 -x 选项互斥,用于显示块设备及系统分区的统计信息,也可以在 -p 后指定一个设备名,如:

# iostat -p hda

或显示所有设备:

# iostat -p ALL

-t 在输出数据时,打印收集数据的时间。

-V 打印版本号和帮助信息。

-x 输出扩展信息。

2)iostat 命令的简单使用

iostat 命令可以显示 CPU 和 I/O 系统的负载情况及分区状态信息。

直接执行 iostat 命令可以显示下面的内容:

技术分享图片

各项输出项目的含义如下:

1)avg-cpu段:

%user:在用户级别运行所使用 CPU 的百分比。

%nice:nice操作所使用 CPU 的百分比。

%system:在系统级别(kernel)运行所使用 CPU 的百分比。

%iowait:CPU等待硬件 I/O 时,所占用 CPU 百分比。

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

%idle:CPU 空闲时间的百分比。

Device段:

tps:该设备每秒的传输次数,一次传输的意思是“一次I/O请求”

kB_read/s:每秒从设备读取的数据量

kB_wrtn/s :每秒向设备写入的数据量

kB_read :读取的总数据量

kB_wrtn :写入的总数量数据量

技术分享图片

Device段:

rrqm/s: 每秒进行合并的读操作数目。即 delta(rmerge)/s

wrqm/s:   每秒进行合并的写操作数目。即 delta(wmerge)/s

r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s

w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s

rsec/s: 每秒读扇区数。即 delta(rsect)/s

wsec/s: 每秒写扇区数。即 delta(wsect)/s

rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)

wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)

avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)

avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。

await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)

svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)

%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈;idle小于70% IO压力就较大了,一般读取速度有较多的wait。

2. iotop命令是一个用来检测磁盘I/O使用情况的top类工具。iotop具有与top相似的UI,其中包括PID,用户,I/O,进程等相关信息。

linux下的IO统计工具如iostat,nmon等大多数是只能统计到每设备的读写情况,如果你想知道每个进程是如何使用的就比较麻烦,使用iotop命令可以很方便的查看。

需要安装 yum install -y iotop

命令格式

iotop (选项)

选项:

-o : 只显示有io操作的进程  

-b : 批量显示,无交互,主要用作记录到文件  

-n NUM: 显示NUM次,主要用于非交互模式  

-d SEC: 间隔SEC秒显示一次  

-p PID: 监控的进程pid  

-u USER: 监控的进程用户  

iotop常用快捷键:

1. 左右箭头:改变排序方式,默认是按IO排序

2. r:改变排序顺序

3. o:只显示有io输出的进程

4. p:进程/线程的显示方式的切换

5. a:显示累积使用量

6. q:退出

10.7 free命令

用free命令查看内存使用状况

技术分享图片

free命令可以查看当前系统的总内存大小以及使用内存的情况。

  • total:内存总大小。

  • used:真正使用的实际内存大小。

  • free:剩余物理内存大小(没有被分配,纯剩余)。

  • shared:共享内存大小,不用关注它

  • buff/cache:分配给buffer和cache的内存总共有多大。关于buffer和cache大家也许有一些疑惑,因为字面意思上两者很相近。教你一个很容易区分这两者的方法,buffer和cache都是一部分内存,内存的作用就是缓解CPU和IO(如磁盘)的速度差距的,你可以这样理解:数据经过CPU计算,即将要写入磁盘,这时用的内存为buffer;CPU要计算时,需要把数据从磁盘中读出来,临时先放到内存中,这部分内存就是cache。

  • available:系统可使用内存有多大,它包含了free。 Linux系统为了让应用跑得更快,会预先分配一部分内存(buffer/cache)给某些应用使用,虽然这部分内存并没有真正使用,但也已经分配出去了。然而,当另外一个服务要使用更多内存时, 是可以把这部分预先分配的内存拿来用的。所以还没有被占用的这部分buffer和cache再加上行free就是available。

这个free命令显示的结果中,其实有一个隐藏的公式:total=used+free+buff/cache。另外,available是由free这部分内存和buff/cache还未被占用的那部分内存组成。used那部分内存和 buff/ cache被占用的内存是没有关系的。

另外free命令还可以加-m和-g选项(分别以MB或GB为单位)打印内存的使用状况,也支持-h选项

技术分享图片

10.8 ps命令

系统管理员一定要知道你所管理的系统都有哪些进程在运行,在windows下只要打开任务管理器即可查看。那么在Linux下如何查看呢?其实使用前面介绍的top命令就可以,但是查看起来没有ps命令方便,它是专门显示系统进程的命令

技术分享图片

技术分享图片

  1. USER: 进程拥有者

  2. PID:表示进程的ID,这个ID很有用在Linux中,内核管理进程就得靠pid来识别和管理某一个进程。比如我想终止某一个进程,则用命令"kill进程的pid"。有时这样并不能终止进程,需要加-9选项,即"kill 9进程的pid",但这样有点暴力,严重的时候会丢数据,所以尽量还是别用。在/proc/目录下,每个进程都有PID id开头的目录。

  3. %CPU: 占用的 CPU 使用率

  4. %MEM: 占用的物理内存的使用率

  5. VSZ: 占用的虚拟内存大小

  6. RSS: 占用的内存大小

  7. TTY: 在哪个终端机上面运作,若与终端机无关,则显示 ? 

  8. STAT:进程的状态。进程状态分为以下几种

  • D:不能中断的进程(通常为IO)。

  • R (run):正在运行中的进程,其中包括了等待CPU时间片的进程。

  • S (sleep):已经中断的进程。通常情况下,系统的大部分进程都是这个状态。

  • T:已经停止或者暂停的进程。如果我们正在运行一个命令,比如说sleep 10,我们按一下 ctrl+z暂停进程时,用ps命令查看就会显示T这个状态。

  • W(内核2 · 6xx以后不可用),没有足够的内存页分配。

  • X:已经死掉的进程(这个好像从来不会出现)。

  • Z:僵尸进程,即杀不掉、打不死的垃圾进程,占用系统一点资源,不过没有关系。如果占用太多(一般不会出现),就需要重视了。

  • <:高优先级进程。

  • N:低优先级进程。

  • L:在内存中被锁了内存分页。

  • s:主进程,后面讲到nginx或者php-fpm服务的时候,你就能更好地理解它了。

  • l:多线程进程。(1个进程里有多个线程)

  • +:在前台运行的进程,比如在当前终端执行ps aux就是前台进程。

  1. START: 进程开始时间

  2. TIME: 执行的时间

  3. COMMAND:所执行的指令

ps命令是在工作中用得非常多的一个命令,所以请记住它。经常会将ps连同管道符一起使用,用来查看某个进程或者它的数量

技术分享图片

10.9 查看网络状态

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

netstat 查看网络状态

技术分享图片

从整体上看,netstat的输出结果可以分为两个部分:

一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列,这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积,这种情况非常少见。

另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。

Proto显示连接使用的协议,

RefCnt表示连接到本套接口上的进程数量,

Types显示套接口的类型,

State显示套接口当前的状态,

Path表示连接到套接口的其它进程使用的路径名。

常见参数

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

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

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

-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)

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

-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)

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

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

-s 按各个协议进行统计 (重要)

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

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

netstat 命令用来打印网络连接状态、系统所开发端口、路由表等信息。

netstat -lnp 查看监听端口,打印当前系统启动哪些端口。

netstat -lntp 只看出tcp的,不包含socket

netstat -an 查看系统的网络连接状况

ss -an 和nestat异曲同工,但不会显示进程的名字。

查看所有状态数字的awk命令

netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'

技术分享图片

10.10 linux下抓包

有时也许想看一下某个网卡上都有哪些数据包,尤其是当你初步判定服务器上有流量攻击时,使用抓包工具来抓取数据包就可以知道有哪些IP在攻击了。

tcpdump命令,需要使用命令yum install -y tcpdump安装。

它的命令格式为:

tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]

       [ -s snaplen ] [ -w file ] [ expression ]

1. 抓包选项:

-c:指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经处理了100个包,只不过只有10个包是满足条件的包。

-i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),

           :一旦找到第一个符合条件的接口,搜寻马上结束。可以使用'any'关键字表示所有网络接口。

-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。

-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。

-N:不打印出host的域名部分。例如tcpdump将会打印'nic'而不是'nic.ddn.mil'。

-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。

-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断,

     :输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,

     :从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好。

输出选项:

-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。

-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。

-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。

-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。

-v:当分析和打印的时候,产生详细的输出。

-vv:产生比-v更详细的输出。

-vvv:产生比-vv更详细的输出。

其他功能性选项:

-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。

-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。

-w:将抓包数据输出到文件中而不是标准输出。可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。

-r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。

2. tcpdump表达式

表达式用于筛选输出哪些类型的数据包,如果没有给定表达式,所有的数据包都将输出,否则只输出表达式为true的包。在表达式中出现的shell元字符建议使用单引号包围。

tcpdump的表达式由一个或多个"单元"组成,每个单元一般包含ID的修饰符和一个ID(数字或名称)。有三种修饰符:

(1).type:指定ID的类型。

可以给定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默认的type为host。

(2).dir:指定ID的方向。

可以给定的值包括src/dst/src or dst/src and dst,默认为src or dst。例如,"src foo"表示源主机为foo的数据包,"dst net 128.3"表示目标网络为128.3的数据包,"src or dst port 22"表示源或目的端口为22的数据包。

(3).proto:通过给定协议限定匹配的数据包类型。

常用的协议有tcp/udp/arp/ip/ether/icmp等,若未给定协议类型,则匹配所有可能的类型。例如"tcp port 21","udp portrange 7000-7009"。

所以,一个基本的表达式单元格式为"proto dir type ID"

除了使用修饰符和ID组成的表达式单元,还有关键字表达式单元:gateway,broadcast,less,greater以及算术表达式。

表达式单元之间可以使用操作符" and / && / or / || / not / ! "进行连接,从而组成复杂的条件表达式。如"host foo and not port ftp and not port ftp-data",这表示筛选的数据包要满足"主机为foo且端口不是ftp(端口21)和ftp-data(端口20)的包",常用端口和名字的对应关系可在linux系统中的/etc/service文件中找到。

另外,同样的修饰符可省略,如"tcp dst port ftp or ftp-data or domain"与"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意义相同,都表示包的协议为tcp且目的端口为ftp或ftp-data或domain(端口53)。

使用括号"()"可以改变表达式的优先级,但需要注意的是括号会被shell解释,所以应该使用反斜线"\"转义为"\(\)",在需要的时候,还需要包围在引号中。

技术分享图片

我们只需要关注第3列和第4列,它们显示的信息为哪一个IP+端口号在连接哪一个IP+端口号。后面的信息是该数据包的相关信息,如果不懂也没有关系。

-i选项后面跟设备名称,如果想抓取其他网卡的数据包,后面则要跟其他网卡的名字。

-nn选项的作用是让第3列和第4列显示成“ IP+端口号" 的形式,如果不加-nn选项则显示“主机名+服务名称"

tcpdump -nn port 80

tcpdump -nn not port 22 and host 192.168.0.100

tcpdump -nn -c 100 -w 1.cap(写入文件1.cap,不能直接cat,用file 1.cap命令可以查看文件大致信息,具体查看要用tcpdump -r 1.cap)

wireshark工具

wireshark这个抓包工具,它的功能非常强大。在Linux平台我们同样也可以使用它,只不过是以命令行的形式。在日常工作中,tcpdump其实就已经够我们使用了

需要安装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"

上面的抓包命令tshark,这条命令用于web服务器

Feb 24,2017 15:37:08 · 857507000  199.0.20.38  k168.123.com  GET   /thread-4861-I-I.html

类似于web访问日志。若服务器没有配置访问日志,可以临时使用该命令查看一下当前服务器上的web请求。在这里要注意的是,如果你的机器上没有开启web服务,是不会显示任何内容的。


2018.1.23 7周2次课

标签:识别   写入   记录   被占用   ota   pdu   io性能   僵尸进程   技术   

原文地址:http://blog.51cto.com/415326/2064357

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!