CPU 缓存及磁盘调度算法
cache hit:应用程序访问的数据在CPU cache 中命中的比率叫cache 命中率;
cache miss:cache 丢失率;
cache line fill:如果CPU 要调取的数据在缓存中没有,就从内存中读取,这叫cache 的填充;
当数据在CPU 中已经被处理完,将移动到内存中,由内存写入到硬盘,永久保存;
从CPU 移动数据到内存,有两种方式:
透写式:一对一 数据在cpu cache 中修改完,立即写入到内存中,保证可靠性,但性能差;
回写式:数据在cpu cache 中修改完后,并不立即写入到内存中,而是等待该数据被更新时,才写入到内存中,性能好,但牺牲一部分可靠性。
现在的cpu 通常都有三级缓存,如果只有二级缓存,那么一级缓存是每个核私有的,二级缓存是共享的;如果有三级缓存,那么一级、二级缓存是每个核私有的,三级缓存是共享的。
一级缓存又分为数据区和指令区;
不同级别的缓存和内存的读写速度是不一样的,用单位:周期(cycles)来衡量,数字越小,速度越快。
由于一级缓存在核心内部,通常不会很大。
所有一个程序在运行的时候,尽量让数据在缓存中命中,速度是最优的,特别是高并发类型的应用,像数据库。
如果在缓存区cache 丢失,就从内存中回填,一个核的多个线程之间数据是同步的。
两个程序,实现的结果是一样的,执行速度有差异,通过valgrind 工具测试缓存的命中率可以判断哪个程序更优。
读预取功能:当读取一个IO 时,顺序读取该IO 连续的数量
智能预取:当遇到连续IO 时,预取数据,当遇到随机数据,则不预取
固定预取:固定预取一定的数据量
倍数预取:根据IO 大小,比如64K,按照64K 的倍数进行预取
不预取:明确数据随机时
cd /sys/block/vda/queue
cd /sys/block/vda/queue
cat scheduler
被中括号括起来的,就是默认的磁盘IO 调度算法,deadline
如果你要调整算法:
不同的调度算法,它的调优参数是不一样的:
如果你把调度算法调成none,它没有调优参数,连iosched 文件夹都不存在了:
先从默认的开始:
以上参数分别是:一次处理的io 请求数量、读过期时间(单位:毫秒)、写过期时间(单位:毫秒)
yum -y install fio
持续更新中...