I/O检测介绍
I/O性能监测可总结如下:
* 任何时间出现CPU等待IO,说明磁盘超载。
* 计算出你的磁盘可维持的IOPS值。
* 判定你的应用是属于随机磁盘访问型还是有序型。
* 通过对比等待时间和服务时间即可判断磁盘是否缓慢。
* 监测交换空间和文件系统坐在分区并确保他们之间不存在争抢IO。
磁盘IO子系统是linux系统里最慢的部分,这是由于其与CPU相比相去甚远,且依赖于物理式工作(转动和检索)。如果将读取磁盘和读取内存所花费的时间转换为分秒,那么他们之间的差距是7天和7分钟,所以linux内核尽量少的进行磁盘操作是至关重要的。以下部分将描述下内核处理数据从磁盘到内存和从内存到磁盘的不同方式。
数据读写——内存页面
linux内核将磁盘IO分为页面进行操作,大多数linux系统中默认页面大小为4K,即以4K为单位进行磁盘和内存间的读写操作。我们可以使用time命令来查找页面大小:
# /usr/bin/time -v date
......
Page size (bytes): 4096
......
主要页错误(Major Page Faults)和次要页错误(Minor Page Faults)
linux和大多数UNIX系统一样,使用虚拟内存层来映射物理地址空间,这种映射在某种意义上是说当一个进程开始运行,内核仅仅映射其需要的那部分,内核首先会搜索CPU缓存和物理内存,如果没有找到内核则开始一次MPF,一次MPF即是一次对磁盘子系统的请求,它将数据页从磁盘和缓存读入RAM。
一旦内存页被映射到高速缓冲区,内核便会试图使用这些页,被称作MnPF,MnPF通过重复使用内存页而缩短了内核时间。
在下面示例中,time命令显示了当一个程序启动的时候产生了多少MPF和MnPF,在第一次启动的时候产生了很多MPF:
# /usr/bin/time -v evolution
......
Major (requiring I/O) page faults: 163
Minor (reclaiming a frame) page faults: 5918
......
第二次启动的时候MPF消失因为程序已经在内存中:
# /usr/bin/time -v evolution
......
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 5581
......
文件缓冲区
文件缓冲区可使内核减少对MPFs和MnPFs的使用,随着系统不断地IO操作,缓冲区会随之增大,直至内存空闲空间不足并开始回收,最终结果是系统管理员们开始关心这个事实,但这只是系统正在很好的使用缓冲空间而已。
下面的输入来自/proc/meminfo文件:
# cat /proc/meminfo
MemTotal: 2075672 kB
MemFree: 52528 kB
Buffers: 24596 kB
Cached: 1766844 kB
......
以上显示系统拥有2G内存,当前有52MB空闲空间,24MB的buffer供应磁盘写操作,1.7GB的cache由磁盘读入内存。
内核通过MnPF机制来使用这些东东,光这些数据还不足以说明系统出现瓶颈。
内存页面分类
在linux内核中有3种内核页:
* 读取页面——从磁盘读入(MPF)的只读页面,这些页面存在于缓冲区中包括不可改变的静态文件,二进制文件和库文件。内核会因需求而不断地将他们读入内存,如果内存变得不够用,内核会将他们“窃取”至空闲列表,这将导致某个应用通过MPF将它们重新加载至内存。
* 脏页面——在内存中被内核修改的页面,它们将被pdflush守护进程回写至磁盘,当内存不够用时,kswapd进程也会和pdflush一道进行回写以释放更多内存空间。
* 无名页面——它们属于某个进程,但是没有任何文件或后端存储与之关联,它们不能被回写进磁盘,当内存不够用时kswapd守护进程会将它们写入交换空间直至RAM释放出来。
数据页面磁盘回写
应用可能直接调用fsync()或sync()系统调用将脏页面回写入磁盘,这些系统调用会直接请求至I/O调度器。如果一个应用不调用它们,则pdflush守护进程会时不时地进行页面回写操作。
监测磁盘I/O
在一定条件下系统会出现I/O瓶颈,可由很多监测工具监测到,如top,vmstat,iostat,sar等。这些工具输入的信息大致一样,也有不同之处,下面将讨论出现I/O瓶颈的情况。
计算每秒IO量
每一次向磁盘的IO请求都会花费一定时间,这主要是因为磁盘必须旋转,磁头必须检索。磁盘的旋转通常被称为“旋转延迟(rotational delay)”(RD),磁头的移动杯称为“磁盘检索(disk seek)”(DS)。因此每次IO请求的时间由DS和RD计算得来,磁盘的RD由驱动气的转速所固定,一RD被为磁盘一转的一半,计算一块10000转磁盘的RD如下:
1. 算出每转的秒数:60秒/10000转 = 0.006秒/转
2. 转换为毫秒: 0.006*1000毫秒 = 6毫秒
3. 算出RD值: 6/2 = 3毫秒
4. 加上平均检索时间:3+3 = 6毫秒
5. 加上内部转移等待时间: 6+2 = 8毫秒
6. 算出一秒的IO数:1000毫秒/8毫秒 = 125次/秒(IOPS)
在一块万转硬盘上应用每请求一次IO需要8毫秒,每秒可提供120到150次操作。
随机IO和有序IO
每次IO的数据量与系统的工作负荷相关。系统的负荷分两类:有序和随机。
有序IO
iostat命令可提供IOPS值和每次IO的数据量,有序负荷需要一次有序地读取大量数据,因此每次IO的数据量很大,其性能取决于短时间大数据量的执行能力。
计算IOPS能力的方式是用每秒读写数据量除以每秒读写次数:
53040/105 = 505 KB/IO
71152/102 = 697 KB/IO
随机IO
随机负荷与数据大小关系不大,与磁盘的IOPS值有关,web服务,mail服务一般属于此类,IO请求相对较少,其依赖于一次可执行多少次请求,因此磁盘的IOPS值非常关键。
此数据与刚才的数据相比每次IO写入的数据量差异很大:
2640/102 = 23 KB/IO
3176/130 = 24 KB/IO
当虚拟内存终结I/O时
假如系统没有足够的内存供给所有的请求时,并开始使用交换空间,和文件系统IO一样swap的写入也很慢,假如内存严重的不足,那么这可能导致大量的页面涌向swap,假如这个swap空间与要写入的文件处于同一文件系统下,此系统将进入IO争抢,这将导致系统性能直线下降。假如页面无法读或写入磁盘,那么它们将一直停留于内存中,内核会开始尝试释放内存空间,问题是IO通道已经严重阻塞且无法做任何事情,这必将导致系统内核出错并崩溃。
下面的vmstat输出展示了这种情况:
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
17 0 1250 3248 45820 1488472 30 132 992 0 2437 7657 23 50 0 23
11 0 1376 3256 45820 1488888 57 245 416 0 2391 7173 10 90 0 0
12 0 1582 1688 45828 1490228 63 131 1348 76 2432 7315 10 90 0 10
12 2 3981 1848 45468 1489824 185 56 2300 68 2478 9149 15 12 0 73
14 2 10385 2400 44484 1489732 0 87 1112 20 2515 11620 0 12 0 88
14 2 12671 2280 43644 1488816 76 51 1812 204 2546 11407 20 45 0 35
以上数据显示大量的读入内存请求(bi),内存不够,导致数据块不停写入(so)交换空间,交换空间大小不断增长(swpd),同样也出现了大量的IO等待时间(wa),这表明CPU因为IO请求的原因而开始变慢。
在上面的例子中,swap设备(/dev/sda1)和文件系统(/dev/sda3)在争抢IO。
判定应用IO使用
iotop命令显示每个进程的IO使用情况,其输出结果与top命令相似,可与iostat命令结合来判断产生IO瓶颈的应用。
在下面的示例中,在同一磁盘上(sda2)既有读操作(r/s)又有写操作(w/s):
# iostat –x 1
avg-cpu: %user %nice %system %iowait %steal %idle
7.14 0.00 35.71 57.14 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 123.47 25.51 987.76 21951.02 153.97 27.76 224.29 6.85 102.04
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 123.47 25.51 987.76 21951.02 153.97 27.76 224.29 6.85 102.04
#iotop -d 5 -P
Total DISK READ: 981.23 K/s | Total DISK WRITE: 21.43 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
2574 be/4 root 967.01 K/s 0.00 B/s 0.00 % 39.05 % find /
64 be/3 root 0.00 B/s 19.94 M/s 0.00 % 13.09 % smbd -D
2533 be/4 dhoch 3.63 K/s 8.72 K/s 0.00 % 1.82 % [kjournald]
2442 be/4 root 0.00 B/s 2.91 K/s 0.00 % 0.46 % iostat -x 1
2217 be/4 dhoch 0.00 B/s 1488.57 B/s 0.00 % 0.00 % mono /usr~-ior-fd=25
1985 be/4 dhoch 0.00 B/s 255.12 K/s 0.00 % 0.00 % smbd -D
iotop的DISK READ 和DISK WRITE 与iostat的rsec/s 和wsec/s 相对应。
浙公网安备 33010602011771号