設置 hash

設置 hash 
============

編譯自:
http://nginx.org/en/docs/hash.htmlhtml

nginx 爲了快速處理靜態數據集,好比:server names、map 指令的參數值、MIME 類型、請求首部字符串的名字等,採用了 hash 表來處理。nginx 在啓動和從新加載配置時,會選擇可能的最小的 hash 表大小,這是爲了在存儲 擁有相同 hash 值的 key 的時候,使得 bucket size 不超過配置的上限值。nginx

hash 表的大小以 bucket 來表示。在 hash 表大小超過 hash max size 參數的設置以前,bucket 可以自動調整大小。大多數 hash 值有對應的配置指令,好比對於 server name hash,對應的指令爲:server_names_hash_max_size 和 server_names_hash_bucket_size.數組

server_names_hash_max_size 表示支持的 server name 總數;
server_names_hash_bucket_size 表示 server name 的字符串長度上限值數據結構

可參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_max_size函數

hash bucket size 的大小須要對齊 CPU 的 cache line size,它必須是 cache line size 的整數倍。這樣設置,可以使現代處理器在進行 key 檢索時減小內存訪問次數從而提高檢索速度。url

若是 hash bucket size 等於 cache line size,那麼在進行 key 檢索時所須要的訪問內存次數最多須要 2 次。第一次,是計算 bucket address;第二次,是爲了在 bucket 中進行 key 檢索。所以,若是 nginx 給出消息要求增長 hash max size 或者 hash bucket size 時,應該首先增長 hash max size 的值。spa


爲理解本文,首先要理解兩個概念:
    hash table
    cache line size

    server

hash table:
    
    hash table,也叫哈希表,散列表,是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作散列函數,存放記錄的數組叫作 hash 表。
    
    給定表 M,存在函數f(key),對任意給定的關鍵碼值 key,代入函數後若能獲得包含該關鍵字
    的記錄在表中的地址,則稱表 M 爲哈希(Hash)表,函數f(key)爲 hash 函數。htm


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的數值只能和物理內存的地址一、16K+一、32K+1交互;

    假設對象A的一個字段長爲16個字節,若是它放在物理地址 0-15,
    那麼 CPU 只須要 cache 的第一個 cache line 交互一次,就能夠完整讀取對象A的 16 字節長的字段,
    
    若是放在物理地址 8-23,就必須將第一個和第二個 cache line 都讀入,才能得到這個字段的信息,顯然這樣速度慢,因此通常字段須要 cache line 對齊,在這裏就是16個字節對齊。

 

引用:

hash table
cache line

相關文章
相關標籤/搜索