/ Proc / sys / নেট / ipv4 / tcp_tw_reuse এর মান পরিবর্তন করা কি বিপজ্জনক?


10

আমাদের বেশ কয়েকটি উত্পাদন ব্যবস্থা রয়েছে যা সম্প্রতি ভার্চুয়াল মেশিনে রূপান্তরিত হয়েছিল। আমাদের একটি অ্যাপ্লিকেশন রয়েছে যা প্রায়শই একটি মাইএসকিউএল ডাটাবেস অ্যাক্সেস করে এবং প্রতিটি প্রশ্নের জন্য এটি একটি সংযোগ তৈরি করে, অনুসন্ধান করে এবং সেই সংযোগটি সংযোগ বিচ্ছিন্ন করে।

এটি জিজ্ঞাসা করার উপযুক্ত উপায় নয় (তবে আমি জানি) তবে আমাদের সীমাবদ্ধতা রয়েছে যা আমাদের কাছে পাওয়া উচিত বলে মনে হয় না। যাইহোক, সমস্যাটি হ'ল: মেশিনটি যখন একটি ফিজিক্যাল হোস্ট ছিল, প্রোগ্রামটি ঠিকঠাক হয়েছিল। একবার ভার্চুয়াল মেশিনে রূপান্তরিত হয়ে গেলে, আমরা ডাটাবেসের মাঝে মাঝে মাঝে সংযোগের বিষয়টি লক্ষ্য করেছি। TIME_WAIT- এ এক পর্যায়ে 24000+ সকেট সংযোগ ছিল (শারীরিক হোস্টে, আমি সর্বাধিক দেখেছি 17000 - ভাল নয়, তবে সমস্যা তৈরি করে না)।

আমি চাই যে এই সংযোগগুলি আবার ব্যবহার করা হোক, যাতে আমরা সেই সংযোগ সমস্যাটি দেখতে না পাই এবং তাই:

প্রশ্নাবলী:

Tcp_tw_reuse এর মান 1 তে সেট করা কি ঠিক? সুস্পষ্ট ঝুঁকি কি কি? আমার কখনই এটি করা উচিত নয় এমন কোনও কারণ আছে ?

এছাড়াও, এত সংযোগ TIME_WAIT এ যেতে বা তাদের পুনঃব্যবহার করা থেকে বাঁচানোর জন্য সিস্টেম (আরএইচইএল / সেন্টোস) পাওয়ার কোনও অন্য উপায় আছে কি?

শেষ অবধি, tcp_tw_re سائیکل পরিবর্তন করা কী করবে, এবং এটি আমার সহায়তা করবে?

অগ্রিম, ধন্যবাদ!


1
এই লিঙ্কটি tcp_tw_re سائیکل এবং tcp_tw_reuse এর বিপদকে ভালভাবে ব্যাখ্যা করে। এটি ব্যবহার করবেন না।

উত্তর:


8

আপনি নিরাপদে সময় হ্রাস করতে পারেন, তবে আপনি প্যাকেট হ্রাস বা জিটারের সাথে নেটওয়ার্কগুলিতে অপ্রয়োজনীয়ভাবে বন্ধ সংযোগ নিয়ে সমস্যাগুলি চালিয়ে যেতে পারেন। আমি 1 সেকেন্ডে টিউনিং শুরু করব না, 15-30 এ শুরু করব এবং আপনার পথে নামব।

এছাড়াও, আপনার সত্যিকার অর্থে আপনার অ্যাপ্লিকেশনটি ঠিক করা দরকার।

আরএফসি 1185 বিভাগে 3.2 একটি ভাল ব্যাখ্যা আছে:

টিসিপি সংযোগ বন্ধ হয়ে গেলে, টাইম-ওয়েট রাজ্যে 2 * এমএসএল বিলম্বের ফলে সকেট জুটি 4 মিনিটের জন্য বেঁধে দেওয়া হয় ([পোস্টেল 81 এর বিভাগ 3.5 দেখুন। টিসিপি-র উপর নির্মিত অ্যাপ্লিকেশন যা একটি সংযোগ বন্ধ করে এবং একটি নতুন খুলবে (উদাঃ , স্ট্রিম মোড ব্যবহার করে একটি এফটিপি ডেটা স্থানান্তর সংযোগ) অবশ্যই প্রতিবার একটি নতুন সকেট জুটি বেছে নিতে হবে This এই বিলম্বটি দুটি পৃথক উদ্দেশ্যে কাজ করে:

 (a)  Implement the full-duplex reliable close handshake of TCP. 

      The proper time to delay the final close step is not really 
      related to the MSL; it depends instead upon the RTO for the 
      FIN segments and therefore upon the RTT of the path.* 
      Although there is no formal upper-bound on RTT, common 
      network engineering practice makes an RTT greater than 1 
      minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT 
      state works satisfactorily to provide a reliable full-duplex 
      TCP close.  Note again that this is independent of MSL 
      enforcement and network speed. 

      The TIME-WAIT state could cause an indirect performance 
      problem if an application needed to repeatedly close one 
      connection and open another at a very high frequency, since 
      the number of available TCP ports on a host is less than 
      2**16.  However, high network speeds are not the major 
      contributor to this problem; the RTT is the limiting factor 
      in how quickly connections can be opened and closed. 
      Therefore, this problem will no worse at high transfer 
      speeds. 

 (b)  Allow old duplicate segements to expire. 

      Suppose that a host keeps a cache of the last timestamp 
      received from each remote host.  This can be used to reject 
      old duplicate segments from earlier incarnations of the 

* দ্রষ্টব্য: এটি যুক্তিযুক্ত হতে পারে যে যে পক্ষটি একটি এফআইএন প্রেরণ করছে তা জানে যে এটি কতটা নির্ভরযোগ্যতার প্রয়োজন, এবং তাই এফআইএন-র গ্রহণকারীর জন্য টাইম-ওয়েট বিলম্বের দৈর্ঘ্য নির্ধারণ করতে সক্ষম হওয়া উচিত। এটি FIN বিভাগগুলিতে উপযুক্ত টিসিপি বিকল্পের সাথে সম্পন্ন হতে পারে।

      connection, if the timestamp clock can be guaranteed to have 
      ticked at least once since the old conennection was open. 
      This requires that the TIME-WAIT delay plus the RTT together 
      must be at least one tick of the sender's timestamp clock. 

      Note that this is a variant on the mechanism proposed by 
      Garlick, Rom, and Postel (see the appendix), which required 
      each host to maintain connection records containing the 
      highest sequence numbers on every connection.  Using 
      timestamps instead, it is only necessary to keep one quantity 
      per remote host, regardless of the number of simultaneous 
      connections to that host.

ব্যাখ্যার জন্য ধন্যবাদ. সমস্যাটি লাইব্রেরিতে রয়েছে, যার উপর আমার নিয়ন্ত্রণ নেই।
সাগর

6

এটি আপনার প্রশ্নের উত্তর দেয় না (এবং এটি 18 মাস দেরি হয়ে গেছে), তবে আপনার উত্তরাধিকার অ্যাপ্লিকেশনটিকে পুনরায় ব্যবহারের বন্দরগুলি তৈরির অন্য উপায়ের পরামর্শ দেয়:

সিস্টেমে tcp_tw_reuse(বা tcp_tw_recycle) সেটিং করার একটি দরকারী বিকল্প হ'ল LD_PRELOADআপনার অ্যাপ্লিকেশনটিতে একটি ভাগ করা লাইব্রেরি (ব্যবহার করা ) ;োকানো; সেই লাইব্রেরিটি বন্দরটির পুনরায় ব্যবহারের অনুমতি দিতে পারে। এটি আপনার লিগ্যাসি অ্যাপ্লিকেশনটিকে আপনার সিস্টেমে সমস্ত অ্যাপ্লিকেশনগুলিতে জোর না করে পোর্ট পুনরায় ব্যবহারের অনুমতি দেয় (আপনার অ্যাপ্লিকেশনটির কোনও সংশোধন প্রয়োজন হয় না), ফলে এটি আপনার সাম্প্রতিক প্রভাবটিকে সীমিত করে। উদাহরণ স্বরূপ,

    LD_PRELOAD=/opt/local/lib/libreuse.so ./legacy_app

এই ভাগ করা লাইব্রেরির socket()কলটি বাধা দেওয়া উচিত , আসল সকেট () কল করা উচিত এবং ফিরে আসা সকেটে SO_REUSEADDR এবং / অথবা SO_REUSEPORT সেট করা উচিত। কীভাবে এটি করা যায় তার উদাহরণের জন্য http://libkeepalive.sourceforge.net দেখুন (এটি রক্ষণাবেক্ষণগুলি চালু করে, তবে SO_REUSEPORT চালু করা খুব মিল)) আপনার মন্দ ভদ্র উত্তরাধিকার অ্যাপ্লিকেশন IPv6, ব্যবহার করে, পরিবর্তন লাইন 55 মনে রাখবেন libkeepalive.cথেকে

    if((domain == PF_INET) && (type == SOCK_STREAM)) {

প্রতি

    if(((domain == PF_INET) || (domain == PF_INET6)) && (type == SOCK_STREAM)) {

যদি আপনি আটকে থাকেন তবে আমাকে ইমেল প্রেরণ করুন এবং আমি কোডটি লিখে আপনার কাছে প্রেরণ করব।


6

আমি মনে করি এই মানটি 1 টিতে পরিবর্তন করা ঠিক আছে the কমান্ডটি ব্যবহার করার থেকে আরও উপযুক্ত উপায় হতে পারে:

[root@server]# sysctl -w net.ipv4.tcp_tw_reuse=1

আমি জানি যে কোনও সুস্পষ্ট বিপদ নেই, তবে একটি দ্রুত গুগল অনুসন্ধান এই লিঙ্কটি তৈরি করে যা নিশ্চিত করে যে tcp_tw_reuseএটি তার চেয়ে ভাল বিকল্প tcp_tw_recycle, তবে নির্বিশেষে সতর্কতার সাথে ব্যবহার করা উচিত।


2
না, এটি যা বলে তা নয়। এটিতে (tcp_tw_reuse সম্পর্কে কথা বলা) বলা হয়েছে, "এটি সাধারণত tcp_tw_re سائیکل এর একটি নিরাপদ বিকল্প"।
ফ্যানটিয়াস

0

সংযোগটি টাইম ওয়েটে থাকলে পুনরায় ব্যবহার করা যাবে না। আপনার যদি অ্যাপ্লিকেশন এবং মাইএসকিউএল এর মধ্যে নেটওয়ার্কে প্যাকেট ক্ষতি না করে থাকে, আপনি সময়সীমা কমিয়ে দিতে পারেন।

তবে সবচেয়ে ভাল সমাধান হ'ল ডাটাবেস এবং সংযোগ পুলের প্রতি অবিচ্ছিন্ন সংযোগগুলি ব্যবহার করা।


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