00:00
呃,那么在这儿呢,就要先给大家介绍一个工具,就是这个呃,Stress stress号称是在Linux内核呃追踪命令执行的这一套神器,它可以看到我们这个呃内核里边某一个进程,他在我们的这个操作系统内核上面都干了哪些事。我们先来看一下这个工具啊,这工具呢,呃,在网上的教程也很多,文档也很多,我们在这里简单的使用一下,给大家来看看这个re,它默认情况下,在这个迷你版的Linux里边,它是没装的,我们需要装一下。那我们装完之后呢,S tra有一个这个杠P的,呃,命令可以去监控我们某一个进程,那我们现在先看一下我们这个Linux,呃,不是我们这个NX的这个进程是啥,就PSEF棍J2。Grape。登记不死。
01:00
那我们在监控的时候啊,呃,大家之前我们给大家讲过这个N的这个进程的模型,对吧,我们需要监控的是它的这个worker processes啊不,不要监控这个master,它只是这个,呃,管理我们这些进程用的是吧,那这个worker processes它才是真正干活用的,那现在我们这worker processes现在就一个是吧,那我们现在就监控这一个它的这个,呃,这个这个PID是897。然后在这个SS后边跟个P,然后呢897。大家看呃,在这执行之后呢,就卡住了,然后在这提示我们e wait,这说明我们现在呃,这个N这个进程呢,它在干啥,他在通过E去wait在等,在等待这个事件,然后来唤醒啊里边这些执行是吧,那我们接下来访问一下咱们这个系统。101走去。
02:02
访问了一下系统之后,大家看这里边都干了啥?E weight,接下来呢,啊,Accept表示接受请求了,一个新的事件出来了,对吧,然后1CTL,一接着wait,然后accept accept两次,这是啥意思呢?这是为啥?呃。我们清了,重新观察一下。然后我们刷新一下它为什么会。来两次,这两次就是因为它有两个请求大家看啊,因为我这个这个HTML文件里边,它内连了去请求这么一个CSS,那我们现在呢,把它换成一个请求,这样观察起来呢,会更直观一些。User。Local n HTML。把它这个。对于这个CSS的引用啊,我们先给它给取消掉,那这个我们先不要了。
03:03
然后保存。然后再清掉,我们再重新观察。897,然后来刷新。注意,你自己做这个实验的时候一定要。清空缓存并硬性加载,它返回了sta status code得是200,这样才是完整的一个请求,那304呢,它没有执行这个读文件的操作,它只是检查了文件的语言数据信息,然后就给你返回这个header了,对吧?来看,然后清空缓存并进行加载返回的状态呢,它也是200,然后它你看它里边都干啥了,先是为啊在等这个。接收这个这个用户的请求,然后请求来了,产生了新的事件,Receive from。这里面是一些简要的信息,对吧,来了一个HTP请求,然后来自于哪个这个主机地址,其实这就是这个HTTP这个头信息,对吧?在这个第一行,在这个HTP协议里边呢,就会记录用哪些方,用的是什么方法,然后请求的什么资源,什么协议,还有这个host啊,这个主机的地址都会在这儿记着。
04:06
然后在这个,呃,这个sta里,这sta里啊。它会去加载这个具体这个文件信息,就是开始找我本机的磁盘文件了,然后open呢,开始打开文件对吧,然后FS sta呢,这会儿会返回这个已打开这个文件,这是Linux内核的一些相关参数,然后在这儿呢,呃,有这个。Write v,然后send file,然后再去write啊,这个是带有缓存式的这种去写这个,这个写数据了,对吧,然后写数据写完之后直接一个center file,我们这个文件就出去了,这个是咱们的这个,呃一的正常情况下它就会这么干,然后下面为啥还有一个accept啊,这是因为这个。他请求了两次,还是请求了两次,这里边请求了一个我们这个收藏夹的这个图标啊,这是正常情况下的一个center file的执行过程,它需要去找文件,注意看啊,他需要去open这个文件,S sta这个文件啊,这是比较关键的,他必须得找着文件,然后他才能send file给它给send出去,所以说没有经历这个。
05:08
呃,NG这个内存的,呃,这个用户态啊,但是他也得去找这个文件嘛,对吧,那如果我们要把这些信息给它缓存起来,就是文件,对于文件描述的这些信息,这文件在哪儿,然后这个文件的一些原数据信息全都缓存起来,那么直接给我们的center file,让他直接就可就可以,呃,这个这个向内核去发送这个。发送这个写这个写请求直接就给red出去了,然后最后把这个呃,整个这个写操作给它给close掉,这个是我们通过这个Sri去观察这个center file的这个过程,注意这是有center file,如果没有center file的话,我们可以看一下它这个执行过程是啥样的。那么现在把这个send file给关了。现在默认send file是on对吧,然后我们把它给off掉,然后这个呃,用的这个。
06:03
这个这个1PO啊,它默认是支持开启的是吧,然后三给关了。然后停掉,然后我们重启。重庆NG。然后看一下这个进程。然后我们再去监控一下,它现在是。哦。1129。哎,现在已经开始了,现在没有启用send file的这个场景,注意要清空缓存,硬性加载。走。大家看啊,明显这个过程要比这个之前的这个要长一些了,对吧,一还是wait 1ctl,一接着wait,这还他请求了两次嘛,然后accept,然后CTR receive from这个开始开始接收请求,然后studiOS,呃,这不是这个s sta,然后去找这个这个文件的原数据信息,然后open打开。
07:06
然后在这个right过程当中,呃和right v的过程当中呢,呃,没有这个send file的出现了,也就是没有向这个内核直接去发送这个这个send file send file函数,让内核去直接读文件,而是干嘛呢?有一个read的操作,这p read64,这是一个升级版的read的这个函数啊,这个p read64就表示开始去读文件了,我们能在这儿呢看到文件的具体内容。对吧,我们在之前呢,你看就是在你开了这个send file之后,这里边是没有read操作的,也就是在应用程序这个,呃,内存里边不会去加载这个文件的具体的内容,而是直接去通过send file把这个。先把它停了,它是直接通过你看open,然后然后直接就right了,对吧?啊,然后这个。这啊,这从这儿看吧,这儿比较清楚一点啊,然后这个open,然后呢,呃,这个这个这个开始write对吧,然后这个center file,然后最后向这个目标地址去这个去write,直接向网络接口,像这个IP地址去写数据了,对吧,这里边是有center file的啊,这边是没有center file,这里边多了一层read啊先读到数据,然后再去写send file呢,是直接给你这文件描述符,然后给这个操作系统,你这个你把这个文件给我给发出去啊,目标地址我也告诉你了,对吧,这就是center file,那这个center file的开启和关闭对于我们的性统性能是这个区别是非常大的,那即使是我们开了这个center file之后呢,我们还可以再去进一步的去优化这个send这个性能,就是把它这个打开文件这个操作啊,给它再给优化一下。
08:48
呃,然后我们现在呢,先存一下这个开file的这个,呃,它的执行过程啊,在哪儿呢,我看看啊。这吧。啊,这有file,然后close,这是一个完整的过程。
09:02
我们把它给复制出来。你可粘到这儿。Send file执行过程,然后一会儿呢,我们可以去对比一下这个我们应用了缓存之后的效果。现在我们是没有配置任何的缓存的,对吧?那么接下来呢,给大家需要介绍一下这么一个,呃,配饰的参数,这是在N里的配置,叫open file catch,那个名字就已经很接地气了,就打开文件的缓存,让你别没事老打开这个文件,把这个打开文件这个操作呢,我给它缓存起来。这个open file cash啊,它的配置呢,也比较简单啊,就这么几行啊,比较有用的,我们直接把它给粘到咱们的配置文件里。然后呢,呃,我们就在这儿,在这个location下,直接给它给粘上。
10:06
一会儿我再给大家解释,这里边都是啥意思啊,咱去看看效果。然后重启。嗯,我们这儿报错了,但是不要慌,我们看看这问题出在哪儿。呃。Open catch这个location首先放在这儿不对啊,但是这个并不是真正的这个原因。我们先把它给。轻了这个没用的,这些别让他碍事,看着。这个header也不要了。这儿首先它少一个。这个这个这个分号这也少一个啊。然后我们再重启再看看。OK,就启动成功了,然后呢,这会儿啊,你其实在访问我们这个页面的时候,其实直接看是看不出来效果的,还得用这个SS啊,然后我们再看一下。
11:04
嗯,看看这个进程。就是1223。啊一现在开始等待了,对吧,然后来刷新强制刷新啊,清空清空缓存,硬硬性刷新。然后看这accept了,然后CTR wait CTR这里边怎么它它它就是两次嘛,对吧。然后注意看啊,这有一个open的动作,注意这是第一次啊,我们第一次请求的时候,它有一个open这个文件的动作,然后这个p read,这是因为我们把把这个。那啥都给关了,把这个send这个send file都给关了,把它给打开你。这个配置在send file关闭的情况下,其实是没有什么太大意义的,这主要是给这个center file用的啊。然后我们再还得再重启一下。然后再看看这个进程。
12:02
呃,1246。走,然后我们再刷新。Accept wait accept wait,注意这有open对吧,Open是打开文件,它去打开文件,去读文件,这这里面没有读文件的操作了,直接send file,因为开send file就所以程序就不需要去读文件了,对吧?OK,然后这是第一次请求,注意啊,这是第一次请求,然后第二次请求再看。在第二次请求的时候。你看这里边儿还有没有这个RAID相关的操作。只有file和right,对不对啊,Right right。对吧,你看还有吗。是不是已经没有这个read这个这个这个这这个这个open这个函数了。对吧,你看你再刷新,我们再看走。
13:01
只有right和center file。就相当于他把这个open给他给缓存住了,他所缓存的呢,这个名字就已经很接地气了,对吧,就open fair catch,那怎么就open file catch了,这少了这个open file的动作,其实呢,它就是把我们的这个呃,文件的这个描述符啊,包括一些其他的额外的这些原数据信息,比如说这个呃,我们文件的这个创建日期啊,修改时间啊。啊,文件大小啊等等等等啊,甚至一些错误信息都可以去记录到这个原数据信息里啊,比如说访问这个文件的时候,他他这个拒绝访问了,或者找不着了,这些访问的错误信息都在这个FD里边啊,这个这个就同时给我们一起缓存到这个我们的内存当中了啊,这就是他能起到的作用,能够极大的加速我们的center file,本来center file就已经很快了。对吧,啊,它本来就很快了,那我让它更快一些,那这里这些配置呢,我们看我们看一下这些都也都不是特别的难懂,首先第一个我们看这open fair catch。
14:05
呃,这后边的这个跟了一个max。这个max呢啊,指的是我们缓存的这个具体文件的这个句柄,我们能缓存多少个啊,这是500个对吧?啊,你还可以配置的更多一些,根据自己的这个实际文件的需求啊,这并不是并不是特别占内存的啊,而且这个从内存里是去检索这个呃,一些原数据信息,这速度是非踌快的啊,你给它稍微的多配一点也也没关系,一两千个对吧,也可以,然后inac。这个呢,咱们在之前给他讲那个proage的时候,是不是就已经用到了,对吧?这就是我们这个已经缓存到内存里之后啊,它啥时候这个会过期,也是把它给剔除掉,就自动过期时间啊,你在这个没访问的这个过程当中,这个只要没给他这个呃续点卡啊,你访问一次,然后说明他激活了啊,多长时间不活动之后呢,然后就把他给踢出了,60秒之后就把它移出了,那如果要是满了之后,这个max满了之后呢,会怎么办?
15:08
啊,这个系统啊,会采用这个LRU算法啊,去把这个一些不被不长被访问到的这个,呃,并且时间存的比较长的这个两个条件啊,共同计算这个数据,把它给自动的剔除掉,保证最多只有500个。啊,这是它的基础配置,另外这个就是。Open file。Catch mean users啊,这个呢,在咱们之前的那个,呃,Per catch里边也用到了,这就是访问多少次之后,我才给你建立缓存。在这咱配置个一呢,就是只要有人请求了,那么接下来我就给你去在这个内存里边。去建立一次缓存啊,然后再下边这个,呃,Open file catch微粒的。这个指的就是我们虽然说已经缓存了文件的原数据信息,那如果要是有人改了之后呢。
16:00
对吧,那如果有人改了之后,我们再去发送出去,那这个文件它就不对了,对吧,那么。这个我们就需要去定时去检查这个磁盘上我们这个文件它有没有发生变化,那这个就是定一个定时器,每隔60秒呢,会去检查一下我们当前这个文件有没有发生变化,如果有发生变化的话,就把它原数据信息呢,再再给它给重新的去,呃构建一次啊。然后在在这个下边呢,这个AR啊,这就是。比如访问错误的信息,我是不是也要缓存一下啊,比如说访你磁盘上的本来这个index天名它就压根没有,那你去open的时候呢,Open不到嘛,对吧,那为啥叫你不到之后呢,你报错了,找不着文件了嘛,对不对。那这个找不着文件要不要缓存,如果不缓存的话,他下次还会再去找,就是这个意思啊,这是open file catch,也就是在我们的这个NG的内存里边去建立的这一级缓存啊,它的这个意义,它主要的意义就是呃,去提升,进一步的提升send file的这个性能啊,这也是N调优点里边比较重要的一个环节,这是默认情况下,在这个我们的系统上没有开启的这部缓存操作啊。
17:11
呃,至于这个,嗯,具体这个参数设置多少,我们还是要根据自己的应用系统啊去搞啊,你如果这个磁盘上文件一共有俩,你在这给它缓存1000,它有意义吗?对吧?那如果你的磁盘上有,磁盘上已经有这个几百万个文件了,你这设置成五个,它也不合适啊,对吧?啊,而且这个它只是一个容器的概念啊,这个个数,这个个数呢,只是说这个篮子或者我这内存里边乘多少个,它乘的呢,就已经是热点数据了,这不需要我们去考虑哪些,我要认为它缓存哪些,不让它缓存是根据用户的实际请求。啊,来建立了这个缓存的哈。呃,那么我们在内存当中的缓存的只是这个文件的原数据信息,那么有没有这个,有没有必要直接把这个文件内容也一块给它缓存这个到内存里,然后直接一个write,我直接给它写出去了,Send file都不需要了,对吧?因为你send file还得去磁盘上去找这个具体的这个呃文件,然后去,然后去把它这个句柄发送给我们的这个网络接口,对吧?那能不能把它给直接全部缓全量缓存到内存里呢?
18:15
有这个必要吗?啊,主要看我们这个文件里,文件系统里边存的什么东西啊,如果你是散碎的各种的这个静态文件如果都不大的话,其实这会儿是可以放到全量的放到内存里的,这样也能有效的提高这个读写的效率啊,因为内存式读写嘛,但如果你的文件过多啊,或者单个文件的比较大,那这会儿就不太适合放到内存里了。这个center file去做磁盘的这种读写啊,对于大文件来说是非常有优势的,对小文件来说啊,到优势并不是什么特别明显的这么一个这个重量的这个指标,对大文件的顺序读写速度是比较快的,不包括在我们的机械式的磁盘,或者是这个SSDSSD磁盘上,只要顺序读写,就是从这个磁道上顺序往后读,速度都还可以。
19:03
对吧,那相反的,你把它放到内存里边,呃,由于文件过大,可能会把你的内存这给撑爆,要么是放不下,要么是你需要再去增加硬件,去买额外的内存,那在这个这在这个这个性价比上呢,可能就不太这个。就就不太高了,所以这个呃send file这种方式去锁呃加上这个open file in catch去做内存式的索引,磁盘式的存储,它比较适合这个呃文件比较多,同时这个呃这个单个文件比较大,这种传统的这种呃这种这这这种存储啊,然后对于这个内存的存储呢,它就比较适合这种热点数据啊,内容不太大,但是但是内容量呢又不少,这种情况下。呃,这就是咱们的这个,嗯,这个这个这个open file catch在NG词里去做这个,呃,去去做这个这个这个文件打开缓存啊,就是文件缓存啊。
我来说两句