回写缓存预读及磁盘调整

本文探讨了预读的两种方式——read ahead和pre-fetch,以及回写缓存的工作原理,强调了回写缓存可能导致的数据丢失风险。提到了操作系统、磁盘控制器和磁盘驱动器上的回写缓存,并推荐使用ext4文件系统以确保数据一致性。此外,还分享了调整磁盘预读大小、禁用文件访问时间记录、设置swappiness参数和overcommit等提高系统性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预读:
预读有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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值