এনগিনেক্স প্রক্সি_ড্রেডটাইমআউট বনাম প্রক্সি_কনেক্ট_টাইমআউট


15

আমি সার্ভারের সেটগুলির জন্য একটি বিপরীত প্রক্সি হিসাবে Nginx ব্যবহার শুরু করেছি যা কিছু ধরণের পরিষেবা সরবরাহ করে।

সেবা সময়ে বরং ধীর হতে পারে (জাভা এবং জেভিএম তার চলমান মাঝে মাঝে "পূর্ণ গার্বেজ কালেকশন" যে কয়েক সেকেন্ডের নিতে পারে আটকে পরার), তাই আমি সেট করেছি proxy_connect_timeout2 সেকেন্ডের, যা nginx চিত্রে যথেষ্ট সময় দিতে হবে পরিষেবাটি জিসিতে আটকে আছে এবং সময় মতো প্রতিক্রিয়া জানায় না এবং এটি অনুরোধটি অন্য একটি সার্ভারে প্রেরণ করা উচিত।

আমি proxy_read_timeoutযদি বিপরীত প্রক্সি আটকে থেকে আটকাতে পারি তবে পরিষেবাটি নিজেই প্রতিক্রিয়া গণনা করতে খুব বেশি সময় নেয় - আবার, এটি অনুরোধটিকে অন্য সার্ভারে স্থানান্তরিত করা উচিত যা সময়োপযোগী প্রতিক্রিয়া ফিরিয়ে দেওয়ার জন্য পর্যাপ্ত মুক্ত হওয়া উচিত।

আমি কয়েকটি বেঞ্চমার্ক চালিয়েছি এবং আমি পরিষ্কারভাবে দেখতে পাচ্ছি যে proxy_connect_timeoutকিছু অনুরোধ সংযোগের সময়সীমা নির্ধারণের জন্য ঠিক সময়ে ফিরে আসায় সঠিকভাবে কাজ করে, কারণ পরিষেবাটি আটকে আছে এবং আগত সংযোগগুলি গ্রহণ করে না (পরিষেবাটি জেটি এম্বেড হিসাবে ব্যবহার করছে সার্লেট পাত্রে)। proxy_read_timeoutএছাড়াও, কাজ করে আমি অনুরোধ দেখতে পারেন সময়সীমার পরে আগমন সেখানে নির্দিষ্ট করা হয়েছে।

সমস্যাটি হ'ল আমি এই অনুরোধটি শেষ হওয়ার পরে proxy_read_timeout + proxy_connect_timeoutবা প্রায় দীর্ঘ সময়ের জন্য কিছু অনুরোধগুলি দেখে আশা করেছি , যদি পরিষেবাটি আটকে থাকে এবং যখন এনগিনেক্স অ্যাক্সেস করার চেষ্টা করে সংযোগগুলি গ্রহণ না করে তবে এনগিনেক্সের সময়সীমা শেষ হওয়ার আগে - এটি প্রকাশিত হয়ে যায় এবং প্রক্রিয়াজাতকরণ শুরু হয়, তবে খুব ধীর এবং Nginx পড়ার সময়সীমা শেষ হওয়ার কারণে বাতিল হয়ে যাবে। আমি বিশ্বাস করি যে পরিষেবাটিতে এরকম কেস রয়েছে, তবে বেশ কয়েকটি বেঞ্চমার্ক চালিয়ে মোট কয়েক মিলিয়ন অনুরোধ রয়েছে - আমি কোনও একক অনুরোধ দেখতে ব্যর্থ হয়েছি proxy_read_timeoutযা উপরের যে কোনওটিতে প্রত্যাবর্তন করে (যা বৃহত্তর সময়সীমা)।

আমি এই বিষয়ে যে কোনও মন্তব্যকে প্রশংসা করব, যদিও আমি মনে করি যে এটি এনগিনেক্সের বাগের কারণে হতে পারে (আমার কোডটি এখনও দেখেনি, সুতরাং এটি কেবল একটি অনুমান) যে সংযোগের পরে টাইম আউট কাউন্টার রিসেট হয় না সফল, যদি এনগিনেক্স আপস্ট্রিম সার্ভার থেকে কিছু না পড়েন।


1
এনজিআইএনএক্স এর কোন সংস্করণ? আমি মনে করি আমি পুরানো সংস্করণে প্রায় অনুরূপ কিছু স্মরণ করেছি (প্রায় 0.6 / 7 সম্ভবত) তবে এটি আরও সাম্প্রতিক সংস্করণে স্থির করা হয়েছিল (সর্বশেষ স্থিতিশীল সংস্করণটি 1.0.5), তবে এটি ভুল হতে পারে। এখনও আপনার সংস্করণ সাহায্য করবে বুদ্ধিমান
এবার Smudge

লক্ষ্য করুন নথিটি proxy_read_timeout"গ্লোবাল টাইমআউট" নয়, তবে 2 টি অপারেশন পড়ার মধ্যে রয়েছে।
পাইগ

@ সাম: আমি এনগিনেক্স ০.০.০ ব্যবহার করছি। @ পোইজ - হ্যাঁ, আমি এটি সম্পর্কে সচেতন, সে কারণেই আমি মোট সময়সীমাটি আশা করি proxy_read_timeout + proxy_connect_timeout
গাস

1
পার্শ্ব দ্রষ্টব্য হিসাবে, আপনার সম্ভবত আপনার জেভিএম-এর জন্য কিছু একসাথে আবর্জনা সংগ্রহের টিউন নিয়ে গবেষণা করা উচিত: en.wikedia.org/wiki/…
বহুবচন

@ পলিয়োনমিয়াল: আমরা করেছি কিন্তু আমাদের মানদণ্ড অনুসারে সমকালীন আবর্জনা সংগ্রহের বৈশিষ্ট্য ফলাফল "বিশ্ব বন্ধ করুন" জিসির তুলনায় জিসির কাছে আরও বেশি সিপিইউ সময় হারিয়েছে, সুতরাং আমরা এনগিনেক্স টিউনিংয়ে বিনিয়োগ করতে পছন্দ করি :-)
গুস

উত্তর:


18

আমি আসলে এটির পুনরুত্পাদন করতে অক্ষম ছিলাম:

2011/08/20 20:08:43 [notice] 8925#0: nginx/0.8.53
2011/08/20 20:08:43 [notice] 8925#0: built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
2011/08/20 20:08:43 [notice] 8925#0: OS: Linux 2.6.39.1-x86_64-linode19

আমি আমার nginx.conf এ এটি সেট আপ করেছি:

proxy_connect_timeout   10;
proxy_send_timeout      15;
proxy_read_timeout      20;

আমি তখন দুটি পরীক্ষার সার্ভার সেটআপ করি। একটি যা কেবল এসওয়াইএন-এ শেষ হবে, এবং এমন একটি যা সংযোগ গ্রহণ করবে কিন্তু কোনও প্রতিক্রিয়া জানাবে না:

upstream dev_edge {
  server 127.0.0.1:2280 max_fails=0 fail_timeout=0s; # SYN timeout
  server 10.4.1.1:22 max_fails=0 fail_timeout=0s; # accept but never responds
}

তারপরে আমি একটি পরীক্ষার সংযোগে প্রেরণ করেছি:

[m4@ben conf]$ telnet localhost 2480
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost

HTTP/1.1 504 Gateway Time-out
Server: nginx
Date: Sun, 21 Aug 2011 03:12:03 GMT
Content-Type: text/html
Content-Length: 176
Connection: keep-alive

তারপরে ত্রুটি_লগটি দেখেছে যা এটি দেখিয়েছে:

2011/08/20 20:11:43 [error] 8927#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: ben.dev.b0.lt, request: "GET / HTTP/1.1", upstream: "http://10.4.1.1:22/", host: "localhost"

তারপর:

2011/08/20 20:12:03 [error] 8927#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: ben.dev.b0.lt, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:2280/", host: "localhost"

এবং তারপরে অ্যাক্সেস.লগ যার প্রত্যাশিত 30 এর সময়সীমা শেষ হয়েছে (10 + 20):

504:32.931:10.003, 20.008:.:176 1 127.0.0.1 localrhost - [20/Aug/2011:20:12:03 -0700] "GET / HTTP/1.1" "-" "-" "-" dev_edge 10.4.1.1:22, 127.0.0.1:2280 -

এখানে লগ ফর্ম্যাটটি আমি ব্যবহার করছি যা পৃথক প্রবাহের সময়সীমা অন্তর্ভুক্ত:

log_format  edge  '$status:$request_time:$upstream_response_time:$pipe:$body_bytes_sent $connection $remote_addr $host $remote_user [$time_local] "$request" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $edge $upstream_addr $upstream_cache_status';

1
উপরের আমার প্রশ্নটি আপনার দৃশ্যে এটি আরও বেশি: ধরুন একটি পরীক্ষার সার্ভার যে 0 থেকে 20 সেকেন্ডের মধ্যে এলোমেলো সময় পরে সংযোগটি গ্রহণ করে এবং তারপরে উত্তর দেওয়ার আগে 19 সেকেন্ড থেকে 21 সেকেন্ডের মধ্যে একটি এলোমেলো সময় অপেক্ষা করে। তারপরে এর বিরুদ্ধে সরল একটি মানদণ্ড চালান। আমি প্রায় 50% অনুরোধগুলি 10 সেকেন্ডের সময়সীমা, ফলাফল 25% একটি 20 ~ 30 সেকেন্ডের সময়সীমা সহ এবং 25% সফল প্রতিক্রিয়া পাবে তা দেখতে আশা করব। এই জাতীয় ক্ষেত্রে, কতটি সফল অনুরোধগুলি সম্পূর্ণ হতে 20 সেকেন্ডের বেশি সময় নেবে? আমার মানদণ্ডে, তাদের কেউই নেই - এবং এটি আমাকে কষ্ট দেয়।
21:41

আমি এসওয়াইএন এ এলোমেলো ক্ষতি সেট আপ করে এবং তারপরে একটি সিজিআই করে প্রায় 50 সেকেন্ডের জন্য লাইনগুলি আস্তে আস্তে আউট করে পরীক্ষা করেছিলাম tested উভয় টাইমআউটগুলি একত্রিত করার পরেও সফল হতে পেরেছি আমি অনুরোধগুলি দেখতে পেয়েছি কিন্তু এখনও সফল হচ্ছে: box.access.log 200: 69.814: 67.100:।: 1579 33 127.0.0.1 পরীক্ষার শিরোনাম - [21 / আগস্ট / 2011: 20: 30:52 -0700] "পেতে / huugs HTTP- র / 1.1" "-" "-" "-" dev_edge 127.0.0.1:2280 -
বহুপদী

ঠিক আছে, এটি সম্পূর্ণ ভিন্ন স্তরের :-) এ অদ্ভুত। একটি সম্ভাব্য ব্যাখ্যা হ'ল নিগিনেক্সের অনুরোধটি লিখতে সময় লাগবে ( proxy_send_timeout) এবং আপনি যেহেতু এটিকে আরও উচ্চতর স্থির করেছেন তাই proxy_connection_timeoutএটি 20 সেকেন্ডের পরে কোনও বিলম্বের কারণ হতে পারে proxy_read_timeout। যখন আপনি "আস্তে আস্তে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কথা বলবেন" - আপনি কী বোঝাতে চাইছেন?
গস

প্রতিক্রিয়াটির শরীরে এইচটিএমএল প্রিন্টিং লাইনের মধ্যে 1 টি ঘুমান। পুরো পঠিত পাঠকের মধ্যে প্রক্সি_ড্রেডটাইমআউট কীভাবে হয় তা কেবল প্রকাশ করে।
বহুবর্ষীয়

1
আহ আমি দেখি. ঠিক আছে, এটি অবশ্যই আমার ক্ষেত্রে নয় এবং আমার ওপিতে এটি পরিষ্কার না করার জন্য আমি দুঃখিত। আমার ক্ষেত্রে, অ্যাপ্লিকেশন সার্ভার কোনও প্রকার প্রতিক্রিয়া ফিরিয়ে দেওয়ার আগে পুরো প্রক্রিয়াটি সম্পূর্ণ করে এবং তারপরে সমস্ত কিছু একবারে ফিরিয়ে দেয় - সুতরাং proxy_read_timeoutহয় অনুরোধটি সম্পূর্ণ ব্যর্থ হয় বা সম্পূর্ণরূপে এটির অনুমতি দেয়। এটি আপনার দেখা আচরণ এবং আমি যে আচরণ দেখি তার মধ্যে পার্থক্যও ব্যাখ্যা করে।
গস

3

সমস্যাটি হ'ল আমি প্রক্সি_ড্রেডটাইমআউট + প্রক্সি_কনেক্ট_টাইমআউট, বা প্রায় সেই দৈর্ঘ্যের পরে, যদি পরিষেবাটি আটকে থাকে এবং এনজিঙ্কস এটি অ্যাক্সেস করার চেষ্টা করে সংযোগগুলি গ্রহণ করবে না এমন কয়েকটি অনুরোধগুলি দেখে আশা করেছি, তবে এনগিনেক্স টাইমআউট করার আগে - এটি প্রকাশিত হয় এবং প্রক্রিয়াজাতকরণ শুরু হয়, তবে খুব ধীর এবং Nginx পড়ার সময়সীমা শেষ হওয়ার কারণে বাতিল হয়ে যাবে।

সংযোগের সময়সীমা মানে হ্যান্ডশেক করার সময় টিসিপি স্টলগুলি (উদাহরণস্বরূপ, কোনও SYN_ACKs ছিল না)। টিসিপি SYN গুলি প্রেরণে পুনরায় চেষ্টা করবে, তবে আপনি কেবল 2 সেকেন্ড দিয়েছেন। অন্য সার্ভারটি ব্যবহার করার জন্য এনগিনেক্সে, তাই এসআইএনএন পুনরায় প্রেরণের জন্য এটির কোনও সময় নেই।

UPD। : দস্তাবেজগুলিতে সন্ধান করতে পারেনি, তবে tcpdump দেখায় যে 3 সেকেন্ড রয়েছে। 1 ম প্রেরিত এসওয়াইএন এবং এসওয়াইএন প্রেরণের 2 য় প্রয়াসের মধ্যে বিলম্ব।


আমি মনে করি না এটি আমি ঠিক জিজ্ঞাসা করছি - প্রশ্নটি হল: যদি প্রবাহটি আটকে যায় এবং ১.৯৯৯ সেকেন্ড পরে SYN_ACK ফেরত দেয় তবে এনজিনেক্স কেন বর্তমান প্রবাহের সাথে এই প্রক্রিয়াটি চালিয়ে যাবে না?
গাস

ঠিক আছে, আপনি ঠিক নিশ্চিত হতে চাইলে আপনি স্নিফার ব্যবহার করতে পারেন। এটি সক্রিয় হতে পারে যে <2 সেকেন্ডে কোনও এসি কে নেই're
পাইগ

আমি সত্যিই একটি স্নিফার ব্যবহার করতে পারি না কারণ সিস্টেমে যখন উচ্চ চাপ রয়েছে তখন এই আচরণটি ঘটবে বলে আমি প্রত্যাশা করি। সেখানকার ব্যাখ্যাটি এসিএসগুলি পরে আর কখনও হয় না তবে এর পরে কিছু এক্স তবে এর আগে 2 সেকেন্ড এমনকি কয়েক মিলিয়ন অনুরোধ বিবেচনা করার পরেও তা কলুষিতযোগ্য বলে মনে হয় না।
গস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.