1.1 TCP/IP报文详解:
TCP/IP定义了电子设备如何连入因特网,以及数据如何在他们之间传输的标准,协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
TCP/IP负责发现传输的问题,一有问题就发出信号,要求重新传输。TCP/IP协议数据封装的过程包括用户数据经过应用层协议封装后传递给传输层,传输层封装TCP头部,交给网络层,网络层封装IP头部后,在交给数据链路层,数据链路层封装Ethernet帧头和帧尾,交给物理层,物理层以比特流的形式将数据发送到物理线路上。
不同的协议层对数据包有不同的称谓,数据包在传输层叫做段(segment),在网络层叫做数据报(datagram),在数据链路层叫做帧 (frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议在剥掉相应的首部,最后将应用层数据交给应用程序处理,如下图所示。
优化Linux服务器,需要了解TCP协议相关信息,例如TCP/IP数据报文的内容是如何传输的,IP数据包报文详细结构如下图所示:
IP数据包详解如下:
(1)source port和destination port:分别占用16位,表示源端口号和目标端口号,用于区别主机中的不同进程。而IP地址是用来区分不同的主机的,源端口号和目标端口号配合上IP首部中的源IP地址和目标的IP地址就能唯一的确定一个TCP连接。
(2)sequence number:用来表示从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节在数据流中的序号,主要用来解决网络报乱序的问题。
(3) acknowledgment number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效,主要用来解决不丢包的问题。
(4)offset:给出首部中32位的数目,需要这个值是因为任选字段的长度是可变的。这个字段占用4位(最多能表示15个32位的字,及4x15=60个字节的首部长度),因此TCP最多有60字节的首部,然而,没有任选字段,正常的长度是20字节。
(5)TCP flags:TCP首部中的6个标志位,它们中的多个可同时被设置为1,主要是用于操控TCP的状态机,依次为URG,ACK,PSH,RST,SYN,FIN。每个标志位的含义如下:
- URG:次标志表示TCP包的紧急指针域(下面即将介绍)有效,用来保证TCP连接不被终端,并且督促中间层设备要尽快处理这些数据。
- ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中,有两个取值0和1,为1则表示应答域有效,反之为0.
- PSH:这个标志位表示push操作。所谓push操作就是指在数据包到达收端以后,立即传送给应用程序,而不是在缓冲区中排队。
- RST:这个标志表示连接复位请求,用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
- SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1。这个标志的数据包经常被用来进行端口扫描,扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口。但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不是很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手。
- FIN:表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。
- windows:窗口大小,也就是有名的滑动窗口,用来进行流量监控。
1.2 TCP三次握手及四次断开
TCP是面向连接的,无论哪一方向在另一方发送数据之前,都必须现在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认好并交换TCP窗口大小信息,如下图所示。
(1)TCP三次握手原理如下:
- 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,sequence number为x,然后客户端进入SYN_SEND状态,等待服务器确认。
- 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置acknowledgment number为x+1(sequence number+1)。同时,自己还要发送SYN请求信息,将SYN位置为1,sequence number为y。服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN_ACK报文段。然后将acknowledgment number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
(2)TCP四次挥手原理如下:
- 第一次挥手:主机A(可以是客户端,可以是服务器端),设置sequence number和acknowledgment number,向主机B发送一个FIN报文段,此时,主机A进入FIN_WAIT_1状态,这表示主机A没有数据要发送给主机B。
- 第二次挥手:主机B收到了主机A发送的FIN报文段,向主机A回一个ACK报文段,acknowledgment number为sequence number加1,主机A进入FIN_WAIT_2状态。主机B告诉主机A,我“同意”你的关闭请求。
- 第三次挥手:主机B向主机A发送FIN报文段,请求关闭连接,同时主机B进入LAST_ACK状态。
- 第四次挥手:主机A收到主机B发送的FIN报文段,向主机B发送ACK报文段,然后主机A进入TIME_WAIT状态。主机B收到主机A的ACK报文段以后,就关闭连接。此时,主机A等待2MSL后依然没有收到回复,则证明server端已经正常关闭,这样,主机A也可以关闭连接。
1.3 优化Linux文件打开最大数
为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的系统文件数,对某个用户打开系统进程数进行限制等,一般限制手段包括软限制和硬限制。具体说明如下:
- 软限制(soft limit):内核实际执行的限制,任何进程都可以将软限制设置为任意小于或等于对进程限制的硬限制的值、最大线程数(noproc)和文件数(nofile)。
- 硬限制(hard limit):可以在任何时候任何进程中设置,但硬限制只能由超级用户修改。
Linux系统一切皆文件,对Linux进行各种操作,实际就是对文件进行操作,文件可分为普通文件,目录文件,链接文件和设备文件。而文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
Linux系统默认已经打开的文件描述符包括STDIN_FILENO 0表示标准输入、STDOUT_FILENO 1表示标准输出、STDERR_FILENO 2表示标准错误输出,默认打开一个新文件,它的文件描述符为3。
每个文件描述符与一个打开文件相对应,不同的文件描述符可以指向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进程中被多次打开。
Linux系统为每个进程维护了一个文件描述符表,该表的值都是从0开始的,在不同的进程中用户会看到相同的文件描述符,相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。Linux内核对文件操作,维护了3个数据结构概念。
- 进程级的文件描述附表;
- 系统级的打开文件描述符表;
- 文件系统的i-node表。
其中进程级的描述符表的每一个条目记录了单个文件描述符的相关信息,例如控制文件描述符操作的一组标志及打开文件句柄的引用。Linux内核对所有打开的文件都维护了一个系统级的描述符表(open file description table)。将描述符表中的记录行称为打开文件句柄(open file handle),一个打开文件句柄存储了与一个打开文件相关的全部信息,详细信息如下:
- 当前文件偏移量;
- 打开文件时所使用的的状态标识;
- 文件访问模式;
- 与信号驱动相关的设置;
- 对该文件i-node对象的引用;
- 文件类型和访问权限;
- 指针指向该文件所持有的锁列表;
- 文件的各种属性。
默认Linux内核对每个用户设置了打开文件最大数为1024,对于该并发网站,是远远不够的,需要将默认值调整到更大,调整方法如下:
- Linux每个用户打开文件最大数临时设置方法,重启服务器该参数无效,命令行终端执行如下命令:
ulimit -n 65535
- Linux每个用户打开文件最大数永久设置方法,将如下代码加入内核限制文件/etc/security/limits.conf的末尾。
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
上述设置为对每个用户分别设置nofile,noproc最大数,如果需要对Linux整个系统设置文件最大数限制,需要修改/proc/sys/fs/file-max中的值,该值为Linux总文件打开数,例如设置为echo 3865161233 > /proc/sys/fs/file-max。
1.4 内核参数的优化
Linxu /proc/sys目录下存放着多数内核的参数,并且可以在系统运行时进行更改,一般重新启动机器就会失效,而/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。
/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应改选,及修改sysctl.conf配置文件,其实是修改/proc/sys相关参数,所以对Linux内核优化只需修改/etc/sysctl.conf文件即可。以下为BAT企业生产环境/etc/sysctl.conf内核参数:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid= 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_windows_scaling = 1
net.ipv4.tcp_rmem = 4095 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core..wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65535
Linux内核常见参数详解如下:
- net.ipv4.tcp_timestamps = 1:该参数控制RFC 1323时间戳与窗口缩放选项。
- net.ipv4.tcp_sack = 1:选择性应答(SACK)是TCP的一项可选特性,可以提高某些网络中所有可用带宽的使用效率。
- net.ipv4.tcp_fack = 1:打开FACK(forward ACK)拥塞避免和快速重传功能。
- net.ipv4.tcp_retrans_collapse = 1:打开重传重组包功能,为0的时候关闭。
- net.ipv4.tcp_syn_retries = 5:对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃。
- net.ipv4.tcp_synack_retries = 5:tcp_synack_retries显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃。
- net.ipv4.tcp_max_orphans = 131072:系统所能处理不属于任何进程的TCP sockets最大数量。
- net.ipv4.tcp_max_tw_buckets = 5000:系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死。
- net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
如果某个TCP连接在空闲30s后,内核才发起probe(探查),若probe 3次(每次3s)即tcp_keepalive_intvl值不成功,内核才彻底放弃,认为该连接失败。
- net.ipv4.tcp_retries1 = 3:放弃回应一个TCP连接请求前,需要进行多少次重试。
- net.ipv4.tcp_retries2 = 15:在丢弃激活(已建立通信状态)的TCP连接之前,需要进行多少次重试。
- net.ipv4.tcp_fin_timeout = 30:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
- net.ipv4.tcp_tw_recycle = 1:表示开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭。
- net.ipv4.tcp_max_syn_backlog = 8192:表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
- net.ipv4.tcp_syncookies = 1:TCP建立连接的3路握手过程中,当服务端收到最初SYN请求时,会检查应用程序的syn_backlog队列是否已满。启用syncookie,可以解决超高并发是的“can't connect”问题,但是会导致TIME_WAIT状态fallback为保持2MSL时间,高峰期时会导致客户端无可复用连接而无法连接服务器。
- net.ipv4.tcp_orphan_retries = 0:关闭TCP连接之前重试多少次。
- net.ipv4.tcp_mem = 178368 237824 356736:net.ipv4.tcp_mem[0]表示低于此值,TCP没有内存压力,net.ipv4.tcp_mem[1]表示在此值下,进入内存压力阶段,net.ipv4.tcp_mem[2]表示高于此值,TCP拒绝分配socket。
- net.ipv4.tcp_tw_reuse = 1:表示开启重用,允许将TIME_WAIT sockets重新用于新的TCP连接。
- net.ipv4.ip_local_port_range = 1024 65000:表示用于向外连接的端口范围。
- net.ipv4.ip_conntrack_max = 655360:在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)。
- net.ipv4.icmp_ignore_bogus_error_responses = 1:开启恶意icmp错误消息保护。
- net.ipv4.tcp_syncookies = 1:开启SYN洪水攻击保护。
1.5 Linux内核报错剖析
企业生产环境Linux服务器正常运行,由于某种原因导致内核报错或者跑出很多信息,根据系统SA可以快速定位Linux服务器故障,Linux内核日志一般存在messages日志中,可以通过命令tail -fn 100 /var/log/messages查看,以下为Linux内核常见报错日志及生产环境解决报错的方案。
(1)Linux内核抛出net.ipv4.tcp_max_buckets错误,代码如下:
根据TCP协议定义的三次握手及四次断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(max segment lifetime)。如果该值设置过小导致,当系统TIME_WAIT数量超过默认这只的值时,即会抛出上述的警告信息,这时需要增加net.ipv4.tcp_max_buckets的值,警告信息才会消除,当然这个值也不能设置过大,对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket,设置比处于established状态下的socket多得多,严重影响服务器的处理能力,甚至耗尽可用的socket而停止服务,TIME_WAIT协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响机制,是TCP传输必要的逻辑保证。
(2)Linux内核抛出Too many open files错误,代码如下:
每个文件描述符与一个打开文件相对应,不同的文件描述符可以指向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进程中被多次打开。Linux内核对应每个用户打开的文件最大数一般为1024,需要将该值调高满足大并发网站的访问。
Linux每个用户打开文件最大数永久设置方法,将一下代码加入内核限制文件/etc/security/limits.conf的末尾,退出终端,重新登录即生效,代码如下:
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
(3)Linux内核抛出possible SYN flooding on port 80. Sending cookies错误,代码如下:
此问题是由于SYN队列已满,而出发SYN cookies,一般是由于大量的访问或者恶意访问导致,也称之为SYN flooding洪水攻击。
完整的TCP连接三次握手,假设一个用户A向服务器发送了SYN报文后突然死机或者掉线,那么服务器在发出SYN+ACK应答白问后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度成为SYN timeout,一般来说这个时间是分钟的数量级(大约为30s~2min)。
一个用户出现异常导致服务器的一个线程等待1min并不是什么很大问题,但如果有恶意的攻击者大量模拟这种情况,服务器将为了维护一个非常大的半连接列表而消耗非常多的资源,数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出奔溃,即使服务器端的系统足够强大,服务器也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常小),此时从正常客户的角度看来,服务器失去响应,服务器拒绝提供服务,服务器收到了DDOS攻击,这里攻击的手段为DDOS中SYN flooding攻击(SYN洪水攻击)。
防护DDOS攻击有两种手段:一是基于硬件专业防火墙;二是基于Linux内核简单防护。如果攻击流量特别大,淡村配置内核参数是无法抵挡的,还得依靠专业级硬件防火墙,一下为Linux内核防护DDOS优化参数,添加如下代码即可:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 8000
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
(4)Linux内核抛出nf_conntrack: table full,dropping packet.错误,代码如下:
由于该服务器开启了iptables防火墙,Web服务器收到了大量的连接,iptables会把所有的连接都做连接跟踪处理,这样iptables就会有一个连接跟踪表,当这个表满的时候,就会出现上面的错误。ip_conntrack是Linux NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录TCP通信协议的established connection记录。
如果是CentOS 6.x系统,需执行modprobe nf_conntrack命令,然后在内核优化文件中加入如下代码,sysctl -p使其内核文件生效,即可解决该报错。
net.ipv4.ip_conntrack_max == 655350
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 10800
1.6 影响服务器性能因素
影响企业生产环境Linux服务器性能的因素有很多,一般分为两大类,即操作系统层级和应用程序级别。以下为各级别影响性能的具体项及性能评估的标准。
(1)操作系统级别。
- 内存;
- CPU;
- 磁盘I/O;
- 网络I/O带宽;
(2)应用程序及软件。
- Nginx;
- MySQL;
- Tomcat;
- PHP;
- 应用程序代码。
(3)Linux系统性能评估标准如下图所示。
(4)Linux系统性能分析工具。
常用系统性能分析命令为vmstat,sar,iostat,netstat,free,ps,top,iftop等。
常用系统性能组合分析命令如下:
- vmstat,sar,iostat:检测是否是CPU瓶颈。
- free,vmstat:检测是否是内存瓶颈。
- iostat:检测是否磁盘I/O瓶颈。
- netstat,iftop:检测是否是网络带宽瓶颈。
1.7 Linux服务器性能评估与优化
Linux服务器性能评估与优化是一项长期的工作,需要随时关注网站服务器的运行状态,及时作出相应的调整,以下为Linux服务器性能评估及优化方案。
(1)Linux系统整体性能评估。
uptime命令主要用于查看当前服务器整体性能,例如CPU,负载,内存等值的总览,以下uptime命令应用案例及详解。
load average负载有3个值,分别表示最近1min,5min,15min系统的负载,3个值的大小一般不能大于系统逻辑CPU核心数的2被,例如Linux操作系统有4个逻辑CPU,如果load average的3个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,可以不用担心,一般不会影响系统性能。
(2)CPU性能评估。
利用vmstat命令监控系统CPU,该命令可以显示关于系统各种资源之间相关性能的简要信息,主要用它来查看CPU负载及队列情况。日下图所示,为vmstat命令在某个系统的输出结果。
vmstat输出结果详解如下:
- r:该列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
- b:该列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。
- us:该列显示了用户进程消耗的CPU时间百分比,us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
- sy:该列显示了内核进程消耗的CPU的时间百分比,sy的值较高时,说明内核消耗的CPU资源很多。
- us+sy:参考值为80%,如果us+sy大于80%说明可能存在CPU资源不足。
- 利用sar命令监控系统CPU,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。如下图所示,为sar命令对某个系统的CPU统计输出。
sar输出结果详细解决如下:
- %user:该列显示了用户进程消耗的CPU时间百分比。
- %nice:该列显示了运行正常进程所消耗的CPU时间百分比。
- %system:该列显示了系统进程消耗的CPU时间百分比。
- %iowait:该列显示了I/O等待所占用的CPU时间百分比。
- %idle:该列显示了CPU处在空闲状态的时间百分比。
- %steal:该列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作。
(3)内存性能评估。
利用free指令监控内存,free是监控Linux内存使用状态最常用的指令,如下图所示为服务器内存使用情况。
一般而言,服务器内存可以通过以下方法判断是否空余。
- 应用程序可用内存/系统物理内存大于70%时,表示系统内存资源非常充足,不影响系统性能;
- 应用程序可用内存/系统物理内存小于20%时,表示系统内存资源紧缺,需要增加系统内存;
- 20%<应用程序可用内存/系统物理内存小于70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
(4)磁盘I/O性能评估。
利用iostat评估磁盘性能,监控磁盘I/O读写及带宽,如下图所示。
iostat输出结果详解如下:
- Blk_read/s:表示每秒读取的数据块数。
- Blk_wrtn/s:表示每秒写入的数据块数。
- Blk_read:表示读取的所有块数。
- Blk_wrtn:表示写入的所有块数。
可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。
利用sar评估磁盘性能,通过sar -d组合,可以对系统的磁盘I/O做基本的统计,如下图:
sar输出结果详解如下:
- await:表示平均每次设备I/O操作的等待时间(以ms为单位)。
- svctm:表示平均每次设备I/O操作的服务时间(以ms为单位)。
- %util表示ls中有百分之几的时间用于I/O操作。
磁盘I/o性能,评判标准为正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU,内存的符合也会对svctm值造成影响,过多的请求也会间接滴导致svctm值的增加。
await值的大小一般取决于svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去势必影响系统的性能,可以通过优化程序或者通过更换更高,更快的磁盘来解决此问题。
(5)网络性能评估。
- 通过ping命令检测网络的连通性;
- 通过netstat -i组合检测网络接口状态;
- 通过netstat -r组合检测系统的路由表信息;
- 通过sar -n组合显示系统的网络运行状态。
通过iftop -i eth0可以查看网卡流量,详细参数如下:
- <=:客户端流入的流量。
- =>:服务器端流出的流量。
- TX:发送流量。
- RX:接受流量。
- TOTAL:总流量。
- cumm:运行iftop到目前时间的总流量。
- peak:流量峰值。
- rates:分别表示过去2s,10s,40s的平均流量。