原创 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。如果沒有配置