ATS讀小文件(磁盤命中)

理想狀況下,一個文件第一次訪問,緩存查詢結果是MISS。第二次以及之後的請求查詢結果都是HIT,直到資源在緩存中過期。第二次查詢在ats中的行爲是內存MISS並且磁盤HIT,這裏討論這種狀況。主要函數和流程如下:

wKioL1gF9UfT_x_sAADWRh52iIU145.png

Cache::open_read: 首先需要計算的到vol,因爲需要知道資源在哪個vol上才能確定是否存在,每個vol都是獨立存在的。獲取鎖之後運行了dir_probe函數,確定了緩存查詢的結果。獲取了dir,對CacheVC對象的key和dir進行了初始化。生成一個CacheVC對象,之後的操作都是這個CacheVC對象是事兒了。設置回調函數爲Cache::openReadStartHead,設置完回調函數會執行do_read_call,最終do_read_call返回了EVENT_RETURN,執行了事件回調函數,就是剛剛設置的Cache::openReadStartHead。

dir_probe: 通過md5值計算得到資源所在的segemnt和bucket,進而得到目標dir,如果dir是否“正確”,如果正確就認爲命中了。

CacheVC::do_read_call: 初始化doc_pos爲0。解析dir,獲取fragment大概大小(dir_approx_size)。決定是否應該寫到ssd中(dir_inssd),如果已經是從ssd中讀了,就肯定不寫了。每個vol都會對應自己的ssd,每個vol都會維護一些歷史數據用來判斷熱度相關的數據。最終將回調函數PUSH爲CacheVC::handleRead並執行,最終返回了EVENT_RETURN給Cache::open_read。關於設置回調函數用到的宏,在“ATS緩存概述”中有簡單的介紹。

CacheVC::handleRead: 獲取偏移量(dir_get_offset)。 在內存中查詢(vol->ram_cache->get函數會根據records.config中的配置項proxy.config.cache.ram_cache.algorithm指向不同的函數)。如果查詢沒有命中,生成一個iobufferdata buf(可以理解爲內存中開了一塊空間),生成一個char*變量指向buf的data。將磁盤中的內容memcpy到內存中。設置回調函數爲 CacheVC::handleReadDone,將返回 EVENT_RETURN給CacheVC::do_read_call。

CacheVC::handleReadDone:主要工作是執行了put函數,根據records.config中的配置項proxy.config.cache.ram_cache.algorithm,put有LRU和CLFUS兩個實現。主要工作就是將資源加入到淘汰機制。對回調函數進行POP操作,將在CacheVC::do_read_call函數中PUSH的CacheVC::handleRead函數POP掉。最後執行事件回調函數,就是Cache::open_read函數中設置的Cache::openReadStartHead函數。

CacheVC::openReadStartHead: 之後的邏輯與讀小文件(內存命中)相同。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章