2012-10-16 34 views
20

Một trong những khách hàng của tôi đến với một vấn đề về tốc độ cho véc ni.Varnish chậm khi đối tượng được lưu trữ (bộ nhớ)

debug Long, ngắn:
Khi véc ni có được một đối tượng từ bộ nhớ cache của mình (bộ nhớ), nó thực sự chậm chạp (> 5 giây),
khi sơn cần phải nhận được đối tượng từ backend apache, không có vấn đề tốc độ (< 1 giây).

dụ của một yêu cầu chậm (từ 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 

Nếu tôi đúng, vấn đề là trên dòng cuối cùng (ReqEnd),
37,142880440 đây là lần chỉ trong vài giây để gửi các tập tin .
Tôi có cùng một vấn đề về địa phương (vì vậy nó không phải là một vấn đề băng thông).

Sự cố chỉ xảy ra vào buổi sáng khi số lượng khách truy cập tối đa ở đây (~ 400req/s).

lựa chọn cho véc ni:

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" 

Varnish dường như có đủ ram và ổn thôi:

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 

Varnish là up-to-date (3.0.3-1 ~ lenny).

Nếu bạn có một ý tưởng hay một ca khúc ...

Cấu hình véc ni:

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); 
} 
+0

tôi đã nhấn vấn đề tương tự trong quá khứ, đôi khi url 'nóng' được lưu trong bộ nhớ cache trở nên rất chậm để truy xuất và chỉ hiển thị trong quá trình sản xuất với req/s cao. vấn đề rất khó nắm bắt và tôi đã không quản lý để tạo báo cáo lỗi có thể kiểm chứng mà các nhà phát triển có thể hành động. – ttt

+0

tôi nghĩ rằng chúng tôi đã làm việc xung quanh vấn đề này bằng cách tách tải xuống máy chủ véc ni thứ hai. từ véc ni kinh nghiệm của tôi có nhiều tinh tế và khó nắm bắt các vấn đề như thế này chỉ hiển thị trong những trường hợp cụ thể - tôi đoán nó chưa trưởng thành đủ chưa. nếu bạn có thể mô tả các bước để tái sản xuất hoặc chứng minh các vấn đề để hỗ trợ véc ni - đi cho nó xin vui lòng :) – ttt

+4

bạn đã hình này ra? –

Trả lời

1

Bạn có

-p thread_pool_max=1000 

mà thực sự là một tối thiểu được khuyến khích, và kể từ khi bạn có

n_wrk_queued 26 

mà là một chỉ báo rằng đó là thời gian để tăng các chủ đề, tôi tin rằng nếu bạn đã thay đổi nó thành 2000 ví dụ và giữ một mắt cho n_wrk_queued để đảm bảo rằng bạn không cần nhiều hơn, mọi thứ sẽ làm việc ra tốt.

Các vấn đề liên quan