我的一位客户遇到了绘制(paint)速度问题。

长调试,短调试:
当清漆从其缓存(内存)中获取一个对象时,它确实很慢(> 5秒),
当清漆需要从apache后端获取对象时,没有速度问题(
缓慢请求的示例(来自varnishlog):

193 ReqStart     c <client ip> 59490 1329239608
193 RxRequest    c GET
193 RxURL        c /<my_url>/toto.png
193 RxProtocol   c HTTP/1.1
193 RxHeader     c Accept: */*
193 RxHeader     c Referer: <my_referer>
193 RxHeader     c Accept-Language: fr
193 RxHeader     c User-Agent: <client_useragent>
193 RxHeader     c Accept-Encoding: gzip, deflate
193 RxHeader     c Host: <my_vhost>
193 RxHeader     c Connection: Keep-Alive
193 VCL_call     c recv lookup
193 VCL_call     c hash
193 Hash         c /<my_url>/toto.png
193 Hash         c <my_vhost>
193 VCL_return   c hash
193 Hit          c 1329136358
193 VCL_call     c hit deliver
193 VCL_call     c deliver deliver
193 TxProtocol   c HTTP/1.1
193 TxStatus     c 200
193 TxResponse   c OK
193 TxHeader     c Server: Apache
193 TxHeader     c Last-Modified: Mon, 18 Jun 2012 08:57:46 GMT
193 TxHeader     c ETag: "c330-4c2bb5c0ef680"
193 TxHeader     c Cache-Control: max-age=1200
193 TxHeader     c Content-Type: image/png
193 TxHeader     c Content-Length: 49968
193 TxHeader     c Accept-Ranges: bytes
193 TxHeader     c Date: Tue, 16 Oct 2012 06:54:03 GMT
193 TxHeader     c X-Varnish: 1329239608 1329136358
193 TxHeader     c Age: 391
193 TxHeader     c Via: 1.1 varnish
193 TxHeader     c Connection: keep-alive
193 TxHeader     c X-Cache: HIT
193 TxHeader     c X-Cache-Hits: 210
193 Length       c 49968
193 ReqEnd       c 1329239608 1350370443.778280735 1350370480.921206713 0.372072458 0.000045538 37.142880440

如果我是对的,问题出在最后一行(ReqEnd),
37.142880440现在是发送文件的时间,以秒为单位。
我在本地也有同样的问题(所以这不是bandband问题)。

该问题仅在最大访问者在这里(〜400req / s)的早晨发生。

清漆选项:
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -p thread_pool_min=100 \
             -p thread_pool_max=1000 \
             -p session_linger=100 \
             -s malloc,8G"

清漆似乎有足够的公羊并且很好:
SMA.s0.c_req             4303728        38.35 Allocator requests
SMA.s0.c_fail                  0         0.00 Allocator failures
SMA.s0.c_bytes      169709790476   1512443.66 Bytes allocated
SMA.s0.c_freed      168334747402   1500189.36 Bytes freed
SMA.s0.g_alloc            172011          .   Allocations outstanding
SMA.s0.g_bytes        1375043074          .   Bytes outstanding
SMA.s0.g_space        7214891518          .   Bytes available

n_wrk                      200          .   N worker threads
n_wrk_create               200         0.00 N worker threads created
n_wrk_failed                 0         0.00 N worker threads not created
n_wrk_max                    0         0.00 N worker threads limited
n_wrk_lqueue                 0         0.00 work request queue length
n_wrk_queued                26         0.00 N queued work requests
n_wrk_drop                   0         0.00 N dropped work requests

n_lru_nuked                  0          .   N LRU nuked objects
n_lru_moved            8495031          .   N LRU moved objects

清漆是最新的(3.0.3-1〜lenny)。

如果您有想法或轨道...

清漆配置:
backend default {
    .host = "127.0.0.1";
    .port = "8000";
    .connect_timeout = 10s;
    .first_byte_timeout = 10s;
    .between_bytes_timeout = 5s;
}

sub vcl_recv {
  set req.grace = 1h;

  if (req.http.Accept-Encoding) {
    if (req.http.Accept-Encoding ~ "gzip") {
      set req.http.Accept-Encoding = "gzip";
    }
    else if (req.http.Accept-Encoding ~ "deflate") {
      set req.http.Accept-Encoding = "deflate";
    }
    else {
      unset req.http.Accept-Encoding;
    }
  }

  if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|eot|ttf|woff|svg|htm|xml)(\?[a-z0-9]+)?$") {
    unset req.http.Cookie;
  }

  if (req.url ~ "^/content/.+\.xml$") {
    unset req.http.Cookie;
  }

  if (req.url ~ "^/min/") {
    unset req.http.Cookie;
  }

  if (req.restarts == 0) {
    if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For =
        req.http.X-Forwarded-For + ", " + client.ip;
    } else {
        set req.http.X-Forwarded-For = client.ip;
    }
  }
  if (req.request != "GET" &&
    req.request != "HEAD" &&
    req.request != "PUT" &&
    req.request != "POST" &&
    req.request != "TRACE" &&
    req.request != "OPTIONS" &&
    req.request != "DELETE") {
      return (pipe);
  }
  if (req.request != "GET" && req.request != "HEAD") {
      return (pass);
  }
  if (req.http.Authorization || req.http.Cookie) {
      return (pass);
  }
  return (lookup);
}

sub vcl_fetch {
    if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|eot|ttf|woff|svg|htm|xml)(\?[a-z0-9]+)?$") {
        unset beresp.http.set-cookie;
    }

    if (req.url ~ "^/(content|common)/.+\.xml$") {
      unset req.http.Cookie;
    }

    if (req.url ~ "^/min/") {
      unset req.http.Cookie;
    }

    set beresp.grace = 1h;

    if (beresp.ttl <= 0s ||
        beresp.http.Set-Cookie ||
        beresp.http.Vary == "*") {
        set beresp.ttl = 120s;
        return (hit_for_pass);
    }
    return (deliver);
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
        set resp.http.X-Cache-Hits = obj.hits;
    } else {
        set resp.http.X-Cache = "MISS";
    }

    return (deliver);
}

最佳答案

你有过

-p thread_pool_max=1000

实际上,这是最低推荐值,因为您有
n_wrk_queued 26

这表明现在是增加线程的时候了,我相信如果您例如将其更改为2000并密切注意n_wrk_queued以确保您不需要更多线程,那一切都会做得很好。

09-08 00:21