找项目网找项目网  2023-05-20 04:00 找项目网 隐藏边栏
导语: 访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测IO性能,有必要了解一下基本原理和Linux是如何处理硬盘和内存之间的IO的。上面提到的Linux性能监测:Memory提到了内存和硬盘之间的IO是以页为单位来进行的,在Linux系统上1页的大小为4K。

Linux性能监测:磁盘IO篇

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离CPU距离最远而且CPU访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测IO性能,有必要了解一下基本原理和Linux是如何处理硬盘和内存之间的IO的。

内存页

上面提到的Linux性能监测:Memory提到了内存和硬盘之间的IO是以页为单位来进行的,在Linux系统上1页的大小为4K。可以用以下命令查看系统默认的页面大小:

[plain]view plaincopy

$/usr/bin/time-vdate

...

Pagesize(bytes):4096

...

缺页中断

Linux利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux内核首先检查CPU的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(PageFault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(MajorPageFault)和次缺页中断(MinorPageFault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的time命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:

[plain]view plaincopy

$/usr/bin/time-vdate

...

Major(requiringI/O)pagefaults:1

Minor(reclaimingaframe)pagefaults:260

...

FileBufferCache

从上面的内存缓存区(也叫文件缓存区FileBufferCache)读取页比从硬盘读取页要快得多,所以Linux内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候Linux才开始释放一些不用的页。我们运行Linux一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了Linux对内存管理很低效的假象,事实上Linux把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面打印的是VPSee的一台Sun服务器上的物理内存和文件缓存区的情况:

[plain]view plaincopy

$cat/proc/meminfo

MemTotal:8182776kB

MemFree:3053808kB

Buffers:342704kB

Cached:3972748kB

这台服务器总共有8GB物理内存(MemTotal),3GB左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached),可见Linux真的用了很多物理内存做Cache,而且这个缓存区还可以不断增长。

页面类型

Linux中内存页面有三种类型:

•Readpages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。

•Dirtypages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由pdflush负责同步到硬盘,内存不足的时候由kswapd和pdflush把数据写回硬盘并释放内存。

•Anonymouspages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由kswapd负责将它们写到交换分区并释放内存。

IO’sPerSecond(IOPS,每秒IO次数)

每次磁盘IO请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受。在一台2001年的典型1GHzPC上,磁盘随机访问一个word需要8,000,000nanosec=8millisec,顺序访问一个word需要200nanosec;而从内存访问一个word只需要10nanosec.(数据来自:TeachYourselfProgramminginTenYears)这个硬盘可以提供125次IOPS(一秒钟即1000ms/ 每次用时8ms)。

顺序IO和随机IO

IO可分为顺序IO和随机IO两种,性能监测前需要弄清楚系统偏向顺序IO的应用还是随机IO应用。顺序IO是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序IO可以同时很快的移动大量数据。可以这样来评估IOPS的性能,用每秒读写IO字节数除以每秒读写IO次数(rkB/s除以r/s,wkB/s除以w/s,即每次读能够读入的大小KBper O,每次写能写入的大小KBperI)。下面显示的是连续2秒的IO情况,可见每次IO写的数据是增加的(45060.00/99.00=455.15KBperIO,54272.00/112.00=484.57KBperIO)。相对随机IO而言磁盘和内存的区别,顺序IO更应该重视每次IO的吞吐能力(KBperIO):

[plain]view plaincopy

$iostat-kx1

avg-cpu:%user%nice%system%iowait%steal%idle

0.000.002.5025.250.0072.25

Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

sdb24.0019995.0029.0099.004228.0045060.00770.1245.01539.657.8099.80

avg-cpu:%user%nice%system%iowait%steal%idle

0.000.001.0030.670.0068.33

Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

sdb3.0012235.003.00112.00768.0054272.00957.22144.85576.448.70100.10

随机IO是指随机请求数据,其IO速度不依赖于数据的大小和排列,依赖于磁盘的每秒能IO的次数,比如Web服务、Mail服务等每次请求的数据都很小,随机IO每秒同时会有更多的请求数产生,所以磁盘的每秒能IO多少次是关键。

[plain]view plaincopy

$iostat-kx1

avg-cpu:%user%nice%system%iowait%steal%idle

1.750.000.750.250.0097.26

Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

sdb0.0052.000.0057.000.00436.0015.300.030.540.231.30

avg-cpu:%user%nice%system%iowait%steal%idle

1.750.000.750.250.0097.24

Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

sdb0.0056.440.0066.340.00491.0914.810.040.540.191.29

按照上面的公式得出:436.00/57.00=7.65KBperIO,491.09/66.34=7.40KBperIO.与顺序IO比较发现,随机IO的KBperIO小到可以忽略不计,可见对于随机IO而言重要的是每秒能IOPS的次数,而不是每次IO的吞吐能力(KBperIO)。

SWAP

当系统没有足够物理内存来应付所有请求的时候就会用到swap设备,swap设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用swap的代价非常大。如果系统没有物理内存可用,就会频繁swapping,如果swap设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的IO问题,最终导致整个系统迟缓,甚至崩溃。swap设备和内存之间的swapping状况是判断Linux系统性能的重要参考,我们已经有很多工具可以用来监测swap和swapping情况,比如:top、cat/proc/meminfo、vmstat等:

[plain]view plaincopy

$cat/proc/meminfo

MemTotal:8182776kB

MemFree:2125476kB

Buffers:347952kB

Cached:4892024kB

SwapCached:112kB

...

SwapTotal:4096564kB

SwapFree:4096424kB

...

Linux性能监测:网络篇

网络的监测是所有Linux子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与Linux主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为Linux网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过ethtool工具来查看网卡的配置和工作模式:

[plain]view plaincopy

#/sbin/ethtooleth0

Settingsforeth0:

Supportedports:[TP]

Supportedlinkmodes:10baseT/Half10baseT/Full

100baseT/Half100baseT/Full

1000baseT/Half1000baseT/Full

Supportsauto-negotiation:Yes

Advertisedlinkmodes:10baseT/Half10baseT/Full

100baseT/Half100baseT/Full

1000baseT/Half1000baseT/Full

Advertisedauto-negotiation:Yes

Speed:100Mb/s

Duplex:Full

Port:TwistedPair

PHYAD:1

Transceiver:internal

Auto-negotiation:on

SupportsWake-on:g

Wake-on:g

Currentmessagelevel:0x000000ff(255)

Linkdetected:yes

上面给出的例子说明网卡有10baseT,100baseT和1000baseT三种选择,目前正自适应为100baseT(Speed:100Mb/s)。可以通过ethtool工具强制网卡工作在1000baseT下:

[plain]view plaincopy

#/sbin/ethtool-seth0speed1000duplexfullautonegoff

iptraf

两台主机之间有网线(或无线)、路由器、交换机等设备,测试两台主机之间的网络性能的一个办法就是在这两个系统之间互发数据并统计结果,看看吞吐量、延迟、速率如何。iptraf就是一个很好的查看本机网络吞吐量的好工具,支持文字图形界面,很直观。下面图片显示在100mbps速率的网络下这个Linux系统的发送传输率有点慢,Outgoingrates只有66mbps.

[plain]view plaincopy

#iptraf-deth0

netperf

netperf运行在client/server模式下,比iptraf能更多样化的测试终端的吞吐量。先在服务器端启动netserver:

[plain]view plaincopy

#netserver

Startingnetserveratport12865

Startingnetserverathostname0.0.0.0port12865andfamilyAF_UNSPEC

然后在客户端测试服务器,执行一次持续10秒的TCP测试:

[plain]view plaincopy

#netperf-H172.16.38.36-l10

TCPSTREAMTESTfrom0.0.0.0(0.0.0.0)port0AF_INETto172.16.38.36(172.16.38.36)port0AF_INET

RecvSendSend

SocketSocketMessageElapsed

SizeSizeSizeTimeThroughput

bytesbytesbytessecs.10^6bits/sec

87380163841638410.3293.68

从以上输出可以看出,网络吞吐量在94mbps左右,对于100mbps的网络来说这个性能算的上很不错。上面的测试是在服务器和客户端位于同一个局域网,并且局域网是有线网的情况,你也可以试试不同结构、不同速率的网络,比如:网络之间中间多几个路由器、客户端在wi-fi、VPN等情况。

netperf还可以通过建立一个TCP连接并顺序地发送数据包来测试每秒有多少TCP请求和响应。下面的输出显示在TCPrequests使用2K大小,responses使用32K的情况下处理速率为每秒243:

[plain]view plaincopy

#netperf-tTCP_RR-H172.16.38.36-l10---r2048,32768

TCPREQUEST/RESPONSETESTfrom0.0.0.0(0.0.0.0)port0AF_INETto172.16.38.36(172.16.38.36)port0AF_INET

Local/Remote

SocketSizeRequestResp.ElapsedTrans.

SendRecvSizeSizeTimeRate

bytesBytesbytesbytessecs.persec

163848738020483276810.00243.03

1638487380

iperf

iperf和netperf运行方式类似,也是server/client模式,先在服务器端启动iperf:

[plain]view plaincopy

#iperf-s-D

------------------------------------------------------------

ServerlisteningonTCPport5001

TCPwindowsize:85.3KByte(default)

------------------------------------------------------------

RunningIperfServerasadaemon

TheIperfdaemonprocessID:5695

然后在客户端对服务器进行测试磁盘和内存的区别,客户端先连接到服务器端(172.16.38.36),并在30秒内每隔5秒对服务器和客户端之间的网络进行一次带宽测试和采样:

[plain]view plaincopy

#iperf-c172.16.38.36-t30-i5

------------------------------------------------------------

Clientconnectingto172.16.38.36,TCPport5001

TCPwindowsize:16.0KByte(default)

------------------------------------------------------------

[3]local172.16.39.100port49515connectedwith172.16.38.36port5001

[ID]IntervalTransferBandwidth

[3]0.0-5.0sec58.8MBytes98.6Mbits/sec

[ID]IntervalTransferBandwidth

[3]5.0-10.0sec55.0MBytes92.3Mbits/sec

[ID]IntervalTransferBandwidth

[3]10.0-15.0sec55.1MBytes92.4Mbits/sec

[ID]IntervalTransferBandwidth

[3]15.0-20.0sec55.9MBytes93.8Mbits/sec

[ID]IntervalTransferBandwidth

[3]20.0-25.0sec55.4MBytes92.9Mbits/sec

[ID]IntervalTransferBandwidth

[3]25.0-30.0sec55.3MBytes92.8Mbits/sec

[ID]IntervalTransferBandwidth

[3]0.0-30.0sec335MBytes93.7Mbits/sec

tcpdump和tcptrace

tcmdump和tcptrace提供了一种更细致的分析方法,先用tcpdump按要求捕获数据包把结果输出到某一文件,然后再用tcptrace分析其文件格式。这个工具组合可以提供一些难以用其他工具发现的信息:

[plain]view plaincopy

#/usr/sbin/tcpdump-wnetwork.dmp

tcpdump:listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes

511942packetscaptured

511942packetsreceivedbyfilter

0packetsdroppedbykernel

#tcptracenetwork.dmp

1argremaining,startingwith'network.dmp'

Ostermann'stcptrace--version6.6.7--ThuNov4,2004

511677packetsseen,511487TCPpacketstraced

elapsedwallclocktime:0:00:00.510291,1002714pkts/secanalyzed

tracefileelapsedtime:0:02:35.836372

TCPconnectioninfo:

1:zaber:54581-boulder:111(a2b)6>55325752553785555555

———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99

1.站长不是项目作者,不对项目解答及盈亏负责。
2.本站所有项目来源于投稿或购买自其他第三方,若本站侵犯了您的权益请 联系站长 进行删除处理。
找项目网
找项目网 关注:0    粉丝:0
这个人很懒,什么都没写
扫一扫二维码分享
×
Dragon