预读:
预读有2中方式:
1read ahead
由于硬盘数据经常是以一族连续的硬盘扇区组织起来的,所以有时侯如把系统所请求的扇区随后的一个扇区里的数据同时读进来是有价值的
2pre-fetch
当RAID卡发现系统要读的是先前已经读过的数据时,在这一次,便将这一个数据块的数据写到CACHE里
因为cpu,内存操作速度要比磁盘的速度快,所以系统在设计的时候,用了回写缓存。
回写缓存怎么理解呢?就是应用提交了写的请求,数据被放在了缓存中,应用就认为是持久化完毕了,去干别的事情了,而实际上系统可能不定期的时间范围内,把缓存中的数据刷到磁盘上,这就是回写缓存。
这种情况下是有问题的,对于关系型数据库(oracle,pg,mysql),都是采用的wal的方式,就是写数据前先确保redo 的信息写到log中,如果存在回写缓存,那么redo的信息在缓存中,还没有刷新到磁盘上,这个时候系统出现故障,数据丢了,会造成数据丢失,数据库无法自己找回数据。
回写缓存存在的位置
1操作系统会有回写缓存,通常都是很大的,有GB的规模,据库写数据的方式用的fsync,直接刷内存数据到磁盘,不缓存,为了支持数据写到非缓存而是磁盘中,以及写入有顺序要求,linux内核实现的方法叫写屏障,在ext3文件系统中,fsync操作无法正确转换成写屏障的形式,并且ext3下使用linux软raid或者逻辑卷管理器时候,屏障将完全不可用,所以数据库的系统推荐使用ext4的文件系统。
2磁盘控制器,raid卡上会有回写缓存,在128MB到512MB。操作系统把数据交给磁盘控制器,磁盘控制器稍后把数据刷到磁盘上。一些raid卡会在没电的情况下,禁用回写,使用直写,性能上会下降。
3磁盘驱动器sata,sas磁盘上都有8MB到32MB的写缓存。
from 《postgresql9.1性能调教》

1对新来的机器磁盘raid做了下测试,发现磁盘的顺序写竟然要比顺序读还要快,这个明显不太符合普通的认知。
检查发现磁盘设置预读使用的是默认大小
blockdev –getra /dev/sdb
256
该默认值过小,调大该值后,读取速度有非常大的性能提升。
2文件系统设置的时候,可以把记录访问时间去掉,据说有20%的性能提升。没有实际的去测试过。
3调整系统swappiness参数=0,使系统能尽可能的用内存,而不是用交换区
4关于overcommit,这个参数目前没有设置,具体参看下面链接:
http://blog.chinaunix.net/uid-30401178-id-5159439.html
http://www.firefoxbug.com/index.php/archives/2800/