磁盘IO监控.docx

上传人:b****1 文档编号:204406 上传时间:2023-04-28 格式:DOCX 页数:15 大小:240.52KB
下载 相关 举报
磁盘IO监控.docx_第1页
第1页 / 共15页
磁盘IO监控.docx_第2页
第2页 / 共15页
磁盘IO监控.docx_第3页
第3页 / 共15页
磁盘IO监控.docx_第4页
第4页 / 共15页
磁盘IO监控.docx_第5页
第5页 / 共15页
磁盘IO监控.docx_第6页
第6页 / 共15页
磁盘IO监控.docx_第7页
第7页 / 共15页
磁盘IO监控.docx_第8页
第8页 / 共15页
磁盘IO监控.docx_第9页
第9页 / 共15页
磁盘IO监控.docx_第10页
第10页 / 共15页
磁盘IO监控.docx_第11页
第11页 / 共15页
磁盘IO监控.docx_第12页
第12页 / 共15页
磁盘IO监控.docx_第13页
第13页 / 共15页
磁盘IO监控.docx_第14页
第14页 / 共15页
磁盘IO监控.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

磁盘IO监控.docx

《磁盘IO监控.docx》由会员分享,可在线阅读,更多相关《磁盘IO监控.docx(15页珍藏版)》请在冰点文库上搜索。

磁盘IO监控.docx

磁盘IO监控

IO

磁盘通常是计算机最慢的子系统,也是最容易出现瓶颈的地方,因为磁盘离CPU距离最远而且CPU访问磁盘要涉及到机械操作,比如:

转轴,寻轨等。

访问硬盘和访问内存之间的速度差是一数量级别来计算的,就像1天和1分钟的差别一样,要检测IO性能,有必要了解一下基本原理和linux是如何处理硬盘和内存之间的IO。

内存页:

Linux系统默认的内存页为4k

sudo/usr/bin/time-vdate

Linux利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。

事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。

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

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

上面的内存缓存区起到了预读硬盘的作用,内核预先在物理内存中寻找缺页,没有的话,产生次缺页中断会从内存缓存里找,如果还没有就从硬盘读取。

很显然,多余的内存拿出来做成内存缓存区提高访问速度,这里还有一个命中的问题,好的话,每次缺页都能从内存缓存区读到,提高命中的最简单防范,就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中也率也就越高。

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

我们运行Linux一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了Linux对内存管理很低效的假象,事实上Linux把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。

下面打印的是VPSee的一台Sun服务器上的物理内存和文件缓存区的情况:

页面类型

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

Readpages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。

当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。

Dirtypages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。

这些文件由pdflush负责同步到硬盘,内存不足的时候由kswapd和pdflush把数据写回硬盘并释放内存。

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

顺序IO和随机IO

IO可分为顺序IO和随机IO两种,性能监测前需要弄清楚系统偏向顺序IO的应用还是随机IO应用。

顺序IO是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序IO可以同时很快的移动大量数据。

可以这样来评估IOPS的性能,用每秒读写IO字节数除以每秒读写IOPS数,rkB/s除以r/s,wkB/s除以w/s.下面显示的是连续2秒的IO情况,可见每次IO写的数据是增加的(45060.00/99.00=455.15KBperIO,54272.00/112.00=484.57KBperIO)。

相对随机IO而言,顺序IO更应该重视每次IO的吞吐能力(KBperIO):

随机IO是指随时请求的数据,其IO速度不依赖于数据的大小排序,依赖于磁盘每秒能IO次数,比如WEBMAIL等服务

当系统没有足够物理内存来应付所有请求的时候就会用到swap设备,swap设备可以是一个文件,也可以是一个磁盘分区。

不过要小心的是,使用swap的代价非常大。

如果系统没有物理内存可用,就会频繁swapping,如果swap设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的IO问题,最终导致整个系统迟缓,甚至崩溃。

swap设备和内存之间的swapping状况是判断Linux系统性能的重要参考,我们已经有很多工具可以用来监测swap和swapping情况,比如:

top、cat/proc/meminfo、vmstat等:

内存

这里的讲到的“内存”包括物理内存和虚拟内存,虚拟内存(VirtualMemory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且RAM和SWAP之间的交换增加了系统的负担。

在操作系统里,虚拟内存被分成页,在x86系统上每个页大小是4KB。

Linux内核读写虚拟内存是以“页”为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。

内存和SWAP的这种交换过程称为页面交换(Paging),值得注意的是paging和swapping是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和paging只交换程序的部分(页面)是两个不同的概念。

纯粹的swapping在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是paging或者paging/swapping混合,swapping最初是在UnixsystemV上实现的。

kswapddaemon用来检查pages_high和pages_low,如果可用内存少于pages_low,kswapd就开始扫描并试图释放32个页面,并且重复扫描释放的过程直到可用内存大于pages_high为止。

扫描的时候检查3件事:

1)如果页面没有修改,把页放到可用内存列表里;2)如果页面被文件系统修改,把页面内容写到磁盘上;3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。

pdflushdaemon用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。

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

#/sbin/sysctl-nvm.dirty_background_ratio

#vmstat1

procs-----------memory-------------swap-------io------system-------cpu-----

rbswpdfreebuffcachesisobiboincsussyidwast

000333356104300141888007214370010000

00033331610430014188800001740019900

000333316104300141888000018400010000

000333316104300141888000019400010000

0003333161043001418880001624480010000

000333316104300141888000016410010000

00033331610430014188800002040001000swpd,已使用的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为单位;

物理内存x10%=A,说明最小内存保持在A这个值的时候,就开始大量的使用swap。

CPU

CPU的占用主要取决于什么样的资源正在CPU上面运行,比如拷贝一个文件通常占用较少CPU,因为大部分工作是由DMA(DirectMemoryAccess)完成,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成;科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作。

要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:

中断、进程调度、进程上下文切换、可运行队列等。

这里VPSee用个例子来简单介绍一下这些概念和他们的关系,CPU很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。

CPU也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是CPU的管理程序,用来管理和分配CPU资源,合理安排进程抢占CPU,并决定哪个进程该使用CPU、哪个进程该等待。

操作系统内核里的进程调度主要用来调度两类资源:

进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。

每个CPU都维护着一个可运行队列,用来存放那些可运行的线程。

线程要么在睡眠状态(blocked正在等待IO)要么在可运行状态,如果CPU当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。

VPSee在这里要讨论的是性能监测,上面谈了一堆都没提到性能,那么这些概念和性能监测有什么关系呢?

关系重大。

如果你是老板,你如何检查打工仔的效率(性能)呢?

我们一般会通过以下这些信息来判断打工仔是否偷懒:

打工仔接受和完成多少任务并向老板汇报了(中断);

打工仔和老板沟通、协商每项工作的工作进度(上下文切换);

打工仔的工作列表是不是都有排满(可运行队列);

打工仔工作效率如何,是不是在偷懒(CPU利用率)。

现在把打工仔换成CPU,我们可以通过查看这些重要参数:

中断、上下文切换、可运行队列、CPU利用率来监测CPU的性能。

底线

上一篇Linux性能监测:

介绍提到了性能监测前需要知道底线,那么监测CPU性能的底线是什么呢?

通常我们期望我们的系统能到达以下目标:

CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:

65%-70%UserTime,30%-35%SystemTime,0%-5%IdleTime;

上下文切换,上下文切换应该和CPU利用率联系起来看,如果能保持上面的CPU利用率平衡,大量的上下文切换是可以接受的;

可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:

双处理器系统的可运行队列里不应该超过6个线程。

$sudovmstat1

procs-----------memory-------------swap-------io------system-------cpu-----

rbswpdfreebuffcachesisobiboincsussyidwast

000195971620706814911040003040010000

00019596082070681491104000083670010000

00019596082070681491104000036520010000

00019596082070681491104000038590010000

00019596082070681491104000034540010000

000195960820706814911040007652730010000

参数介绍:

r,可运行队列的线程数,这些线程都是可运行状态,只不过CPU暂时不可用;

b,被blocked的进程数,正在等待IO请求;

in,被处理过的中断数

cs,系统上正在做上下文切换的数目

us,用户占用CPU的百分比

sys,内核和中断占用CPU的百分比

wa,所有可运行的线程被blocked以后都在等待IO,这时候CPU空闲的百分比

id,CPU完全空闲的百分比

$vmstat1

procs-----------memory-------------swap-------io------system-------cpu------

rbswpdfreebuffcachesisobiboincsussyidwast

4014029154763412883951700000010575231981000

4014029157243412963951700000010485461981000

4014029158483412963951700000010445141882000

40140291584834129639517000002410445642080000

4014029158483412963951700000010605461882000

从上面的数据可以看出几点:

interrupts(in)非常高,contextswitch(cs)比较低,说明这个CPU一直在不停的请求资源;

usertime(us)一直保持在80%以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着CPU;

runqueue(r)刚好在4个。

$vmstat1

procs-----------memory-------------swap-------io------system-------cpu------

rbswpdfreebuffcachesisobiboincsussyidwast

14014029043163419123952308000460110695933664100

170140290349234191239517800000103796143565100

200140290201634191239520000000104697393564100

1701402903904341912395188800076104498793763000

160140290458034191239521080000105598083465100

从上面的数据可以看出几点:

contextswitch(cs)比interrupts(in)要高得多,说明内核不得不来回切换进程;

进一步观察发现systemtime(sy)很高而usertime(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(systemcall);

runqueue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

mpstat

mpstat和vmstat类似,不同的是mpstat可以输出多个处理器的数据,下面的输出显示CPU1和CPU2基本上没有派上用场,系统有足够的能力处理更多的任务。

ps

如何查看某个程序、进程占用了多少CPU资源呢

$while:

;dops-eopid,ni,pri,psr,comm|grep'php-fpm';sleep1;done

16500193php-fpm

326880190php-fpm

326890193php-fpm

326900190php-fpm

326910190php-fpm

326920192php-fpm

326930190php-fpm

326940192php-fpm

326950192php-fpm

326960191php-fpm

htop是top工具的增强版,提供了一个更美观的界面给管理员查看,支持交互命令且支持鼠标选定,由红帽公司收录在Fedora社区提供的高质量软件源EPEL内,因此使用前需要yum安装。

安装完成后,在命令行键入htop显示如下内容:

yuminstallhtop–y

F1获取帮助信息

F5+P按照CPU使用率排序

F5+M按照内存使用率排序

F5+T按照进程使用时间进行排序

t树状结构显示进程信息

u按照用户进程显示,选择用户之后,回车即可

跟踪进程发起的系统调用

选中进程,然后按1进入进程的界面,按F5来刷新

绑定CPU到进程

选中进程然后按a,进行CPU绑定设置

glances是一个由Python语言开发的一款更为强大的系统资源监控工具,能够监视CPU、负载、内存、磁盘I/O、网络流量、文件系统、系统温度等信息。

支持交互式命令,且具有C/S特性。

使用前需要yum安装。

在命令行键入glances显示如下:

#yuminstallglances–y

常用选项

-b:

以Byte为单位显示网卡数据速率;

-d:

关闭磁盘I/O模块

-f/path/to/somewhere:

设置输出文件的位置;注:

可能需yum安装python-jinja2模块

-o{HTML|CSV}设置文件的输出格式,可以使用html查看,通常与-f一起使用将html文件传输至/var/www/html/下,就可以使用网页查看了

-m:

禁用mount模块

-n:

禁用网络模块

-t#:

指定刷新时间间隔

-1:

每个CPU的数据单独显示

aSortprocessesautomaticallylShow/hidelogs

cSortprocessesbyCPU%bBytesorbitsfornetworkI/O

mSortprocessesbyMEM%wDeletewarninglogs

pSortprocessesbynamexDeletewarningandcriticallogs

iSortprocessesbyI/Orate1GlobalCPUorper-CPUstats

dShow/hidediskI/OstatshShow/hidethishelpscreen

fShow/hidefilesystemstatstViewnetworkI/Oascombination

nShow/hidenetworkstatsuViewcumulativenetworkI/O

sShow/hidesensorsstatsqQuit(EscandCtrl-Calsowork)

yShow/hidehddtempstats

glaces还支持C/S模式。

在生产环境中,可以使用glances-s-B服务器IP,在linux服务器上以服务模式启动,然后就可以在客户机上使用glances-c服务器IP,监控远程服务器的系统资源使用情况。

例如:

服务器的IP为:

172.16.24.1。

在服务器上执行:

glances-s-B172.16.24.1

在客户机上执行:

glances-c172.16.24.1可查看服务器的资源使用状态。

(实际生产环境中,我们通常在服务器上将glances-s-BIP工作于后台作业中:

nohubglances-s-B172.16.24.1&)

dstat是一款比glances还要强大的系统监控工具,在生产环境中应用的更为广泛。

它也需事先安装,安装完成后,在命令行键入dstat

其中:

total-cpu-usage表示cpu的使用率统计;-dsk/total表示磁盘读写速率;net/total表示网络传输速率;paging表示内存页换进换出情况;system表示中断以及上下文切换(进程切换)

常用选项:

##:

第一个#表示刷新时间间隔,第二个表示要显示的批次

-c:

仅统计cpu的使用状况

-d:

仅显示磁盘相关的使用情况

-g:

仅显示内存页面换进换出的状况

-n:

仅显示网络传输的状况

-io:

仅显示IO设备的读写速率状况

-top-cpu:

显示最占cpu的进程

--top-io:

最占用io设备的进程

--top-mem:

最占用内存的进程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2