‍Linux性能检查(二)Memory和IO

Linux性能检查(二)Memory和IO

内存包括物理内存和虚拟内存,虚拟内存(VirtualMemory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分(SWAP)组合在一起作为虚拟内存为计算机提供连贯的虚拟内存空间。

好处是内存变多了,缺点是硬盘读写速度比内存慢很多,并且RAM和SWAP之间的交换增加了系统负担。

在操作系统里,虚拟内存被分成页,在X86系统上每个页大小事4KB。Linux内核读写虚拟内存是以“页”为单位操作的,把内存移动到硬盘交换空间(SWAP)和从交换空间读取到内存都是按页来读写的。内存和SWAP的这种交换过程称为页面交换(Paging),值得注意的是paging和swapping是两个完全不同的概念。swapping在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,paging只交换程序的部分。

kswapddaemon用来检查pages_high和pages_low,如果可用内存少于pages_low,kswapd就开始扫描并试图释放,并且重复扫描释放的过程直到可用内存大于pages_high为止。扫描的时候检查3件事:

1)如果页面没有修改,把页放到可用内存列表里;

2)如果页面被文件系统修改,把页面内容写到磁盘上;

3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。

pdflushdaemon用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬盘,由pdflush决定什么时候把相应页面写入硬盘,这由一个内核参数vm.dirty_background_ratio来控制,比如下面的参数显示脏页面(dirtypages)达到所有内存页面10%的时候开始写入硬盘。

#/sbin/sysctl-nvm.dirty_background_ratio

10

我的系统是

>/sbin/sysctl-nvm.dirty_background_ratio

5

>vmstat5

rbswpdfreebuffcachesisobiboincsussyidwast

104017359802109328855852000631339400

10401736088210932885585200021712641098100

参数解释:

swpd,已使用的SWAP空间大小,KB为单位;

free,可用的物理内存大小,KB为单位;

buff,物理内存用来缓存读写操作的buffer大小,KB为单位;

cache,物理内存用来缓存进程地址空间的cache大小,KB为单位;

si,数据从SWAP读取到RAM(swapin)的大小,KB为单位;

so,数据从RAM写到SWAP(swapout)的大小,KB为单位;

bi,磁盘块从文件系统或SWAP读取到RAM(blocksin)的大小,block为单位;

bo,磁盘块从RAM写到文件系统或SWAP(blocksout)的大小,block为单位;

IO介绍

磁盘通常是最慢的子系统,CPU访问磁盘要设计到机械操作,比如转轴、寻轨等。

查看页面大小的命令:

>/usr/bin/time-vdate

ThuNov2514:20:03CST2010

Commandbeingtimed:"date"

Usertime(seconds):0.00

Systemtime(seconds):0.00

PercentofCPUthisjobgot:?%

Elapsed(wallclock)time(h:mm:ssorm:ss):0:00.00

Averagesharedtextsize(kbytes):0

Averageunshareddatasize(kbytes):0

Averagestacksize(kbytes):0

Averagetotalsize(kbytes):0

Maximumresidentsetsize(kbytes):0

Averageresidentsetsize(kbytes):0

Major(requiringI/O)pagefaults:0

Minor(reclaimingaframe)pagefaults:217

Voluntarycontextswitches:1

Involuntarycontextswitches:1

Swaps:0

Filesysteminputs:0

Filesystemoutputs:0

Socketmessagessent:0

Socketmessagesreceived:0

Signalsdelivered:0

Pagesize(bytes):4096

Exitstatus:0

缺页中断

当程序启动的时候,LINUX内核首先检查CPU的缓存和物理内存,如果数据已经在内存就忽略,如果数据不再内存就引起一个缺页中断(PageFault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。

缺页中断可以分为主缺页中断(MajorPageFault)和次缺页中断(MinorPageFault)。从硬盘读取数据而产生的中断时主缺页中断,数据已经读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

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

>/usr/bin/time-vdate

...

Major(requiringI/O)pagefaults:0

Minor(reclaimingaframe)pagefaults:217

...

FileBufferCache

从上面的内存缓存区(也叫文件缓存区FileBufferCache)读取页比从硬盘读取页要快得多,所以Linux内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候Linux才开始释放一些不用的页。

查看服务器上的物理内存和文件缓存区的情况:

>cat/proc/meminfo

MemTotal:16469796kB

MemFree:1530664kB

Buffers:211048kB

Cached:8955204kB

MemTotal总内存16G;

MemFree空闲内存1.5G;

磁盘缓存(Buffers)200MB;

文件缓存区(Cached)8G;

页面类型

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

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

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

IO'sPerSecond(IOPS)

顺序IO和随机IO

顺序IO是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序IO可以同时很快的移动大量数据。可以这样来评估IOPS的性能,用每秒读写IO字节数除以每秒读写IOPS数,rkB/s除以r/s,wkB/s除以w/s.顺序IO更应该重视每次IO的吞吐能力(KBperIO)

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

运行命令:

[root@cd5~]#iostat-kx1

-bash:iostat:commandnotfound

没有安装对应的包,执行安装命令:

>yuminstallsysstat

>iostat-kx1

Linux2.6.26.8-57.fc8(xxxxxxxx)11/25/2010

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

0.442.603.140.020.0093.80

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

sda0.014.660.111.111.5723.0640.430.0110.860.720.09

sda10.000.000.000.000.000.0014.670.003.682.740.00

sda20.014.660.111.111.5723.0640.430.0110.860.720.09

dm-00.000.000.125.761.5723.068.370.61103.200.150.09

dm-10.000.000.000.000.000.008.000.003.010.780.00

SWAP

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

>cat/proc/meminfo

MemTotal:16469796kB

MemFree:1524940kB

Buffers:211776kB

Cached:8960460kB

SwapCached:28kB

...

SwapTotal:2031608kB

SwapFree:2031568kB

>free-m

totalusedfreesharedbufferscached

Mem:1608314595148702068751

-/+buffers/cache:563710446

Swap:198301983

关系:total(1002M)=used(769M)+free(232M)

第二部分(-/+buffers/cache):

(-buffers/cache)used内存数:286M(指的第一部分Mem行中的used-buffers-cached)

(+buffers/cache)free内存数:715M(指的第一部分Mem行中的free+buffers+cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

参考:

http://www.blogjava.net/cssseek/archive/2010/10/27/335794.html

相关推荐