设置 hash

编译自:
http://nginx.org/en/docs/hash.html

nginx 为了快速处理静态数据集,比如:server names、map 指令的参数值、MIME 类型、请求首部字符串的名字等,采用了 hash 表来处理。nginx 在启动和重新加载配置时,会选择可能的最小的 hash 表大小,这是为了在存储拥有相同 hash 值的 key 的时候,使得 bucket size 不超过配置的上限值。

hash 表的大小以 bucket 来表示。在 hash 表大小超过 hash max size 参数的设置之前,bucket 能够自动调整大小。大多数 hash 值有对应的配置指令,比如对于 server name hash,对应的指令为:server_names_hash_max_sizeserver_names_hash_bucket_size.

  • server_names_hash_max_size 表示支持的 server name 总数;
  • server_names_hash_bucket_size 表示 server name 的字符串长度上限值

可参考:server_names_hash_max_size

hash bucket size 的大小需要对齐 CPU 的 cache line size,它必须是 cache line size 的整数倍。这样设置,能够使现代处理器在进行 key 检索时减少内存访问次数从而提升检索速度。

如果 hash bucket size 等于 cache line size,那么在进行 key 检索时所需要的访问内存次数最多需要 2 次。第一次,是计算 bucket address;第二次,是为了在 bucket 中进行 key 检索。因此,如果 nginx 给出消息要求增加 hash max size 或者 hash bucket size 时,应该首先增加 hash max size 的值。

为理解本文,首先要理解两个概念:

  • hash table
  • cache line size

hash table

hash table,也叫哈希表,散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做 hash 表。

给定表 M,存在函数f(key),对任意给定的关键码值 key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表 M 为哈希(Hash)表,函数f(key)为 hash 函数。

cache line size

一个L1 DATA CACHE 相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。 它和内存交互一般一次传输16个字节(或32个字节),也就是:

CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存..这些在 CACHE 和物理内存之间一次被传输的字节被称为 cache line size。

cache line 对齐

cache 写到物理内存的位置不是任意的,我们假定内存为64K,那么cache地址0的数值只能和物理内存的地址0、 16K、32K交互;cache地址1的数值只能和物理内存的地址1、16K+1、32K+1交互;cache地址16K-1的数值只能和物理内存的地址16K-1、16K+16K-1、32K+16K-1交互。

假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么 CPU 只需要 cache 的第一个 cache line 交互一次,就可以完整读取对象 A 的 16 字节长的字段,

如果放在物理地址 8-23,就必须将第一个和第二个 cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要 cache line 对齐,在这里就是16个字节对齐。


版权信息
本文编译自 nginx.org 的部分,遵循其原来的 licence 声明: 2-clause BSD-like license

其他引用:
hash table
cache line size
cache line 对齐

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,642评论 24 1,002
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 1,800评论 0 3
  • Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:...
    IT码农工阅读 841评论 0 0
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,988评论 0 9
  • BY 大音 1月 INS有氧为主 力量为辅 缺点: 过去的12月的训练过于松懈 饮食放纵 (不过姨妈正常了··...
    河子水阅读 291评论 0 0