2013-02-07 42 views
9

Tôi đang phát triển một ứng dụng canvas facebook và tôi muốn tải thử nghiệm nó. Tôi nhận thức được hạn chế của Facebook về kiểm tra tự động, vì vậy tôi đã mô phỏng các cuộc gọi api biểu đồ bằng cách tạo một ứng dụng web giả phục vụ dưới nginx và thay đổi/etc/hosts của tôi thành graph.facebook.com thành 127.0.0.1.Sử dụng nginx để mô phỏng thời gian phản hồi chậm cho mục đích thử nghiệm

Tôi đang sử dụng jmeter để tải thử nghiệm ứng dụng và mô phỏng đang hoạt động tốt. Bây giờ tôi muốn mô phỏng phản ứng api đồ thị chậm và xem chúng ảnh hưởng như thế nào đến ứng dụng của tôi. Làm thế nào tôi có thể cấu hình nginx để nó chèn một sự chậm trễ cho mỗi yêu cầu gửi đến ứng dụng graph.facebook.com mô phỏng?

Trả lời

10

Bạn có thể làm chậm tốc độ của localhost (mạng) bằng cách thêm chậm trễ.
Sử dụng lệnh ifconfig để xem thiết bị mạng: trên máy chủ cục bộ có thể là lo và trên mạng LAN eth0.

  • thêm sử dụng trì hoãn lệnh này (thêm chậm trễ 1000ms trên thiết bị lo mạng)

    tc qdisc add dev lo root netem delay 1000ms

  • thay đổi sử dụng sự chậm trễ này một

    tc qdisc change dev lo root netem delay 1ms

  • và xóa độ trễ

    tc qdisc del dev lo root netem delay 1000ms

+0

Thật không may, 'tc' chỉ dành cho Linux, nhưng không xuất hiện trên OS X. – jiyinyiyong

2

Tôi đã sửa đổi một cấu hình nginx để sử dụng limit_req_zonelimit_req để giới thiệu sự chậm trễ. Sau đây làm giảm tốc độ dịch vụ xuống 20 yêu cầu mỗi giây (rate=20r/s). Tôi đã đặt burst=1000 để ứng dụng của tôi không nhận được 503 câu trả lời.

http { 
    limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s; 
    [...] 
    server { 
     [...] 
     location/{ 
      limit_req zone=one burst=1000; 
      [...] 
     } 
    } 
} 

Tài liệu là here. Tôi không tin rằng có một cách để xác định một sự chậm trễ thống nhất bằng cách sử dụng phương pháp này.

1

Câu trả lời trước đó của tôi hoạt động nhưng nó phù hợp hơn với trường hợp tất cả các yêu cầu cần được làm chậm lại. Tôi đã phải đưa ra một giải pháp cho phép tôi chỉ bật giới hạn tốc độ trên cơ sở từng trường hợp và đã đưa ra cấu hình sau. Hãy chắc chắn đọc toàn bộ câu trả lời trước khi bạn sử dụng câu trả lời này, bởi vì có những sắc thái quan trọng cần biết.

location/{ 
     if (-f somewhere/sensible/LIMIT) { 
      echo_sleep 1; 
      # Yes, we need this here too. 
      echo_exec /proxy$request_uri; 
     } 

     echo_exec /proxy$request_uri; 
    } 

    location /proxy/ { 
     internal; 
     # Ultimately, all this goes to a Django server. 
     proxy_pass http://django/; 
     proxy_set_header Host   $http_host; 
     proxy_set_header X-Forwarded-For $remote_addr; 
    } 

Lưu ý quan trọng: sự hiện diện hoặc vắng mặt của dấu gạch chéo ở phía trước tạo sự khác biệt. Ví dụ: proxy_pass http://django, không có dấu gạch chéo, không làm điều tương tự như dòng trong mã ở trên.

Nguyên tắc hoạt động đơn giản. Nếu tệp somewhere/sensible/LIMIT tồn tại thì các yêu cầu khớp với location / sẽ bị tạm dừng trong một giây trước khi tiếp tục. Vì vậy, trong bộ thử nghiệm của tôi, khi tôi muốn một mạng chậm lại, tôi tạo ra các tập tin, và khi tôi muốn loại bỏ sự chậm lại, tôi loại bỏ nó. (Và tôi có mã dọn dẹp để loại bỏ nó giữa mỗi bài kiểm tra.) Về lý thuyết tôi muốn sử dụng các biến cho tệp này nhiều hơn một tệp, nhưng vấn đề là các biến được khởi tạo lại với mỗi yêu cầu.Vì vậy, chúng tôi không thể có một khối location sẽ đặt biến để chuyển giới hạn và một biến khác để tắt giới hạn đó. (Đó là điều đầu tiên tôi thử, và nó thất bại do tuổi thọ của các biến). Nó có lẽ sẽ có thể sử dụng các mô-đun Perl hoặc Lua để biến tồn tại hoặc fiddle với cookie, nhưng tôi đã quyết định không đi xuống các tuyến đường này.

Ghi chú quan trọng:

  1. Nó không phải là một ý tưởng tốt để trộn chỉ thị từ các module echo (như echo_sleepecho_exec) với các chỉ cổ phiếu của nginx đó dẫn đến việc sản xuất của một phản ứng. Ban đầu, tôi có echo_sleep cùng với proxy_pass và có kết quả kém. Đó là lý do tại sao chúng tôi có khối location /proxy/ tách riêng các chỉ thị cổ phiếu khỏi các công cụ echo. (Xem này issue cho một cuộc xung đột tương tự mà đã được giải quyết bằng cách tách một khối.)

  2. Hai echo_exec chỉ thị, trong và ngoài if, là cần thiết do cách if công trình.

  3. Chỉ thị internal ngăn khách hàng yêu cầu trực tiếp /proxy/... URL.

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