Untitled

Untitled

Untitled

FUSE内核维护了五个队列、interuptsforgetspendingprocessingbackground等,一个请求在任何时刻只能属于其中一个队列。forget请求在forgets队列,同步请求(例如metadata)在pending队列,当User Daemon读取/dev/fuse得到时候,请求会从队列传输给User Daemon进程。这些队列之间存在优先级,Interrupts队列优先级最高、其次就是FORGET和NON-FORGET请求,当请求从Pending队列中传输给User Daemon进程,这个请求就会被移动到Processing队列中。这个队列中放的请求是正在被User Daemon进程处理的请求。如果Pending队列为空,那么User Daemon进程读取**/dev/fuse**就会阻塞。当User Daemon进程回复了请求,那么对应的请求就会从Processing队列中移除。Background队列是用来处理异步请求的。 一般情况下只有read请求会放到background队列中,write请求只有在开启writeback cache开启的时候才会放到这个队列中。在这种情况下,write请求会先写到page cache中,最后由内核线程bdflush来flush脏页。这个时候会由FUSE生成一个一异步请求,然后将其放入到background queue中。请求会逐渐从background队列移动到pending队列中。Fuse限制background队列中的最大可以驻留在pending队列的数量。(max_background,默认是12),当少于12个异步请求在pending队列时,background中的请求会被移动到pending队列中,目的就是为了避免突发的background请求导致重要的同步请求被delay。 此外在max_background达到75%这个阀值(congestion_threshold控制),FUSE会通过LInux VFS拥挤,Linux VFS会对用户进程的写入进行节流。