Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2767561
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: LINUX

2009-05-19 09:44:27

                                    linux 的磁盘"读"
    我们首先来谈一下什么是IO子系统,IO子系统是指在计算机系统中负责把数据在内存与磁盘之间作来回传输的子系统,一般我们认为IO子系统的成员包括磁盘,内存和一组关于IO的系统的调用。如果一个进程需要请求磁盘上一个数据块,操作系统并不会立即执行这个请求而是等待相关的请求有一定数量时才开始执行,写请求也是如此。所以我们把这种方法叫作批量操作。
    一般认为读请求比写请求对性能的的影响更直接一些,这是因为当一个进程需要一个磁盘里的数据块的时候,该进程必须等待这个数据块开始加载到内存中才能够开始继续下一步运行。而写请求没有这么明显,如果一个进程需要执行写操作时,只要调用pdflush线程就可以了。在linux系统只有pdflush线程负责真正的对磁盘写操作,而其他的进程都是通过调用这个线程来实现的"伪写"。在其他的进程认为写操作已经完成了,但是实际上数据块还没有真正的写到磁盘上了,其实是通过pdflush线程被缓存在磁盘上,以等待pdflush在适当地时候把数据块写回磁盘上。所以在linux上我们通过vmstat 来查看系统内存使用情况时,我们会发现有一部分内存会被系统当作buffer用掉。
     有一些应用程序通过不使用这种buffer机制,而是直接对磁盘进行写操作来提高性能。对于ORACLE数据库管理员来说使用raw device来创建数据库,应该不会陌生了。但是在文件管理方面就不尽如人意了。不能直接通过CD,COPY,MKDIR等一些命令来进行操作。如ORACLE数据库只能通过自带的RMAN工具来进行备份,而且最多只有255个raw device,每个表空间只能在一个raw device上。因此这种性能提高是以牺牲可管理性为代价的。
    当对磁盘上的一个数据进行读的时候,最有可能对接下来的几个数据进行读,因些把干脆也把接下来的几个数据块读到内存中,这个机制称之为read-ahead技术。但是这种技术在一般的情况下对性能会有提高,特别是对文件都是连续的读操作的时候,带来的影响会更加明显。如在ORACLE的DSS中,需要经常对表进行大的扫描,这种情况下我们需要做一些调整。但是在大部都是随机的读操作的情况下显然这种机制就没什么用了,相反还会给系统带来负面影响,如ORACLE中OLTP系统中,由于数据库不大,且事务繁忙,大部分读操作都是随机的。在linux 2.6 kernel中我们可以通过/sys/block/(磁盘的设备名)/queue/read-ahead-kb这个参数来调整预读操作的尺寸大小,default情况下为128kb,我们可以根据应用系统的特征来作适当的调整,来使自已的系统性能达到最佳状态。
  
阅读(1777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~