nginx做服务器出现request_time为0的情况

小树桩1991 发布于 2015/11/11 11:58
阅读 3K+
收藏 0

使用nginx作为服务器时,通过观察access.log发现有很多的请求打印的request_time为0,很疑惑。做了机组实验。如下:

    

【实验】
1.与长连接有关。

用同一组url对nginx进行测试,当使用短连接请求时,所有请求都能得到request_time值,且数量正常。

而当使用长连接请求时,有的url的request_time值为0.000。且第一个的请求的记录会出现两遍。

2.与url有关。
同样使用长连接,有的url返回的request_time有值,有的是0.000。
【查资料】
资料一:
> I have a strange problem with slow load of relatively large files. On a
> domain without proxy (designed for serving static files), the request
> time (as monitored by access log $request_time) for an simple jpg image
> file of 5KB  is 0.000s (seems to be shorter than 1ms). Thus, one expect
> to load an image file of 15KB within 3ms, but surprisingly it takes
> about 600ms. A static file of 15KB is not big at all; but there should
> be a threshold which leads to this slow down upon slightly increasing
> the file size.

The $request_time of 0.000s isn't something real.  Instead, it
means that nginx wasn't going through event loop while processing
the request. It was able to read the request from client, read
data from disk and send all data to socket buffer without
overflowing it.  As nginx only updates it's idea about current
time once per event loop iteration, the above results in
$request_time of 0.000s in logs.  Real time spent may
significantly differ if you are disk-bound and reading from disk
blocks for a long time (and you aren't using AIO).

Try looking into your disk subsystem stats, most likely it will
explain things.

资料二:
> Our version of nginx is nginx/1.0.8 and we have write a third
> party module to handle the http request. Because the process
> model of our third party module is synchronous so the nginx
> worker process will be blocked until one request  accomplished.
> The average time cost of one request is about 50ms.But After we
> set $request_time in nginx.conf, the most of the value of
> $request_time is 0.000.Even we set timer_resolution 1ms in
> nginx.conf most of value of $request_time is still 0.000.
> Are there anyone can tell me why it occured?

Time as seen by nginx is only updated once per event loop
iteration, so if you block processing for a while and then
finalize the request - this time won't be visible in
$request_time.

The timer_resolution may change things on some platforms, but it's
not designed to do so.  Instead, it's to _reduce_ timer resolution
compared to what nginx does by default, see
大意是说和nginx内部的刷新时间有关,当事件触发时才会刷新。。。。
将timer_resolution配置为1ms,可以定时刷新缓存时间,还是出现0.000。 

加载中
0
红薯
红薯

有 request_time 这个东西吗?用在哪里的?

小树桩1991
ngx_http_log_module.c文件中,可以通过设置配置文件打印该值
0
0
0xtuhao
在nginx主配置文件nginx.conf设置日志格式,然后用request_time和upstream_response_time查看请求和响应时间. 
    ##
    # Logging Settings
    ##
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"'
    '$connection $upstream_addr '
    'upstream_response_time $upstream_response_time request_time $request_time ';
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log ;
返回顶部
顶部