这些安全技巧你了解吗?
这样的配置有以下特点:
当然,为了避免重启后丢失优化结果,我们在/etc/sysctl.conf中写入: 页缓存 页缓存在FS与通用块层之间,其实也可以归到通用块层中。为了提高IO性能,减少真实的从磁盘读写的次数,Linux内核设计了一层内存缓存,把磁盘数据缓存到内存中。由于内存以4K大小的 页 为单位管理,磁盘数据也以页为单位缓存,因此也称为页缓存。在每个缓存页中,都包含了部分磁盘信息的副本。 如果因为之前读写过或者被预读加载进来,要读取数据刚好在缓存中命中,就可以直接从缓存中读取,不需要深入到磁盘。不管是同步写还是异步写,都会把数据copy到缓存,差别在于异步写只是copy且把页标识脏后直接返回,而同步写还会调用类似fsync()的操作等待回写,详细可以看内核函数generic_file_write_iter()。异步写产生的脏数据会在“合适”的时候被内核工作队列writeback进程回刷。 那么,什么时候是合适的时候呢?最多能缓存多少数据呢?对此次优化的服务器而言,毫无疑问延迟回刷可以在频繁的删改文件中减少写磁盘次数,缓存更多的数据可以更容易合并随机IO请求,有助于提升性能。 在/proc/sys/vm中有以下文件与回刷脏数据密切相关: 配置文件功能默认值dirty_background_ratio触发回刷的脏数据占可用内存的百分比0dirty_background_bytes触发回刷的脏数据量10dirty_bytes触发同步写的脏数据量0dirty_ratio触发同步写的脏数据占可用内存的百分比20dirty_expire_centisecs脏数据超时回刷时间(单位:1/100s)3000dirty_writeback_centisecs回刷进程定时唤醒时间(单位:1/100s)500 对上述的配置文件,有几点要补充的:
dirty_background_XXX与dirty_XXX的差别在于前者只是唤醒回刷进程,此时应用依然可以异步写数据到Cache,当脏数据比例继续增加,触发dirty_XXX的条件,不再支持应用异步写。 更完整的功能介绍,可以看内核文档Documentation/sysctl/vm.txt,也可看我写的一篇总结博客《Linux 脏数据回刷参数与调优》
对当前的案例而言,我的配置如下: ext4挂载参数:inode_readahead_blks
ext4从inode表中预读的indoe block最大数量。访问文件必须经过inode获取文件信息、数据块地址。如果需要访问的inode都在内存中命中,就不需要从磁盘中读取,毫无疑问能提高读性能。其默认值是32,表示最大预读 32 × block_size 即 64K 的inode数据,在内存充足的情况下,我们毫无疑问可以进一步扩大,让其预读更多。 ext4挂载参数:delalloc
delalloc是 delayed allocation 的缩写,如果使能,则ext4会延缓申请数据块直至超时。为什么要延缓申请呢?在inode中采用多级索引的方式记录了文件数据所在的数据块编号,如果出现大文件,则会采用 extent 区段的形式,分配一片连续的块,inode中只需要记录开始块号与长度即可,不需要索引记录所有的块。这除了减轻inode的压力之外,连续的块可以把随机写改为顺序写,加快写性能。连续的块也符合 局部性原理,在预读时可以加大命中概率,进而加快读性能。 (编辑:济源站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |