1. 可能要用到的指令
1. sysctl -a查看系统的一些配置,查看脏页的相关配置
[root@node01 ~]# sysctl -a | grep dirty
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
2. 修改相关配置项
[root@node01 ~]# vi /etc/sysctl.conf
可以在文件末尾添加以下配置
- pagecache占用 可用内存 的阈值(后台) ,达到该值后(这里是占用可用内存的10%),触发内核写磁盘或者LRU,不会阻塞程序
vm.dirty_background_ratio = 10
- pagecache占用 可用内存 的阈值(前台),程序向内核写数据,当pagecache达到了可用内存的该阈值,会阻塞程序的写数据,触发内核写磁盘或者LRU
vm.dirty_ratio = 20
- 设置多久(百分之一秒)写回磁盘
vm.dirty_writeback_centisecs = 500
- 设置多久丢弃脏页
vm.dirty_expire_centisecs = 3000
3. pcstat
一个go语言写的工具,用来查看文件的缓存状态,自己去下载,然后放到/user/bin中使用就行
https://blog.51cto.com/liuzhengwei521/2360734
2. 现象
- 程序写数据到磁盘,首先会写到内核维护的pagecache中,一个pagecache大小是4k,pagecache被写了之后会变成dirty
- pagecache当达到占用可用内存的阈值,才会被写回磁盘
- 被写回磁盘的pagecache就不是dirty的了,将来可能会被LRU丢掉
- 如果异常断电,没有被写回磁盘的pagecache里的数据会丢失
3. 总结
- pagecache本身是用来优化IO性能的,但是异常断电时会丢数据
- pagecache对应于磁盘的某个区域,如果进程读文件发现内存里没有对应pagecache,就会造成缺页,内核就会从磁盘读数据到pagecache,之后进程继续读
- 在redis等缓存的设置里需要注意!(进程缓存,内核缓存,硬件缓存都可能丢数据)
- OS没有绝对的数据可靠性,设计pagecache是为了减少硬件IO调用,优先使用内存,提速。
如果想要数据可靠性,可以调成最慢的模式————一个字符一个字符直接写磁盘,但是这样会造成性能损耗(单点问题),不现实,所以最终出现了主从复制、主备