-
监控io性能
iostat在安装sysstat时就已经安装,和sar属于同一个包
[root@abc ~]# iostat -x
Linux 3.10.0-514.el7.x86_64 (abc.com) 2017年11月27日 _x86_64_(1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.35 0.36 0.00 99.04
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.06 2.36 1.30 51.77 5.41 31.22 0.03 7.07 5.25 0.39 2.27 0.83
sdb 0.00 0.00 0.14 0.00 0.86 0.00 12.55 0.00 0.53 0.53 0.00 0.39 0.01
scd0 0.00 0.00 0.01 0.00 0.02 0.00 8.00 0.00 1.00 1.00 0.00 1.00 0.00
dm-0 0.00 0.00 0.03 0.00 0.21 0.00 15.20 0.00 0.58 0.58 0.00 0.52 0.00
sar -b也可以查看磁盘信息,但是iostat -x可以看到很重要的一个%util
在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率. 当这个值接近100%时,表示设备带宽已经占满.
iotop:是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。
Total DISK READ :0.00 B/s 磁盘读速度
Total DISK WRITE : 0.00 B/s 磁盘写入速度
2.free 查看内存的使用情况
[root@abc ~]# free
total used free shared buff/cache vailable
Mem: 1008392 112632 662172 6864 233588 733800
Swap: 2097148 0 2097148
[root@abc ~]# free -h (加上-h 更清晰的显示内存大小)
total used free shared buff/cache available
Mem: 984M 109M 646M 6.7M 228M 716M
Swap: 2.0G 0B 2.0G
total 内存总大小
used 已经使用的内存大小
free 剩余内存大小
shared 当前已经废弃不用
buff 缓冲内存数
cache 缓存内存数
available free内存+buffer/cache剩余部分, 真正的剩余内存
公式:total=used+free+buff/cache(系统预留出来空间给cache和buff)
磁盘(010101)--> 内存(cache) --> cpu 从磁盘先把数据读出来放到内存里,内存在交给cpu
cpu(010101)--> 内存(buffer) --> 磁盘 cpu运算速度是很快的,写入数据没那么快要在磁盘里有一个缓冲空间
3.ps (report a snapshot of the current processes) 汇报当前进程的快照
命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
Ps 只为您提供当前进程的快照。要即时查看最活跃的进程,可使用 top。
Top 实时地提供进程信息。它还拥有交互式的状态,允许用户输入命令,如 n 后面跟有 5 或 10 等数字。其结果是指示 top 显示 5 或 10 个最活跃的进程。Top 持续运行,直到您按 "q" 退出 top 为止。
[root@abc ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER 使用进程的用户名
PID 进程ID,kill命令加进程ID可以杀死一个进程。当系统被黑时,可以查看恶意进程,并杀死它
%CPU 进程CPU占用率
%MEM 进程内存占用率
VSZ 进程所使用的虚拟内存
RSS 进程所使用的实际内存
TTY 与进程关联的终端
STAT 进程的状态
R 运行 Runnable (on run queue) 正在运行或在运行队列中等待。
S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号。
I 空闲 Idle
Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
P 等待交换页
W 无驻留页 has no resident pages 没有足够的记忆体分页可分配。
X 死掉的进程
< 高优先级进程 高优先序的进程
N 低优先 级进程 低优先序的进程
L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+ 位于后台的进程组
START 进程启动时间和日期
TIME 进程使用的总cpu时间
COMMAND 正在执行的命令行命令
4.netstat 查看网络状态 tcp/ip通信状态。
netstat -lnp 查看监听端口 只要是与外部通信,都会有一个端口
Socket是进程间通信的一种机制。前提是同一台服务器。netstat也可以查看系统文件里有哪些socket文件在监听
etstat -an 查看所有连接
一个小技巧:
[root@abc ~]# netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
ESTABLISHED 2 有多少客户段连接占用着你的服务器。这个是要着重关注的,几千来说是正常的
TIME_WAIT 连接你的服务器但是没有占用你的服务器资源
tcp三次握手,四次挥手:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
三次握手:(建立TCP连接)
-
host1会将标志位SYN=1,并随机产生一个seq=j的数据包发给host2,并进入SYN_SENT状态,等待host2确认
-
host2收到数据包后,由SYN=1确定是host1请求连接,host2把标志位SYN=1和ACK都设置为1,ack=j+1,并随机产生一个seq的值,并将数据包发送给host1以确认连接请求,进入SYN_RCVD状态。
-
host1收到确定后,检查ACK是否为1.ack是否为j+1,,如果正确将标志位ACK设置为1.ack=K+1,并将数据包发给host2,host2检查cck是否为K+1,ACK是否为1.如果正确则完成建立,host1与host2进入ESTABLISHED状态,完成三次握手,开始传输数据
SYN攻击:
在三次握手过程中,host2发送SYN-ACK之后,收到host1的ACK之前的TCP连接称为半连接(half-open connect),此时host2处于SYN_RCVD状态,当收到ACK后,host2转入ESTABLISHED状态。SYN攻击就是host1在短时间内伪造大量不存在的IP地址,并向host2不断地发送SYN包,host2回复确认包,并等待host1的确认,由于源地址是不存在的,因此,host2需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV
四次挥手:(终止TPC连接) 在socket编程中,这一过程由客户端或服务端任一方执行close来触发
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭
1.host1发送一个FIN,用来关闭host1到host2的数据传送,host1进入FIN_WAIA_1状态
2.host2收到FIN后,发送一个ACK给host1,确认序号为收到序号+1,(与SYN相同,一个FIN占用一个序号),host2进入CLOSE_WAIT状态
3.host2发送一个FIN,用来关闭host2到host1的数据传送,host2进入LAST_ACK状态。
4.host1收到FIN后,进入TIME_WAIT状态,接着发从一个ACK给host2,确认序号为收到序号+1.host2进入CLOSED状态,完成四次挥手。
实际还会同时发起主动关闭的情况。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
5.tcpdunmp抓包
linux下抓包
yum install -y tcpdump
tcpdunmp (dump the traffic on a network)
根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump -nn -i +网卡名字
(第一个n表示ip用数字形式显示出来)
port 指定端口号
not port 不是指定端口的端口号
-c 指定抓多少包
-w 抓到的包存到指定文件(不能cat,是从网卡里捕获的数据包信息。只能用tcpdump -r 查看)
大部分是tcp服务,当你看到udp要注意,说不定是DDos攻击,叫做udp flood(udp洪水攻击),只能接入防攻击的服务或者工具。
[root@abc ~]# yum install -y wireshark 安装一个tshark的工具
[root@abc ~]# 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,访问网站的名字已经访问的文件/链接名字
tshark的其他用法:http://ask.apelearn.com/question/995