Author: haoransun
Wechat: SHR—97
学习来源:极客时间-Nginx核心知识100讲,本人购买课程后依据视频讲解汇总成个人见解。
前言
Nginx容器是许多Nginx高级功能的基础,即使我们不需要去编写第三方模块或是去查看Nginx的源代码,但需要变更Nginx配置文件,已达到最大化的性能,也需要理解Nginx容器。
Nginx容器
Nginx哈希表
哈希表配置
与常见的哈希表不同的是:
- 应用场景不同。用于静态不变的内容,即在运行过程中,哈希表通常不会出现插入、删除等操作,Nginx刚启动时就基本确定这个Hash表中一共有多少个元素。因此使用Hash表这种数据结构的模块通常会暴露出 max_size 与 bucket size。max size仅仅控制了最大的哈希表 bucket的个数,而不是实际上 bucket的个数,它的意义在于限制最大化使用内存。
如上图所示,所有使用哈希表的模块有一些特点。stream/http中所有的变量使用了哈希表,因为变量在模块编译进去的时候就已经定义清楚了。还有 map、反向代理等。反向代理中需要对在配置文件中定义好的Header做哈希来提升它的访问性能。哈希表在访问的时候是一个O(1)的复杂度。
哈希表中有一个称之为 Bucket size,在这个里面会有一些默认值,这些默认值在Nginx的配置文档中说会使CPU Cache len 对齐到这样一个值。这实际上影响了怎样去配置 Bucket size,现在的主流CPU会有 L1、L2、L3缓存,它在取主存(内存)上的数据时,并不是按照所想像的那样,按照64位、32位去取。现在主流CPU去主存,一次取得的字节数是就是 CPU Cache len 。如现在是 64 字节。
为什么Hash表要向64字节对齐呢?
假设每一个Hash表的 Bucket是59字节,如果紧密排列在一起,取第一个Hash表元素,仅需要访问一次,还多取了一个自己。取第二个时,要访问主存两次,包括第一个64字节中的最后一个字节以及第二个单元中的58个字节。为了避免取两次的问题,Nginx在它的代码中自动向上对齐。在配置Bucket size时,要注意两个问题。
1 如果配置的不是CPU Cache Len,如配置了70字节,他就会向上分配,每个元素分配128字节。
2 如果有可能,尽量不要超过64字节,以减少CPU访问每个Hash表的次数。
小结
- 哈希表专注于为静态不变的内容服务。
- Hash表的 Bucket size 需要考虑CPU Cache Len 对齐问题。
Nginx红黑树
Nginx多个Worker进程间做进程间通讯时,经常在共享内存上使用红黑树来管理对象,实际上,在Nginx内存中也会大量使用红黑树。
特点:n为节点数
红黑树的使用模块