32-答疑篇:Linux文件系统性能优化答疑





问题1:阻塞、非阻塞I/O与同步、异步I/O的区别和联

阻塞和非阻塞I/O
根据应用程序是否阻塞自身运行,可以把I/O分为阻塞I/O和非阻塞 I/O

  1. 阻塞I/O,是指应用程序在执行I/O操作后,如果没有获得响应,就会阻塞当前线程,不能执行其他任务
  2. 非阻塞I/O,是指应用程序在执行I/O操作后,不会阻塞当前的线程,可以继续执行其他的任务

同步I/O和异步I/O
根据I/O响应的通知方式的不同,可以把文件I/O分为同步I/O和异步I/O

  1. 同步I/O,是指收到I/O请求后,系统不会立刻响应应用程序
    等到处理完成,系统才会通过系统调用的方式,告诉应用程序I/O结果
  2. 异步I/O,是指收到I/O请求后,系统会先告诉应用程序I/O请求已经收到,随后再去异步处理
    等处理完成后,系统再通过事件通知的方式,告诉应用程序结果

阻塞/非阻塞和同步/异步,其实就是两个不同角度的I/O划分方式
它们描述的对象也不同,阻塞/非阻塞针对的是I/O调用者(即应用程序)
而同步/异步针对的是I/O执行者(即系统)


例子1:比如在Linux I/O调用中

系统调用read是同步读,所以,在没有得到磁盘数据前,read不会响应应用程序
而aio_read是异步读,系统收到AIO读请求后不等处理就返回了
而具体的read结果,再通过回调异步通知应用程序

例子2:在网络套接字的接口中

使用send()直接向套接字发送数据时,如果套接字没有设置O_NONBLOCK标识
那么send()操作就会一直阻塞,当前线程也没法去做其他事情
当然如果用了epoll,系统会告诉你这个套接字的状态,那就可以用非阻塞的方式使用
当这个套接字不可写的时候,可以去做其他事情,比如读写其他套接字



find命令全局搜索文件,会不会导致系统缓存升高

通过学习Linux文件系统的原理知道,文件名以及文件之间的目录关系,都放在目录项缓存中
而这是一个基于内存 的数据结构,会根据需要动态构建
所以,查找文件时,Linux就会动态构建不在缓存中的目录项结构,导致dentry缓存升高

[root@local_sa_192-168-1-6 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  34568 1323176   2140 2278276    0    0     0     0  139  160  0  0 100  0  0
 1  0  34568 1295240   2140 2305888    0    0   208     0  596  546  6  7 85  2  0
 0  0  34568 1293264   2140 2307192    0    0  2080     0 1069 1079  2  3 95  1  0
 0  0  34568 1289752   2140 2307816    0    0  2732     0 1120 1345  0  3 96  1  0
 0  0  34568 1281816   2140 2310688    0    0  4348   946 1214 1582  2  5 70 23  0
 0  0  34568 1280064   2140 2311104    0    0  1336    11 1252 1043  1  2 98  0  0
 1  0  34568 1277808   2140 2311708    0    0  1652     0 1349 1030  1  2 97  0  1


posted @ 2021-12-23 17:39  李成果  阅读(58)  评论(0编辑  收藏  举报