原创 ATS讀小文件(內存命中)
一個資源根據其大小可能會存在多個存儲對象中。如果足夠小(連同doc結構的大小小於一個fragment的size),連同這個資源的meta信息一起存儲在一個doc中。如果比較大,第一個存儲對象保存資源的meta信息,後面跟着若干個fragme
原创 ATS緩存概述
在volume.config裏面可以配置多個volume,比如說有4塊磁盤,配了3個volume。每塊磁盤都有3個volume,一個磁盤的一個volume是一個stripe,stripe是磁盤級別存儲的最小單位。stripe存着若干個存儲對
原创 transform插件
transform插件用於修改POST請求的body和http響應的body,可以理解爲一個過濾器,或者nginx的body_filter。有兩個地方可以添加transform回調函數,TS_HTTP_REQUEST_TRANSFORM_H
原创 ngx_http_wait_request_handler函數解析
在普通的http請求過程中,ngx_event_accept函數中ls->handler(c);調用了ngx_http_init_connection函數,ngx_http_init_connection函數會調用ngx_http_wait
原创 ngx_http_process_request_headers函數解析
ngx_http_process_request_headers函數被ngx_http_process_request_line函數調用,將請求頭逐個放到r->headers_in.headers結構體中。由於不確定請求中一共有多少個hea
原创 ATS請求處理狀態機流程(緩存命中)
如果有興趣請先簡單閱讀“ATS代碼分析概述”和“ATS代碼分析概述”。在HttpSM::handle_api_return和HttpSM::set_next_state函數分別打斷點,進入函數的時候分別打印t_state.api_next_
原创 ATS讀大文件(命中)
大文件存儲結構和小文件完全不同,小文件佔一個fragment就夠了,大文件佔若干個fragment。大文件第一個分片是doc只存一些信息數據,包括http頭,資源的content存在於後面若干個fragment中,默認每個fragment佔
原创 ATS讀小文件(磁盤命中)
理想狀況下,一個文件第一次訪問,緩存查詢結果是MISS。第二次以及之後的請求查詢結果都是HIT,直到資源在緩存中過期。第二次查詢在ats中的行爲是內存MISS並且磁盤HIT,這裏討論這種狀況。主要函數和流程如下:Cache::open_re
原创 ngx_http_process_request_line函數解析
處理請求行,一般的http請求過程中,ngx_http_process_request_line函數被ngx_http_wait_request_handler調用,並且在ngx_http_wait_request_handler中被設置爲
原创 ATS寫文件
與讀緩存類似,寫緩存也有大文件小文件的區分,這裏先討論寫小文件。大致的思想就是將CacheVC::blocks中的數據拷貝到agg_buf中,整個流程如下:Cache::open_write: 根據key生成一個新key作爲earliest
原创 ngx_http_create_request函數解析
ngx_http_request_t是一個重要的結構體,每一個http請求都會有自己的ngx_http_request_t結構,ngx_http_create_request函數初始化了一個ngx_http_request_t結構。主要代碼
原创 ATS代碼分析概述
ats代碼有幾十萬行之多,與請求流程相關的代碼主要集中在HttpSM.cc中。文件中包含了三個重要的函數:HttpSM::handle_api_return和HttpSM::set_next_state和HttpSM::call_trans
原创 ATS迴環檢測
ATS的迴環檢測是通過判斷本機ip是否出現在請求頭中的Via頭來實現。Machine::Machine(char const* the_hostname, sockaddr const* addr):函數初始化了本機的入口ip。如果沒有配置