nginx中request_time/upstream_response_time區(qū)別

一、request_time與upstream_response_time比較

image.png

request_time

指的就是從接受用戶請求的第一個字節(jié)到發(fā)送完響應數據的時間,即$request_time包括接收客戶端請求數據的時間、后端程序響應的時間、發(fā)送響應數據給客戶端的時間(不包含寫日志的時間)。

image.png

upstream_response_time

是指從Nginx向后端建立連接開始到接受完數據然后關閉連接為止的時間。

一般request_time比upstream_response_time大

如果用戶端網絡狀況較差 或者傳遞數據本身較大
再考慮到 當使用 POST 方式傳參時 Nginx 會先把 request body 緩存起來
而這些耗時都會累積到用戶請求上去

這樣就解釋了:為什么 request_time 有可能會比 upstream_response_time 要大。

因為用戶端的狀況通常千差萬別 無法控制 ,所以并不應該被納入到測試和調優(yōu)的范疇里面
更值得關注的應該是 upstream_response_time

所以在實際工作中 如果想要關心哪些請求比較慢的話,記得要在配置文件的 log_format 中加入 $upstream_response_time

upstream_response_time比request_time 大

upstream_response_time由clock_gettime(CLOCK_MONOTONIC_COARSE)計算,默認情況下,它可以過去4毫秒,相反,$ request_time由gettimeofday()計算。 所以最終upstream_response_time可能比response_time更大。

指導:

所以在通過nginx的access_log來分析后端程序接口響應的時候,需要在nginx的log_format中添加$upstream_response_time字段。


二、在新的Nginx版本中對整個請求各個處理階段的耗時做了近一步的細分

$upstream_connect_time(1.9.1):

跟后端server建立連接的時間,如果是到后端使用了加密的協(xié)議,該時間將包括握手的時間。

$upstream_header_time(1.7.10):單位為秒。

接收后端server響應頭的時間。

流程說明

如果把整個過程補充起來的話 應該是:

  1. 用戶請求
  2. 建立 Nginx 連接
  3. 發(fā)送響應
  4. 接收響應
  5. 關閉 Nginx 連接

upstream_response_time 就是 2+3+4+5 但是 一般這里面可以認為 [5關閉 Nginx 連接] 的耗時接近 0,所以 upstream_response_time 實際上就是 2+3+4 。而 request_time 是 1+2+3+4。二者之間相差的就是 [1用戶請求]的時間。

示意圖

img
  • 程序真正的運行時間 = $upstream_header_time - $upstream_connect_time
  • $request_time 中包含了數據返回時間
  • $request_time 中包含了日志打印的時間

三、場景

nginx日志出現大量超時報警,這個時候發(fā)現upstream_header_time正常,但是request_time、$upstream_response_time很大

分析:根據上面的示意圖,這個時候便反映出是上游程序執(zhí)行較慢、或發(fā)送數據量大,需要排查執(zhí)行程序的相關慢日志。

同樣是ngxin日志出現大量超時報警,這個時候發(fā)現request_time很大,但是upstream_response_time正常

分析:$upstream_response_time正常,說明程序執(zhí)行完畢且正常返回,那么這個時候需要驗證是數據返回過慢還是日志打印出現了阻塞。

原因:

  1. 數據返回慢可以通過抓包分析,通常來說是用戶網絡原因引起的;
  2. 日志打印出現阻塞,可能是機器io出現了問題,這個一般很容易發(fā)現;
  3. 還有可能是nginx配置了相關參數,導致了延遲關閉,這里只要根據問題現象一步一步排查即可。
  4. 也可能返回給客戶端是https,大數據加解密耗時

解決方法:

  1. 把你的服務器放在high-speed network高性能網絡上,讓client能夠快速訪問
  2. 使用緩存CND、Nginx緩存
  3. 或者將你的服務器靠近用戶,多IDC進行對不同區(qū)域用戶服務。如:中國IDC、韓國IDC
  4. 去掉一些低效率算法,參考: Nagle's algorithm
  5. 調整服務器的TCP堆棧(參考 這篇文章). 然而調整TCP堆棧不會有多大作用,因為內核默認配置已經做了優(yōu)化調整了。

$upstream_connect_time很大

可能是網絡通信出現了問題;

$upstream_header_time很小,但是$upstream_response_time很大

可能是數據回寫nginx出現了問題。

文章整理自:
https://blog.csdn.net/zzhongcy/article/details/105819628
https://www.cnblogs.com/dongruiha/p/7007801.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 原文3年多前發(fā)表在私人站點,現遷移到簡書 最近搭了nginx作為日志服務器來做性能和操作分析,記錄一下過程和遇到的...
    陳濤_滴滴閱讀 616評論 0 0
  • 生產上檢查Nginx日志,發(fā)現有python爬蟲程序對日志進行分析,如何簡單配置進行防御 1.配置文件 參考文檔h...
    lionel880閱讀 270評論 0 0
  • 一 Nginx代理 1.1 Nginx代理概述 nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服...
    cuixiaoyan閱讀 261評論 0 0
  • Nginx 高性能的HTTP服務器程序,又是HTTP/IMAP/POP3協(xié)議的反向代理服務器 面對較高并發(fā)請求時,...
    SRE1閱讀 6,821評論 2 5
  • 0 用途 Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發(fā)高性能的 [W...
    博陵韓少閱讀 1,717評論 0 1

友情鏈接更多精彩內容