nginx共享內存機制詳解

發布時間:2019-12-19 22:19 來源:互聯網 當前欄目:網站服務器

nginx的共享內存,是其能夠實現高性能的主要原因之一,而其主要是用于對文件的緩存。本文首先會講解共享內存的使用方式,然后會講解nginx是如何實現共享內存的管理的。

1. 使用示例

nginx聲明共享內存的指令為:

proxy_cache_path /Users/Mike/nginx-cache levels=1:2 keys_zone=one:10m max_size=10g inactive=60m use_temp_path=off;

這里只是聲明的一個名稱為one,最大可用內存為10g的共享內存。這里面各個參數的含義如下:

/Users/Mike/nginx-cache:這是一個路徑參數,指定了將共享內存所緩存的文件的存儲位置。這里為什么會生成文件的原因在于,對于上游服務發出的響應,是可以將其生成一個文件存儲在nginx上的,后續如果有同樣的請求,就可以直接讀取該文件或者讀取共享內存中的緩存以響應客戶端; levels:在linux操作系統中,如果所有文件都放在一個文件夾中,那么當文件數量非常多的時候,可能一個磁盤驅動就無法讀取這么多文件了,如果放置在多個文件夾中,那么就能夠利用多個驅動并且讀取的優點。這里的levels參數指定的就是如何生成文件夾。假設nginx為上游服務的某個響應數據生成的文件名為e0bd86606797639426a92306b1b98ad9,那么對于上面的levels=1:2,其就會從文件名的最后開始取值,先取1位(也即9)作為一級子目錄名,然后取2位(也即ad)作為二級子目錄名; keys_zone:該參數指定了當前共享內存的名稱,這里為one,后面的10m表示當前共享內存用于存儲key的內存大小為10m; max_size:該參數指定了當前共享內存可用的最大內存; inactive:該參數指定了當前共享內存的最長存活時間,如果在這段時間內都沒有任何請求訪問該內存數據,那么其就會被LRU算法淘汰掉; use_temp_path:該參數指定了是否先將生成的文件放入臨時文件夾,后續再移動到指定文件夾下;

2. 工作原理

共享內存的管理工作主要分為如下圖所示的幾個部分:

可以看到,其主要分為初始化、共享內存的管理、共享內存的加載和共享內存的使用等幾個方面。在初始化的過程中,首先會解析proxy_cache_path指令,然后分別啟動cache manager和cache loader進程;這里cache manager進程主要是進行共享內存的管理的,其主要是通過LRU算法清除過期數據,或者當資源緊張時強制刪除部分未被引用的內存數據;而cache loader進程的主要工作是在nginx啟動之后,讀取文件存儲目錄中已有的文件,將其加載到共享內存中;而共享內存的使用主要是在處理請求完成之后對響應數據的緩存,這一部分的內容將在后面的文章中進行講解,本文主要講解前面三部分的工作原理。

按照上面的劃分,共享內存的管理主要可以分為三個部分(共享內存的使用將在后面進行講解)。如下是這三個部分的處理流程的示意圖:

從上面的流程圖中可以看出,在主流程中,主要進行了解析proxy_cache_path指令、啟動cache manager進程和啟動cache loader進程的工作。而在cache manager進程中,主要工作則分為兩部分:1. 檢查隊列尾部元素是否過期,如果過期并且引用數為0,則刪除該元素和該元素對應的文件;2. 檢查當前共享內存是否資源緊張,如果資源緊張,則刪除所有引用數為0的元素及其文件,無論其是否過期。在cache loader進程的處理流程中,主要是通過遞歸的方式遍歷存儲文件的目錄及其子目錄中的文件,然后將這些文件加載到共享內存中。需要注意的是,cache manager進程在每次遍歷完所有的共享內存塊之后會進入下一次循環,而cache loader進程在nginx啟動之后60s的時刻執行一次,然后就會退出該進程。

  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、