linux性能知识点总结
操作系统缓存和缓冲
操作系统缓存和缓冲主要包括:cache(缓存)、buffer(缓冲)、swap等,通过free -m命令可以查看。
- cache
Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
cache主要针对读缓存设计,主要目的:调高CPU和内存之间数据交换速度,具体来说,热点数据,期望可以在内存cache中命中。 - buffer
Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。
通俗讲,buffer主要针对写缓存设计,主要目的:调高内存和硬盘之间数据交换速度,具体来说,IO操作,数据写入buffer即可返回,降低IO操作时延,同时,buffer数据聚合为一定大小后,再执行一次下盘,减少磁盘IO次数和网络开销(云盘)。 - swap
类似于win下的虚拟内存,当物理内存空间不够时,会拿出部分磁盘空间,作为SWAP分区(虚拟成内存),来解决内存容量不足情况。
当程序向OS请求内存资源时,OS发现内存不足,则会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当程序又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。
刷盘操作字
前台下发write操作字,如果buffer还未写满,那么内核就不会把它放入输出队列。
当buffer写满或者内核想重用buffer时,才会将其排入输出队列,等它到达队列的首部,才会进行刷盘,如下图所示:
正式由于上述延迟写机制,在操作系统crash或者reboot时,buffer中未下盘的数据可能会丢失,因此,linux提供了以下系统调用,保证buffer中的数据及时刷盘:
- sync
将所有修改过的缓冲区排入写队列,然后就返回了,它并不等实际的写磁盘的操作结束。所以它的返回并不能保证数据的安全性。通常会有一个update系统守护进程每隔30s调用一次sync。 - fsync
与sync的区别,fysnc只对一个文件生效,因此,需要一个入参:文件fd,fsync会确保一直到写磁盘操作结束才会返回。所以,fsync适合数据库这类应用。 - fdatasync
与fsync的区别,只刷盘文件的数据部分,不刷盘元数据。