10.6 监控io性能
关于磁盘监控
更详细的查看磁盘的状态
iostat 是在安装sysstat这个包的时候就跟着安装了,和sar的用同一个包
iostat -x 1
[root@localhost ~]# iostat -x 1
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年08月06日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.10 0.00 1.67 0.88 0.00 96.35
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.23 13.83 5.61 523.69 55.02 59.56 0.10 5.05 4.71 5.89 1.54 2.98
scd0 0.00 0.00 0.02 0.00 0.09 0.00 8.00 0.00 2.36 2.36 0.00 2.36 0.01
- %util :这一列表示io等待,如果这个百分比达到50%或者60%,就证明磁盘非常忙
- r/s: 写,如果%util的百分比很大,那么这一项也会很大
- w/s:读,如果%util的百分比很大,那么这一项也会很大 假如:读,写的数值都不打,但是%util的百分比却很大,证明磁盘存在问题
==cpu有一部分时间是给进程处理计算,有一部分是给io等待的,因为io读,写都是需要时间等待==
假如发现磁盘io很忙,可以详细查看是哪个进程在频繁读写
[root@localhost ~]# iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
2449 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/0:2]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
12 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper]
13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
14 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
15 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
16 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [writeback]
17 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kintegrityd]
18 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]
19 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]
20 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]
2070 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % master -w
537 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % NetworkManager --no-daemon
26 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswapd0]
只要关注项 IO> io的应用百分比
10.7 free命令
free centos 6和7的显示结果不一样
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1875720 228328 1338400 8632 308992 1465948
Swap: 2097148 0 2097148
第一行:说明
第二行:内存使用情况 //主要关注情况
第三行:swap 使用情况
第一列:total 内存总共大小
第二列:used 使用量
第三列:free 剩余量
第四列:shared 共享量
第五列: buff/cache 缓冲区和缓存预留总量
第六列:available:可以使用的内存总量
buffer缓冲 是用于存放要输出到disk(块设备)的数据的
cache缓存 是存放从disk上读出的数据。
000(磁盘数据)-->内存(cache)-->CPU
磁盘数据要让CPU进行处理,需要经过数据能够有一个缓和,这一部分储存在内存的数据较缓存(cache)
000(cpu处理后的数据)-->内存(buffer)-->磁盘
CPU处理好的数据要存放回磁盘,需要经过内存让数据有个缓和,这一部分存储在内存的数据叫缓冲(buffer)
让数据在内存里进行缓冲和缓和的主要原因,就是因为CPU处理数据太快,不可能等待你磁盘慢慢读写,所以才需要内存进行一个缓和,因为流向的不同名字也不一样 因为这一部分的数据很重要,所以,系统就会预留一部分的空间给cache和buffer
- total的数值=used的数值+free的数值+buff/cache的数值
- avaliable的数值=free+buff/cache
free 的选项
-m //选项 指定单位为mb
-h //选项 智能的显示单位,常用这个选项
有时需要关注sawp
sawp的 使用量跑满,free 的量都为零,那么sawp 就需要添加了
加sawp 不是解决问题的方法,而是增加内存
如果sawp不够,表示内存不过,可能是内存泄露,需要考虑系统程序是否存在bug
10.8 ps命令
ps 把进程的快照,给汇报一下
ps aux 可以把系统所有的进程都列出来
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 128092 10792 ? Ss 8月07 0:01 /usr/lib/systemd/systemd --switched-root --system --deseri
root 2 0.0 0.0 0 0 ? S 8月07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 8月07 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 8月07 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 8月07 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 8月07 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 8月07 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S< 8月07 0:00 [khelper]
root 13 0.0 0.0 0 0 ? S 8月07 0:00 [kdevtmpfs]
root 14 0.0 0.0 0 0 ? S< 8月07 0:00 [netns]
root 15 0.0 0.0 0 0 ? S 8月07 0:00 [khungtaskd]
root 16 0.0 0.0 0 0 ? S< 8月07 0:00 [writeback]
root 17 0.0 0.0 0 0 ? S< 8月07 0:00 [kintegrityd]
root 18 0.0 0.0 0 0 ? S< 8月07 0:00 [bioset]
root 19 0.0 0.0 0 0 ? S< 8月07 0:00 [kblockd]
root 20 0.0 0.0 0 0 ? S< 8月07 0:00 [md]
root 26 0.0 0.0 0 0 ? S 8月07 0:00 [kswapd0]
root 27 0.0 0.0 0 0 ? SN 8月07 0:00 [ksmd]
root 28 0.0 0.0 0 0 ? SN 8月07 0:00 [khugepaged]
root 29 0.0 0.0 0 0 ? S 8月07 0:00 [fsnotify_mark]
root 30 0.0 0.0 0 0 ? S< 8月07 0:00 [crypto]
第一列 USER 运行用户
第二列 PID 进程的ID
第三列 %CPU CPU百分比
第四列 %MEM 内存百分比
第五列 VSZ 虚拟内存
第六列 RSS 物理内存
第七列 TTY 在哪个tty上
第八列 STAT 进程状态
第九列 START 启动时间
第十列 TIME 运行多长时间
第十一列 COMMAND 命令
RSS等同于top 命令下的 RES
STAT进程状态部分说明
D 不能中断的进程 //少见,但一般有D状态的进程,都会对系统负载有很大影响,但是却又不会影响到CPU的运行情况,这是属于一种特例的存在
R run状态的进程 //表示在一个时间段在使用CPU的状态
S sleep状态的进程 //运算完之后,就暂时休息一会再继续使用CPU的状态
T 暂停的进程 //被暂停的进程
Z 僵尸进程 //僵尸进程过多,需要将它杀死
< 高优先级进程 //优先使用
N 低优先级进程 //和高优先级对应的 级别
L 内存中被锁了内存分页
s 主进程 //
l 多线程进程 //说明这个进程有多个线程
+ 前台进程
进程ID 用在杀死一个进程的时候
kill 1346
ps 是一个静态的,一次性的帮当前的进程状况列出来
检查一个进程是否在运行
ps -elf
查看一个进程所在路径
ls -l /proc/505 //505为进程PID
每个进程都会有一个对应的目录
nginx 分父进程和子进程,父进程(master)是由root用户启动的,子进程(worker)是由父进程分出来的,由普通用户启动的 线程是由一个大的进程组成的,一个进程里面有多个线程
10.9 查看网络状态
netstat 查看的就是tcp/ip 的通信状态
正常情况下,一个服务器是没有一个端口是进行监听的,没有端口监听,就表示他没有办法和其他机器进行同行,监听端口,相当于在这个端口上开了孔,允许通过这个孔进行通信
netstat -lnp
[root@localhost ~]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 997/sshd //终端连接端口
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2070/master //邮件端口 IPV4
tcp6 0 0 :::3306 :::* LISTEN 1618/mysqld
tcp6 0 0 :::22 :::* LISTEN 997/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2070/master //邮件端口 IPV6 和IPV4 是同一个端口
udp 0 0 127.0.0.1:323 0.0.0.0:* 506/chronyd
udp6 0 0 ::1:323 :::* 506/chronyd
raw6 0 0 :::58 :::* 7 537/NetworkManager
l 监听
查看TCP所有的状态
netstat -an
查看所有的网络连接的状态数量
[root@localhost ~]# netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
LISTEN 5
ESTABLISHED 1
如果 ESTABLISHED 这个数值很大,说明系统很忙,通常情况下1000以内,服务器都还可以承受
- TCP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
- UDP
- UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
- 与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
10.10 linux下抓包
服务器可能会遭受到攻击,遇到攻击的话网卡流量就会异常
因为是虚拟机,网卡比较特殊,使用这个命令的时候需要特别指定网卡名字
[root@localhost ~]# tcpdump -nn -i ens32
01:12:00.696723 IP 192.168.133.1.2100 > 192.168.133.130.22: Flags [.], ack 37992856, win 11245, length 0
01:12:00.696741 IP 192.168.133.130.22 > 192.168.133.1.2100: Flags [P.], seq 37994476:37994656, ack 5461, win 360, length 180
01:12:00.696745 IP 192.168.133.1.2100 > 192.168.133.130.22: Flags [.], ack 37994476, win 10840, length 0
01:12:00.696848 IP 192.168.133.130.22 > 192.168.133.1.2100: Flags [P.], seq 37994656:37995044, ack 5461, win 360, length 388
主要看的就是数据的流向,有时看的是length 0,默认看的是tcp 的包,有时可能看到udp 的包,如果看到udp的包,很有可能就是被攻击了
指定端口抓包
tcpdump -nn port 80
指定不要抓那个端口的包
tcpdump -nn not port 80
指定不要抓那个端口的包且指定hosts
tcpdump -nn not port 80 and host 192.168.133.1
指定抓包的条数,并保存
tcpdump -nn -c 100 -w /tmp/1.cap
抓包的时候,会出现长的空白,是因为使用命令抓包并保存为文件,是不在屏幕上显示数据流量过程,不在屏幕上显示,只要产生的数据量就少很多,因为每次屏幕显示了一条,自然数据也要回复一条,所以保存为文件的时候才是真正的数据包流量 第一个n 表示 IP用数字的形式显示出来
1.cap 就是从网卡捕获的数据包,就是真真正正的通信数据,因为数据包里的信息就是服务器与其他机器通信的数据,所以这个数据是不能直接解析不能直接使用cat去看
只能使用
file /tmp/1.cap
查看
如果一定想看这个文件,只能使用tcpdump查看
tcpdump -r /tmp/1.cap
- 实用拓展:
web的80端口的使用情况
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"
通过条命令,可以很清晰的看到什么IP,通过什么方式,访问我网站的那个页面
需要安装这个包
yum install -y wireshark
==DDos 又叫 udp flood ,udp的洪水攻击;接第三方应用防御==