2013-02-07 14 views
9

मैं एक फेसबुक कैनवास एप्लिकेशन विकसित कर रहा हूं और मैं इसे लोड-टेस्ट करना चाहता हूं। मुझे स्वचालित परीक्षण पर फेसबुक प्रतिबंध के बारे में पता है, इसलिए मैंने nginx के तहत एक नकली वेब एप्लिकेशन बनाकर ग्राफ/एपीआई/मेजबान को बदलने के लिए ग्राफ /facebook.com को 127.0.0.1 पर इंगित करने के लिए ग्राफ एपीआई कॉल का अनुकरण किया।परीक्षण उद्देश्यों के लिए धीमी प्रतिक्रिया समय अनुकरण करने के लिए nginx का उपयोग

मैं आवेदन लोड करने के लिए जेएमटर का उपयोग कर रहा हूं और सिमुलेशन ठीक काम कर रहा है। अब मैं धीमी ग्राफ एपीआई प्रतिक्रियाओं को अनुकरण करना चाहता हूं और देख सकता हूं कि वे मेरे आवेदन को कैसे प्रभावित करते हैं। मैं nginx को कैसे कॉन्फ़िगर कर सकता हूं ताकि यह अनुरूपित ग्राफ.facebook.com एप्लिकेशन को भेजे गए प्रत्येक अनुरोध में देरी दर्ज कर सके?

उत्तर

10

आप देरी जोड़कर स्थानीयहोस्ट (नेटवर्क) की गति को धीमा कर सकते हैं।
नेटवर्क डिवाइस देखने के लिए ifconfig कमांड का उपयोग करें: स्थानीयहोस्ट पर यह lo और LAN पर eth0 हो सकता है।

  • इस आदेश देरी उपयोग जोड़ने के लिए देरी उपयोग बदलने के लिए यह एक

    tc qdisc change dev lo root netem delay 1ms

  • और करने के लिए

    tc qdisc add dev lo root netem delay 1000ms

  • (lo नेटवर्क डिवाइस पर 1000ms देरी जोड़ने) देरी हटाएं

    tc qdisc del dev lo root netem delay 1000ms

+0

दुर्भाग्य से, 'tc' केवल लिनक्स के लिए है, लेकिन ओएस एक्स पर प्रकट नहीं होता – jiyinyiyong

2

मैं एक nginx config limit_req_zone और limit_req उपयोग करने के लिए देरी लागू करने के लिए संशोधित किया। निम्नलिखित प्रति सेकंड 20 अनुरोधों (rate=20r/s) की सेवा की दर को कम कर देता है। मैंने burst=1000 सेट किया है ताकि मेरा एप्लिकेशन 503 प्रतिक्रिया प्राप्त न करे।

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

प्रलेखन here है। मुझे विश्वास नहीं है कि इस विधि का उपयोग कर एक समान देरी निर्दिष्ट करने का एक तरीका है।

1

मेरा पहला उत्तर काम करता है लेकिन यह उस मामले के लिए अधिक अनुकूल है जहां सभी अनुरोधों को धीमा करने की आवश्यकता है। मुझे तब से एक समाधान के साथ आना पड़ा है जो मुझे केवल दर-दर-मामले के आधार पर दर सीमा को चालू करने की अनुमति देगा, और निम्न कॉन्फ़िगरेशन के साथ आया था। इसका उपयोग करने से पहले पूरे उत्तर को पढ़ना सुनिश्चित करें, क्योंकि जानने के लिए महत्वपूर्ण बारीकियां हैं।

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; 
    } 

महत्वपूर्ण नोट: उपस्थिति या आगे के अभाव विभिन्न रास्तों में स्लैश कुछ फ़र्क पड़ता है। उदाहरण के लिए, proxy_pass http://django, बिना पीछे की स्लैश के, उपरोक्त कोड में पंक्ति के समान ही काम करता है।

ऑपरेशन का सिद्धांत सरल है। अगर फ़ाइल somewhere/sensible/LIMIT मौजूद है, तो location / से मेल खाने वाले अनुरोध आगे बढ़ने से पहले एक सेकंड के लिए रुक गए हैं। तो मेरे परीक्षण सूट में, जब मैं नेटवर्क मंदी चाहता हूं, तो मैं फ़ाइल बना देता हूं, और जब मैं मंदी को हटाना चाहता हूं, तो मैं इसे हटा देता हूं। (और मेरे पास क्लीनअप कोड है जो इसे प्रत्येक परीक्षण के बीच हटा देता है।) सिद्धांत में मैं फ़ाइल के मुकाबले इसके लिए चर का उपयोग करना पसंद करूंगा, लेकिन समस्या यह है कि प्रत्येक अनुरोध के साथ वैरिएबल को फिर से शुरू किया जाता है।तो हमारे पास location ब्लॉक नहीं हो सकता है जो सीमा को चालू करने के लिए एक चर सेट करेगा, और दूसरा इसे बंद करने के लिए। (यह पहली चीज है जिसकी मैंने कोशिश की, और यह चर के जीवनकाल के कारण विफल रहा)। संभवतः पर्ल मॉड्यूल या लुआ का उपयोग कुकीज़ के साथ चर या बेवकूफ बने रहने के लिए संभव होगा, लेकिन मैंने इन मार्गों को नीचे नहीं जाने का फैसला किया है।

महत्वपूर्ण नोट:

  1. यह एक अच्छा विचार nginx का जायजा निर्देशों कि एक प्रतिक्रिया के उत्पादन में परिणाम के साथ echo मॉड्यूल से निर्देशों (जैसे echo_sleep और echo_exec) मिश्रण नहीं है। मैंने शुरुआत में echo_sleep को proxy_pass के साथ मिला और खराब परिणाम प्राप्त हुए। यही कारण है कि हमारे पास location /proxy/ ब्लॉक है जो echo सामान से स्टॉक निर्देशों को अलग करता है। (इस issue देखें एक ऐसी ही संघर्ष है कि एक ब्लॉक विभाजित करके हल किया गया था के लिए।)

  2. दो echo_exec निर्देशों के अंदर और बाहर if, कैसे if काम करता है की वजह से आवश्यक हैं।

  3. internal निर्देश ग्राहकों को सीधे /proxy/... यूआरएल का अनुरोध करने से रोकता है।

संबंधित मुद्दे