粉丝22.1万获赞108.7万

ngx 是一个多进程程序,那么不同的窝科进程之间如果需要共享数据,那么只能通过共享内存,那么下面我们来看一看 ngx 中的共享内存是怎么使用的。 ngx 的进程间的通讯方式主要有两种,第一种是信号,那么之前我们在说如何管理 ngx 的过程中,已经比较详细的介绍过了,那么如果需要做数据的同步呢?那么只能通过共享内存。所谓共享内存,也就是我们打开了一块内存,比如说实照,那么一整块零到实照之间, 多个沃克进程之间可以同时的访问他,包括读取和写入,那么为了使用好这样一块共享内存,就会引入另外两个问题。那么第一个问题呢,就是锁,因为多个沃克进程同时操作一块内存,一定会出现 竞争关系,所以我们需要加锁在 n x 的锁中,在早期它还有基于信号量的锁,信号量是一种离尼克斯里比较久远的竞争同步方式,它会导致你的进程进入休眠状态,也就是发生了主动切换。而现在大多数操作系统版本中, 两手使用的锁都是自选锁,还不会急于信号量自选锁呢,也就是说当这个锁的条件没有满足,比如说这块内存现在被一号污垢进程使用,那么二号污垢进程 需要去获取锁的时候,只要一号进程没有释放锁爱好,进程会一直在不停的去请求这把锁。就好像如果是基于信号量的早期的 nis 锁,那么假设这把锁锁住了一扇门,如果我可进城一已经拿到这把锁进到屋里, 那么沃克竞争爱试图去拿锁敲门,发现里面已经有人了,那么沃克竞争爱就会就地休息,等待沃克竞争一从门里出来以后通知他还自选锁不一样,那么沃克竞争爱发现门里已经有沃克竞争一了,他就一直的持续的在敲门。 所以使用自选锁要求所有的安检模块必须快速的使用共享内存,也就是快速的取得锁以后快速的释放锁,一旦出现有第三方模块不遵守这样的规则,就可能导致出现啊 死锁或者说性能下降的问题。那么有了这么一块共享内存,会引入第二个问题,因为一整块共享内存啊,往往是给许多对象同时使用的,如果我们在模块中手动的去编写分配, 把这些内存给到不同的对象是非常繁琐的,所以这个时候我们使用了 slab 内存管理器,这个接下来我们会再说。那么 njx 哪些模块使用了共享内存呢? 我对官方的常用的 ngx 模块使用了共享内存做了一个总结,那么使用共享内存主要使用这两种数据结构, 第一个是红黑树哈皮脆,比如我们想做限速或者流控等等场景时,我们是不能容忍啊在内存中做的,否则一个五个进程对某一个用户触发了流控,而其他五个进程还不知道,所以我们只能在共享内存中做,比如说黎明的肯拉克型, 比如说 limit request, 还有所有的 igb catch 做反向代理时用的还有 ssl。 那么红黑树有一个特点, 就是他的插入删除非常的快,当然也可以做便利,所以这些模块都有一个特点,我需要做快速的插入和删除。比如我现在发现了一个客户端,我对他限速,那么限速如果达到了,我需要把这个客户端从我的限速数据结构容器中移出,都需要非常的快速。 那么第二个常用的是结果是单列表啊,也就是说我只要把这些需要共享的元素串起来就可以了,比如 s t v upstream zoom model 或者 stream upstream zoom model。 然后我们再来看一个稍微复杂的例子,也就是 n x htp 撸啊 api, 这个模块 实际上是 open resty 的核心模块,那么 open resty 在这个模块中定义了呃,一个 sdk, 那么这个 sdk 叫撸啊切尔 dict, 当这个指令出现的时候啊,它会分配一块 共享内存,比如说这里我们指定了叫实照, m 就是我们的空间大小,那么这块共享内存会有一个名称叫做 dogs。 接下来我们在撸啊代码中,比如这一段 content by 撸啊 block 啊,这对应着我们 ngx 收到了 set 这个 url 的时候,需要做一些什么样的事情?我们首先从 dogs 共享内容取出,然后设置了一个 k y 六 jim, 它的 y 六是八,然后向客户大家返回啊,我已存储,然后在 gay 的请求中,我们把继母的值八取出来返回用户。那么在这一段代码中呢,我们同时使用了刚刚我们介绍过的红黑数以及 电表,那么这个路啊,先要递给的 dog 实照了,中间呢,使用红黑素来保存每一个 k y 六,红黑 黑数中的每一个节点,就是他的进啊,他的歪的就是八,那么为什么我还需要一个列表呢?是因为这个实照是有限的, 但我们的撸啊代码涉及到了我们的应用代码,应用应用代码很容易就超过了实照的限制。当我们出现实照限制的时候呢,我们有很多种处理方法,比如让他写入失败,但是撸啊需要迪克特采用了另外一种方式,就是他用 l l 淘汰,也就是我最早 set 或者最早 get 长时间不用的那一个节点,比如前面还有 gm 等于七或者六,最早的那个节点会优先被淘汰掉。当已经达到实照的最大值时, 所以这个路啊歇个定中。他对共享内存的使用同时满足了红、黑数和列表。共享内存是 n、 g、 x 跨五个通讯的最有效的手段,只要我们 需要让一段业务逻辑在多个沃克进程中同时生效,比如在许多座集群的流控上,那么必须使用共享内存,而不能在每一个沃克内存中去操作。

你真的了解双通道内存吗?双通道的优点,一、可以带来二倍的内存带宽,再多任务进程内存调用频率高时效能更好。二、与绑载显卡共享内存时,助显卡在游戏中获得更为流畅的速度。 双通道的缺点,一、必须要有两条内存条,更耗成本。二、双通道在单进程的游戏性能上与单通道的差距不大。三、双通道内存架构超平更困难。