天天看點

一次openresty http.lua 性能調優之旅記一次openresty http.lua 性能調優之旅

最近使用nginx lua進行http 資料互動,是以想到了resty/http.lua,是以開啟一段性能調優之旅。

很簡單的一段代碼,利用http.lua request 函數發送http get 請求并傳回body及相關資訊。

在get 小檔案的時候性能表現正常,符合預期,但是get 大檔案的時候非常慢,在内網環境下get 1個 1m左右的object 竟然需要1s+,這性能實在不能忍,而且随着檔案增大性能急劇下降。開始懷疑是不是http server 的原因,用wget 試了一下,發現很快,排除server的原因。百思不得其解後開始分析http.lua 代碼

這是lua 讀取http body 代碼,可以看出這裡有個fetch_size參數,從代碼上看直覺含義是一次從底層網絡讀上來資料塊的大小

看下fetch size 設定值是多少

預設為16k

再看一下function read_body_data 在哪裡調用的,參數callback 傳又是什麼

這裡可以看到我們的程式中沒有傳callback 進去,callback 預設是

分析到這裡問題已經很明顯了

fetch_size 是一次sock:receive 調用讀上來的body 的size,每次讀出來fetch_size 的body 後會回調預設callback 對body 進行拼接,如果檔案size 很大而fetch size 很小就會造成因字元串拼接造成的cpu資源消耗及記憶體消耗。而我們的場景是需要緩存所有body後處理,是以一次讀出越多body越好。

預設callback是

注意:如果你的業務場景是需要流式處理或者轉發這個值隻需要将fetch_size 調整為一個合适的值即可。

繼續閱讀