LINUX IO 总结

来源:互联网 发布:radio标签js取值 编辑:程序博客网 时间:2024/06/06 04:03

LINUX IO 总结

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

一.linux IO 中断

1.缺页中断

  内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。
  Linux “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间.
  Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

  上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,缓存区越大预存的页面就越多,程序运行效率越快。
查看进程产生的缺页中断次数:cat /proc/$pid/stat

zhengfeilong@zfl-HP:~$ cat /proc/2016/stat
2016 (fcitx) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 1656 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 0 0 0 17 2 0 0 0 0 0 0 0 0 0 0 0 0 0

其中第10-13位分别对应:

min_flt=0 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=0 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目

2.File Buffer Cache

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

$cat /proc/meminfo:
MemTotal: 8119348 kB
MemFree: 1333676 kB
MemAvailable: 6009304 kB
Buffers: 2059668 kB
Cached: 1653252 kB

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

3.页面类型

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

1.Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
2.Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存.
3.Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。

4.SWAP

当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。( SWAP 交换分区是把物理磁盘当成内存的载体,也就是说:虽然使用 SWAP 可以让我们运行更多或更大的应用程序了,但物理磁盘的数据交换速度远比不上物理内存,因此也就可能造成运行性能的下降)。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,比如:top、cat /proc/meminfo、vmstat 等:

$cat /proc/meminfo:
……
SwapTotal: 4096564 kB
SwapFree: 4096424 kB
……

二.Linux测试IO性能

1.测试IO读速度

  hdparm:用于显示与设定硬盘的参数
执行命令:hdparm -t —direct /dev/sda1
输出结果:

/dev/sda1:
Timing O_DIRECT disk reads: 550 MB in 3.00 seconds = 183.31 MB/sec

注释:

-t :Perform device read timings
—direct :Use O_DIRECT to bypass page cache for timings
O_DIRECT :不使用缓存直接写入.

2.测试IO写速度

  dd:用于指定大小/home/zhengfeilong/Desktop/linux_io.html的块拷贝一个文件,并在拷贝的同时进行指定的转换。
执行命令:sync;/usr/bin/time -p bash -c “(dd if=/dev/zero of=test.dd bs=1000K count=20000;sync)”
输出结果:

20000+0 records in
20000+0 records out
20480000000 bytes (20 GB) copied, 143.009 s, 143 MB/s

注释:

1.sync 命令用来刷新文件系统的缓冲区,执行sync命令实际的作用是把内存中的数据缓冲写入到磁盘中。
先执行下sync命令,是为了减少对后面测试的影响。也可以使用 echo 3 > /proc/sys/vm/drop_caches 来清除缓存。
2.time 命令用来测试命令的执行时间,shell内建还有一个time命令,我们这里使用全路径来指定使用的是非内建命令。
-p 选项设置时间的输出格式为POSIX缺省时间格式,单位是秒,在后面的测试小节可以看到time -p 的输出形式。
3.bash 命令 -c 选项的作用是将后面的字符串参数当作bash脚本来执行.
4.小括号的意思是另起一个子进程来执行括号中的脚本.
5./dev/zero该设备无穷尽地提供0,可/home/zhengfeilong/Desktop/linux_io.html以用于向设备或文件写入字符串0。

三.Linux IO监控工具inotify-tools介绍

  inotify-tools是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列命令行工具,用来监控文件系统的事件。inotify-tools是用c语言编写的,除了需要内核支持inotify之外,不依赖其他。initify-tools提供了两种工具,一是inotifywait,用来监控文件或目录的变化。二是inotifywatch,用来统计文件系统访问的次数。

1.inotifywait

  语法:inotifywait -mrq —timefmt ‘%d/%m/%y/%H:%M’ —format ‘%T %w %f’ -e modify,delete,create,attrib $path
输出结果:

2014-11-27 17:34 text.txt CREATE
2014-11-27 17:34 text.txt CLOSE_WRITE,CLOSE
2014-11-27 17:34 ttt.t MOVED_TO
2014-11-27 17:35 bb DELETE

参数说明:

-m是要持续监视变化。
-r使用递归形式监视目录。
-q减少冗余信息,只打印出需要的信息。
-e指定要监视的事件列表。
—timefmt是指定时间的输出格式。
—format指定文件变化的详细信息。

Events: 事件

access file or directory contents were read 文件或目录被(访问)读取r
modify file or directory contents were written 文件或目录被写入w
attrib file or directory attributes changed 文件或目录属性变更【理由:chmod更改属性】
close_write file or directory closed, after being opened in writeable mode 文件或目录被写关闭【理由:文件内容被更改】
close_nowrite file or directory closed, after being opened in read-only mode 文件或目录以只读方式打开后关闭
close file or directory closed, regardless of read/write mode 文件或目录被用编辑器(不管是读或写)关闭
open file or directory opened 文件或目录被用编辑器打开
moved_to file or directory moved to watched directory 文件或目录被移动进来【理由:mv目录内重命名】
moved_from file or directory moved from watched directory 文件或目录被移动出去
move file or directory moved to or from watched directory 文件或目录不管是移出或移进
create file or directory created within watched directory 文件或目录被创建【理由:mkdir创建目录】
delete file or directory deleted within watched directory 文件或目录被删除【理由:rm删除】
delete_self file or directory was deleted 文件或目录自删除
unmount file system containing file or directory unmounted 文件系统取消挂载

2.inotifywatch

  语法:inotifywatch [-hvr] [-e] [-t] [-a] [-d] file1 [file2] [file3] […]
参数说明:

-h:输出帮助信息
-v:输出详细信息
-r:监视一个目录下的所有子目录
-t:设置超时时间
-e:只监听指定的事件
-a:以指定事件升序排列。
-d:以指定事件降序排列

示例:
创建一个目录,并监听该目录:

zhengfeilong@zfl-HP:~$ mkdir tmpdir
zhengfeilong@zfl-HP:~$ inotifywatch -v -e access -e modify -t 60 -r tmpdir/
Establishing watches…
Setting up watch(es) on tmpdir/
OK, tmpdir/ is now being watched.
Total of 1 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.

在另一终端,执行一下操作:

zhengfeilong@zfl-HP:~$ date > tmpdir/foo.txt
zhengfeilong@zfl-HP:~$ cat tmpdir/foo.txt

输出结果:

total   access   modify  filename
5     3     2     tmpdir/

原创粉丝点击