TIME_WAIT এ কীভাবে সকেটের সংখ্যা হ্রাস করবেন?


36

উবুন্টু সার্ভার 10.04.1 x86

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

ফলস্বরূপ, আমার প্রচুর সকেট রয়েছে, TIME_WAIT এ ঝুলানো রয়েছে (নীচে টিসিপি সেটিংস সহ গ্রাফটি ক্যাপচার করা হয়েছে):

সময় অপেক্ষা

আমি সকেটের সংখ্যা হ্রাস করতে চাই।

এর বাইরে আমি কী করতে পারি?

$ বিড়াল / প্রকো / সিএস / নেট / আইপিভি 4 / টিসিপি_ফিন_টাইমআউট
1
$ বিড়াল / proc / sys / নেট / ipv4 / tcp_tw_re سائیکل
1
$ বিড়াল / proc / sys / নেট / ipv4 / tcp_tw_reuse
1

আপডেট: মেশিনে প্রকৃত পরিষেবা বিন্যাসের কিছু বিশদ:

ক্লায়েন্ট ----- টিসিপি-সকেট -> এনগিনেক্স (ভারসাম্য বিপরীত প্রক্সি) 
       ----- টিসিপি-সকেট -> এনগিনেক্স (কর্মী) 
       --domain-सॉকেট -> fcgi- সফ্টওয়্যার
                          --single- প্রসিডেন্ট-টিসিপি-সকেট -> রেডিস
                          - - এনসেল-পার্সেন্টেন্ট-টিসিপি-সকেট -> মাইএসকিউএল (অন্যান্য মেশিন)

আমার সম্ভবত ডোমেন সকেটে লোড-ব্যালেন্সার -> কর্মী সংযোগটি স্যুইচ করা উচিত, তবে TIME_WAIT সকেটগুলির বিষয়টি অবিরত থাকবে - আমি শীঘ্রই একটি পৃথক মেশিনে দ্বিতীয় কর্মী যুক্ত করার পরিকল্পনা করছি। সেক্ষেত্রে ডোমেন সকেট ব্যবহার করতে সক্ষম হবেন না।


মনে হচ্ছে মুনিন নির্লজ্জ হয়ে মিথ্যা বলছে। কাইলের উত্তরের মন্তব্য দেখুন। এখন যে খোঁজ।
আলেকজান্ডার গ্ল্যাডিশ

1
মুনিন সম্পর্কে একটি প্রশ্ন তৈরি করেছেন: সার্ভারফল্ট.কোশনস
আলেকজান্ডার গ্ল্যাডিশ

এখন দেখে মনে হচ্ছে যে মুনিন মিথ্যা বলছে না, বরং আমি ভুল চক্রান্তের দিকে তাকিয়ে আছি ...
আলেকজান্ডার গ্ল্যাডিশ

উত্তর:


28

আপনার আরম্ভ করার জন্য একটি জিনিসটি ঠিক করা উচিত net.ipv4.tcp_fin_timeout=1। এটি হ'ল উপায়, আপনার সম্ভবত 30 এর থেকে খুব কম হওয়া উচিত নয়।

যেহেতু এটি nginx এর পিছনে। তার মানে কি এনজিনেক্স বিপরীত প্রক্সি হিসাবে কাজ করছে? যদি এটি হয় তবে আপনার সংযোগগুলি 2x (ক্লায়েন্টের কাছে একটি, আপনার ওয়েব সার্ভারে একটি)। আপনি জানেন কি এই সকেটগুলি কোন প্রান্তের অন্তর্ভুক্ত?

আপডেট:
ফাইন_টাইমআউট তারা কতক্ষণ FIN-WAIT-2 এ থাকে ( networking/ip-sysctl.txtকার্নেলের ডকুমেন্টেশন থেকে):

tcp_fin_timeout - INTEGER
        Time to hold socket in state FIN-WAIT-2, if it was closed
        by our side. Peer can be broken and never close its side,
        or even died unexpectedly. Default value is 60sec.
        Usual value used in 2.2 was 180 seconds, you may restore
        it, but remember that if your machine is even underloaded WEB server,
        you risk to overflow memory with kilotons of dead sockets,
        FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1,
        because they eat maximum 1.5K of memory, but they tend
        to live longer. Cf. tcp_max_orphans.

আমি মনে করি আপনাকে সম্ভবত লিনাক্সটি TIME_WAIT সকেট নম্বর বজায় রাখতে দেয় যা সম্ভবত 32 কে ক্যাপের মতো দেখায় এবং লিনাক্স তাদের পুনর্ব্যবহার করে। এই 32 কে এই লিঙ্কটিতে ইঙ্গিত দেওয়া হয়েছে :

এছাড়াও, আমি / প্রোকে / সিস / নেট / আইপিভি 4 / টিসিপি_ম্যাক্স_আটউ_বকেটগুলি বিভ্রান্তিকর খুঁজে পাই। যদিও ডিফল্টটি 180000 এ সেট করা হয়েছে, সর্বাধিক দ্বিগুণ বালতি নির্বিশেষে আমার সিস্টেমে 32K TIME_WAIT সকেট থাকা অবস্থায় আমি একটি টিসিপি বিঘ্ন দেখতে পাচ্ছি।

এই লিঙ্কটিও পরামর্শ দেয় যে TIME_WAIT রাজ্যটি 60 সেকেন্ড এবং প্র্যাকের মাধ্যমে টিউন করা যায় না।

এলোমেলো মজাদার ঘটনা:
আপনি প্রতিটি সকেটের সাথে নেটট্যাট সহ টাইমওয়েটের টাইমারগুলি দেখতে পারেনnetstat -on | grep TIME_WAIT | less


পুনরায় ব্যবহার বনাম পুনর্ব্যবহারযোগ্য: এগুলি এক ধরণের আকর্ষণীয়, এটি পুনরায় ব্যবহারের মতো সময়_ওয়েটের সকেটের পুনঃব্যবহার সক্ষম করে এবং পুনর্ব্যবহার করে এটি টার্বো মোডে রাখে:

tcp_tw_recycle - BOOLEAN
        Enable fast recycling TIME-WAIT sockets. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

tcp_tw_reuse - BOOLEAN
        Allow to reuse TIME-WAIT sockets for new connections when it is
        safe from protocol viewpoint. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

আমি নেট.আইপিভি 4.টিসিপি_টিউ_সাইকেল ব্যবহার করার পরামর্শ দেব না কারণ এটি NAT ক্লায়েন্টদের সাথে সমস্যা সৃষ্টি করে

সম্ভবত আপনি উভয়ই চালু না রেখে চেষ্টা করতে পারেন এবং দেখুন এর কী প্রভাব রয়েছে (একবারে একবার চেষ্টা করে দেখুন তারা কীভাবে নিজেরাই কাজ করে)? আমি netstat -n | grep TIME_WAIT | wc -lমুনিনের চেয়ে দ্রুত প্রতিক্রিয়ার জন্য ব্যবহার করব ।


1
@ কাইল: আপনি কীসের জন্য net.ipv4.tcp_fin_timeoutসুপারিশ করবেন?
আলেকজান্ডার গ্ল্যাডিশ

1
@ কাইল: ক্লায়েন্ট - টিসিপি-সকেট -> এনগিনেক্স (লোড ব্যালেন্সার রিভার্স প্রক্সি) - টিসিপি-সকেট -> এনগিনেক্স (কর্মী) --ডোমেন-সকেট -> এফসিজি-সফটওয়্যার
আলেকজান্ডার গ্ল্যাডিশ

2
আমি বলব 30বা হতে পারে 20। চেষ্টা করে দেখুন। আপনার প্রচুর বোঝা রয়েছে তাই প্রচুর TIME_WAIT ধরণের অর্থ দাঁড়ায়।
কাইল ব্র্যান্ড্ট

1
@Kyle: একটি মূঢ় প্রশ্ন (আমি একটি পণ্যসম্ভার-অর্চনা স্তরের উপর এখানে এতদূর, দুর্ভাগ্যবশত আছি) জন্য আমরা দুঃখিত, কিন্তু আমি দেখতে যখন আমি পরিবর্তন ঠিক কি আশা করা উচিত net.ipv4.tcp_fin_timeoutথেকে 1থেকে 20?
আলেকজান্ডার Gladysh

4
ওহ, এখানে একটি চমৎকার এক মাছ ধরার নৌকা হল: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c। সুতরাং @ অ্যালেক্স, যদি মুনিন পছন্দ না করে তবে সম্ভবত এটি কীভাবে এই পরিসংখ্যানগুলি পর্যবেক্ষণ করে তা ড্রিল করুন। সম্ভবত একমাত্র সমস্যা হ'ল মুনিন আপনাকে খারাপ ডেটা দিচ্ছে :-)
কাইল ব্র্যান্ড্ট

1

tcp_tw_reuse তুলনামূলকভাবে নিরাপদ কারণ এটি TIME_WAIT সংযোগগুলি পুনরায় ব্যবহারের অনুমতি দেয়।

বন্দরগুলির বাইরে চলে যাওয়া যদি সমস্যা হয় তবে আপনি নিজের লোড-ব্যালেন্সারের পিছনে বিভিন্ন বন্দরে শোনার জন্য আরও পরিষেবা পরিচালনা করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.