এই লিনাক্স টিসিপি ডিফল্ট সেটিংস কীভাবে সিদ্ধান্ত নেওয়া হয়েছিল?


13

আমি সম্প্রতি উত্পাদনের সমস্যাটি সন্ধান করার জন্য বেশ কিছুটা সময় ব্যয় করেছি, যেখানে poll()একটি সংযুক্ত ক্লায়েন্টের জন্য একটি ডাটাবেস সার্ভার অদৃশ্য হয়ে যাওয়ার কারণে 2 ঘন্টা অবধি ( libpq ক্লায়েন্ট লাইব্রেরিতে কল করার জন্য দীর্ঘ অপেক্ষা ) হতে পারে। সমস্যাটি খনন করে, আমি বুঝতে পেরেছি যে বিচ্ছিন্ন টিসিপি সংযোগগুলি একটি সময় মতো ফ্যাশনে নজরে পড়ার জন্য এই কার্নেল প্যারামিটারগুলি ঠিক নীচে সামঞ্জস্য করা উচিত:

net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_retries2 = 15

উপরের চারটি মান একটি উবুন্টু 12.04 মেশিনের, এবং দেখে মনে হচ্ছে যে এই ডিফল্টগুলি বর্তমান লিনাক্স কার্নেল ডিফল্ট থেকে অপরিবর্তিত রয়েছে ।

এই সংস্থাগুলি বিদ্যমান সংযোগটি উন্মুক্ত রাখতে এবং রক্ষণশীল তদন্তগুলির সাথে অত্যন্ত কৃপণ হওয়ার প্রতি ভারী পক্ষপাতদুষ্ট বলে মনে হচ্ছে। এআইইউআই, tcp_keepalive_time2 ঘন্টার ডিফল্ট মানে যখন আমরা কোনও রিমোট হোস্টের প্রতিক্রিয়াটির জন্য অপেক্ষা করি তখন আমাদের সংযোগটি বৈধ কিনা তা যাচাই করতে একটি রক্ষণশীল অনুসন্ধান শুরু করার আগে আমরা ধৈর্য ধরে 2 ঘন্টা অপেক্ষা করব। এবং তারপরে, যদি রিমোট হোস্ট কোনও রক্ষণশীল তদন্তের প্রতিক্রিয়া না জানায়, আমরা keep বার ( tcp_keepalive_probes), 75৫ সেকেন্ডের ব্যবধানে ( tcp_keepalive_intvl) ফাঁক করে রাখা এই রক্ষণশীল অনুসন্ধানগুলি পুনরায় চেষ্টা করব , তাই আমরা সংযোগটি সত্যই মারা যাওয়ার সিদ্ধান্ত নেওয়ার 11 মিনিট আগে এটি অতিরিক্ত an

এই ক্ষেত্রে আমি যা দেখেছি তার সাথে মেলে: উদাহরণস্বরূপ, আমি যদি psqlকোনও প্রত্যন্ত পোস্টগ্র্রেএসকিউএল উদাহরণের সাথে সংযুক্ত একটি সেশন শুরু করি, তবে কিছু প্রশ্নের সাথে কোনও প্রতিক্রিয়া অপেক্ষা করে, যেমন

SELECT pg_sleep(30);

এবং তারপরে রিমোট সার্ভারটি একটি ভয়াবহ মৃত্যুবরণ করতে পারে (যেমন machine মেশিনে ট্র্যাফিক ছেড়ে দিন), আমি দেখি যে আমার পিএসকিএল সেশনটি এর সংযোগটি শেষ হয়ে গেছে তার আগে 2 ঘন্টা 11 মিনিট অপেক্ষা করছে। আপনি যেমন ভাবতে পারেন, এই ডিফল্ট সেটিংস কোডের জন্য মারাত্মক সমস্যা সৃষ্টি করে যা আমরা যখন একটি ডাটাবেসের সাথে কথা বলি, বলি, একটি ডাটাবেস ফেইলওভার ইভেন্ট। এই গিরিগুলি নীচে ঘুরিয়ে দেওয়া অনেক সাহায্য করেছে! এবং আমি দেখতে পাচ্ছি যে আমি এই ডিফল্টগুলি সামঞ্জস্য করার পরামর্শ দেওয়ার ক্ষেত্রে একা নই ।

সুতরাং আমার প্রশ্নগুলি হ'ল:

  • ডিফল্টগুলি কত দিন ধরে এই রকম ছিল?
  • এই টিসিপি সেটিংসকে ডিফল্ট করার মূল যুক্তিটি কী ছিল?
  • কোনও লিনাক্স ডিস্ট্রোজ এই ডিফল্ট মান পরিবর্তন করে?

এবং এই সেটিংসের যুক্তি সম্পর্কিত অন্য কোনও ইতিহাস বা দৃষ্টিভঙ্গি প্রশংসা করা হবে।


এখানে কিছু প্রাসঙ্গিক তথ্য ... tldp.org/HOWTO/TCP-Kipalive- হাওটো
ইউজিংকি্যালাইভ

মনে রাখবেন আপনি প্রথম তিনটি সকেট অপশন সঙ্গে ক্লায়েন্ট কোডে প্রতি সংযোগ পরিবর্তন করতে পারেন TCP_KEEPIDLE, TCP_KEEPCNTএবং TCP_KEEPINTVL
Wnoise

1
@ নোনায়েস আসলে লিনাক্স ২.6.৩7 থেকে সিস্টেম-ওয়াইড TCP_USER_TIMEOUTসেট করার পরিবর্তে সকেট বিকল্পটিও নির্দিষ্ট করা উচিত net.ipv4.tcp_retries2। অবশ্যই অনেক অ্যাপ্লিকেশন (যেমন আমার উদাহরণে পোস্টগ্রিসকিউএল) TCP_USER_TIMEOUTএখনও সমর্থন করে না।
জোশ কুপারশ্মিদ্দট

উত্তর:


6

আরএফসি 1122 বিভাগ ৪.২.৩. in সুনির্দিষ্টভাবে জানিয়েছে যে বজায় রাখা সময়কাল অবশ্যই দু'ঘন্টারও কম ডিফল্ট হয় না।


1
সুন্দর, এটি খনন করার জন্য আপনাকে ধন্যবাদ। আমি মনে করি যে বেশিরভাগ ক্ষেত্রে কেন tcp_keepalive_timeডিফল্ট 7200 এ প্রশ্নের উত্তর দেয় , যদিও আমি এখনও অন্য তিনটি প্রাসঙ্গিক সেটিংসের নজির / ব্যাখ্যায় আগ্রহী।
জোশ কুপারশ্মিদট

আমার উত্তর ও মুছে ফেলার পদ্ধতি যেমন এই প্রশ্ন (অন্তত মান এক জন্য) উত্তর
coteyr

1
@ কোটায়ার যাইহোক ধন্যবাদ, আমি এই প্রচেষ্টাটির প্রশংসা করি। আইআইআরসি আপনার উত্তর সম্পর্কে একটি আগ্রহজনক মন্তব্য ছিল যা পূর্ববর্তী লিনাক্স কার্নেলগুলিতে ডিফল্ট 15 মিনিটের ছিল বলে বোঝায়। আমি কীভাবে / কেন তা ২ ঘন্টা পরিবর্তিত হয়েছি বা প্রথম স্থানে 15 মিনিটে সেট করতে আগ্রহী তা জানতে চাই।
জোশ কুপারশ্মিদট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.