day06 io

普通io和buffu io谁快
buffu快,为什么 因为少io
用户态和内核态切换的次数不一样,
普通io(每次io线程调用多)每次都申请操作系统,buffo:因为 jvm开了一个8kb的数组,超过写到 8kb才申请操作系统调用
day06 io

应用层cpu和物理内存之间有一个页缓存,为了io
pcstat :pageCache(页缓存状态)4k
牵扯到io的话:页缓存更快,但存在断电数据丢失,和数据一致性问题
vim /etc/sysconfig.conf 前台和后台预估值 到90 把内存脏页写到磁盘(redis持久化和mysql biglog因为内核容易丢数据)
day06 io
脏页要写磁盘,不脏页LRU
如果redis开启持久话缓存级别,可想而知要丢多少数据,它只要开启一个新的进程,原来的进程会被淘汰掉

day06 io
nio:也是用buffer+cannl

day06 io
淘汰(写入数据到pageecache把原有数据挤掉):内存达到90%预值把标记为dirty的数据刷到磁盘并去除dirty标记,去除后根据RLU,LFU算法把这些非ditry数据移出内存

只有文件才能mmap,其他流式操作是没有的
nio堆外的mmap
day06 io
nio:
用法就是 new RandomAccessFile()
再建立管道 getChannel();方法
原理:基于mmap堆外内存映射,没有系统调用,没有用户态和内核态的切换(文件直接映射到内存,但数据还是会流入pagecache少了java进程参与)

普通buffo和NIO对比图:
day06 io
比batyeBuffu性能稍高
NIO缺点:和其他IO一样也会产生淘汰和丢数据,因为它始终是基于pagecache页缓存。。
day06 io
kafka 的log日志用的是mmap映射
netty:byteBuff中的on heap off heap
只要经过os没有数据可靠性,就会丢数据
为什么使用pagecache:减少硬件io调用,提速
day06 io

主备,主从复制 kafka和es都有副本的概念