hash表
Ngnix使用hash表來協助完成請求的快速處理。
考慮到儲存鍵及其值的hash表存儲單元的大小不至于超出設定參數(hash bucket size), 在啟動和每次重新配置時,Nginx為hash表選擇盡可能小的尺寸。
直到hash表超過參數(hash max size)的大小才重新進行選擇. 對于大多數hash表都有指令來修改這些參數。例如,儲存伺服器名字的hash表是由指令
server_names_hash_max_size
和
server_names_hash_bucket_size
所控制的。參數hash bucket size總是等于hash表的大小,并且是一路處理器緩存大小的倍數。在減少了在記憶體中的存取次數後,使在處理器中加速查找hash表鍵值成為可能。如果hash bucket size等于一路處理器緩存的大小,那麼在查找鍵的時候,最壞的情況下在記憶體中查找的次數為2。第一次是确定存儲單元的位址,第二次是在存儲單元中查找鍵值。是以,如果Nginx給出需要增大 hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小.
事件模型
Nginx支援如下處理連接配接的方法(I/O複用方法),這些方法可以通過
use
指令指定。
- select - 标準方法。 如果目前平台沒有更有效的方法,它是編譯時預設的方法。你可以使用配置參數
--with-select_module
來啟用或禁用這個子產品。--without-select_module
- poll - 标準方法。 如果目前平台沒有更有效的方法,它是編譯時預設的方法。你可以使用配置參數
--with-poll_module
--without-poll_module
- kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統使用kqueue可能會造成核心崩潰。
- epoll - 高效的方法,使用于Linux核心2.6版本及以後的系統。在某些發行版本中,如SuSE 8.2, 有讓2.4版本的核心支援epoll的更新檔。
- rtsig - 可執行的實時信号,使用于Linux核心版本2.2.19以後的系統。預設情況下整個系統中不能出現大于1024個POSIX實時(排隊)信号。這種情況對于高負載的伺服器來說是低效的;是以有必要通過調節核心參數
來增加隊列的大小。可是從Linux核心版本2.6.6-mm2開始, 這個參數就不再使用了,并且對于每個程序有一個獨立的信号隊列,這個隊列的大小可以用 RLIMIT_SIGPENDING 參數調節。當這個隊列過于擁塞,nginx就放棄它并且開始使用/proc/sys/kernel/rtsig-max
方法來處理連接配接直到恢複正常。poll
- /dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
- eventport - 高效的方法,使用于 Solaris 10. 為了防止出現核心崩潰的問題, 有必要安裝 這個 安全更新檔。