服务器常见参数监测及调优(二)
IO子系统
vmstat,iostat,sar
IO,输出输入。
一个IO,指的是从磁盘把数据读出来或者把数据写磁盘上,就称之为一个IO。
IOPS 每秒钟完成多少个IO (io per second)
10k RPM <--每分钟一万转,120 IOPS
15 RPM <--每分钟15000转, 150-200 IOPS
一次IO取一个block size大小
block size 越大,IO吞吐量大,但浪费空间较多
越小,IO吞吐量小,但浪费空间较少
IO 可分为顺序 IO 和 随机 IO 两种
IO的类型:
随机IO
一般的硬盘处理效率最慢的就是随机IO。每个IO完成的数据量非常低。
顺序IO
这些IO涉及数据都是连续存放在磁盘上。
顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,
顺序 IO 可以同时很快的移动大量数据。
相对随机 IO 而言,顺序 IO 更应该重视每次 IO 的吞吐能力(KB per IO);
随机IO更重视每秒的IO次数IOPS
# iostat
Linux 2.6.32-279.el6.x86_64 (li.cluster.com) 04/25/2014 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
9.72 0.57 1.34 1.71 0.00 86.66
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 24.47 2157.44 43.86 17100165 347648
md127 0.02 0.13 0.00 1016 0
dm-0 0.01 0.08 0.00 672 0
tps 每秒的IO传输次数
Blk_read/s 每秒读了多少个block(一个block单位为512bytes)
Blk_wrtn/s 每秒写了多少个block
Blk_read 两次查看的时间间隔内,一共读了多少块(Blk_read/s乘以两次查看时间间隔秒数)
Blk_wrtn 两次查看的时间间隔内,一共写了多少块(Blk_wrtn/s乘以两次查看时间间隔秒数)
# iostat 2 --每两秒显示所有的分区IO状态
# iostat -kx -d sda 2 3
--查看sda的IO状态报告,每两秒打印一次,总共三次 ; -k是表示把默认以每秒多少块显示成每次多少KB;-x打印了一些扩展选项
Linux 2.6.32-279.el6.x86_64 (li.cluster.com) 04/25/2014 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 7.82 4.13 22.09 1.29 1028.68 21.69 89.83 0.15 6.45 2.02 4.72
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 3.50 0.00 3.00 0.00 26.00 17.33 0.02 8.00 7.50 2.25
r/s 每秒完成多少个读IO
w/s 每秒完成多少个写IO <-- IOPS=(r/s+w/s)
rsec/s 每秒读取了多少扇区的数据。 一个扇区=512字节数据
wsec/s 每秒写了多少扇区的数据。
rkB/s 每秒读了多少kb数据
wkB/s 每秒写了多少kb数据
avgrq-sz平均请求数据的大小
avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好。
await
平均完成IO需要等待多少时间, 包含服务时间,还有在队列中等待的时间。
svctm
服务时间,从IO请求产生到,完成IO的时间。从源代码里可以看出:
(r/s+w/s)*(svctm/1000)=util。
举例子:如果util达到100%,那么此时svctm=1000/(r/s+w/s),
假设IOPS是1000,那么svctm大概在1毫秒左右,如果长时间大于这个数值,
说明系统出了问题。
不过前面已经说过在磁盘阵列等多盘系统中util可能出现偏大的情况,所以svctm相应的也可能偏大。
%util
磁盘带宽使用百分比。如果一直都是100%,说明磁盘很忙。
# sar -b 查看今天历史磁盘IO情况
=======================================================================
网络子系统
网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,
比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、
交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,
增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,
意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。
1、检查是否通电
# mii-tool
2、检查网卡的工作模式和修改
# ethtool eth1
# ethtool -s eth1 speed 100 duplex full autoneg on
3,用一些工具扫描内网用户
#ls /share/soft/soft/soft/arp-scan/ --此目录下三个软件包
libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
libpcap-devel-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
arp-scan-1.6.tar.gz
安装方法:因为arp-scan依赖于libpcap-devel,而libpcap-devel又依赖于libpcap;而如果你在rhel6_x86_64上安装,它自带libpcap但没有libpcap-devel,并且版本和我这里共享的不同
所以
rpm -ivh libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm --force 强制安装覆盖自带的版本
rpm -ivh libpcap-devel-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
然后解压arp-scan
./configure
make
make install
#arp-scan -l --interface br0
4、检测网卡的当前负载
# sar -n DEV 2 10
# cat /proc/net/dev
5,两台主机之间有网线(或无线)、路由器、交换机等设备,
测试两台主机之间的网络性能的一个办法就是在这两个系统之间互发数据并统计结果,看看吞吐量、延迟、速率如何。
iptraf 就是一个很好的查看本机网络吞吐量的好工具,支持文字图形界面,很直观。
yum install iptraf
# iptraf -d br0
6,netperf 运行在 client/server 模式下,比 iptraf 能更多样化的测试终端的吞吐量。
/share/soft/netperf/netperf-2.5.0.tar.gz
解压
./configure
make
make install
安装完成后会有netserver(服务器端命令)和netperf(客户端命令)这两个命令
测试方法:服务器和客户端都要安装此软件
在服务器上
# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
# netstat -ntlup |grep 12865 --端口为12865
tcp 0 0 :::12865 :::* LISTEN 18366/netserver
在客户端上
# netperf -H 10.0.0.21 -l 30 --这里表示一次测试时间为30秒
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.0.0.21 (10.0.0.21) port 0 AF_INET
# netperf -H 10.0.0.21 -l 30
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 30.39 87.39 --这里的87.39的单位是10^6bits,所以要算每秒多少MB就应该$[87.39*1000000/8/1000/1000]算得多少MB/s大概为10M多/s(因为百M局域网理论值为12.5MB/s)
如果要对上面的几大子系统进行微调,一般是对内核参数进行小范围的修改
1,如何查看内核参数
# sysctl -a --这里查看所有当前内核参数的值,这些值都可以在/proc下查到
例如
# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
这个参数对应的/proc路径为/proc/sys/net/ipv4/ip_forward
# sysctl -a |grep file-max
fs.file-max = 381908
这个参数对应的/proc路径为/proc/sys/fs/file-max
2,如何修改内核参数
临时修改,重启后不生效;如
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效,需要修改/etc/sysctl.conf配置文件
net.ipv4.ip_forward = 1 --修改,没有此参数就手动加上
保存后,记得要用sysctl -p使之生效
常见的需要调整的与网络有关参数如下
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max=65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
上网了解linux2.6内核后的四种IO调度算法的区别和比较
上网了解linux下文件系统的比较
=========================================================================
linux双网卡绑定(七种模式)
这里使用一台kvm虚拟机来测试(两张网卡物理上要同网段)
注意:如果使用vmware workstation版本来测试的话,在做网卡切换时有可能会造成虚拟机死机等情况(所以用kvm做比较容易实现效果)
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
MASTER=bond0
SLAVE=yes
# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
MASTER=bond0
SLAVE=yes
# cat /etc/sysconfig/network-scripts/ifcfg-bond0 --此文件不存在,手动创建
DEVICE="bond0"
BOOTPROTO="static"
IPADDR=10.0.0.11
NETMASK=255.255.255.0
NM_CONTROLLED="no"
ONBOOT="yes"
# cat /etc/modprobe.d/bond.conf --这个文件也不存在,手动创建(名字随意,在此目录以.conf结尾就可以)
alias bond0 bonding
options bond0 miimon=100 mode=1 --miimon=100表示系统每100ms监测一次链路连接状态,mode=1表示为主备模式
# /etc/init.d/NetworkManager stop
# /etc/init.d/network restart --第一次重启有报错,再重启一次就没问题了
# /etc/init.d/network restart
# chkconfig NetworkManager off
# chkconfig network on
验证
1,使用ifconfig查看(可以看到三个网卡MAC地址一致)
# ifconfig |grep -E "eth|bond" -A 1
bond0 Link encap:Ethernet HWaddr 00:0C:29:F4:4C:DE
inet addr:10.0.0.11 Bcast:10.0.0.255 Mask:255.255.255.0
--
eth0 Link encap:Ethernet HWaddr 00:0C:29:F4:4C:DE
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
--
eth1 Link encap:Ethernet HWaddr 00:0C:29:F4:4C:DE
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
2,查看网卡状态
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0 --主备模式目前正在使用的主网卡
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f4:4c:de --eth0的MAC
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f4:4c:e8 --eth1的MAC,在这里看是和ifconfig看不一样的
Slave queue ID: 0
或者使用iptraf来看
# yum install iptraf
# iptraf --打开所有网卡查看(可以找另一台机器去ping他,模拟有数据包),只有bond0和eth0有数据包,说明eth0为主,eth1为备
3,测试主备切换
ifconfig eth0 down模拟网卡eth0出问题,再查看状态
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1 --主网卡成为eth1了
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: down --eth0的状态为down了
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: 00:0c:29:f4:4c:de
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f4:4c:e8
Slave queue ID: 0
负载模式的讨论
# cat /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=0 --改为0模式,重启kvm(重启network服务的话状态还是1模拟,所以把虚拟机重启一下),再查看状态
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f4:4c:de
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f4:4c:e8
Slave queue ID: 0
测试:
还是使用iptraf来测试,会发现bond0,eth0,eth1的网卡都会有数据包,并且bond0的数据包为eth0和eth1的总和
ifconfig eth0 down断掉一个网卡后,只有bond0和eth1有数据包