আমি সম্প্রতি উত্পাদনের সমস্যাটি সন্ধান করার জন্য বেশ কিছুটা সময় ব্যয় করেছি, যেখানে 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_time
2 ঘন্টার ডিফল্ট মানে যখন আমরা কোনও রিমোট হোস্টের প্রতিক্রিয়াটির জন্য অপেক্ষা করি তখন আমাদের সংযোগটি বৈধ কিনা তা যাচাই করতে একটি রক্ষণশীল অনুসন্ধান শুরু করার আগে আমরা ধৈর্য ধরে 2 ঘন্টা অপেক্ষা করব। এবং তারপরে, যদি রিমোট হোস্ট কোনও রক্ষণশীল তদন্তের প্রতিক্রিয়া না জানায়, আমরা keep বার ( tcp_keepalive_probes
), 75৫ সেকেন্ডের ব্যবধানে ( tcp_keepalive_intvl
) ফাঁক করে রাখা এই রক্ষণশীল অনুসন্ধানগুলি পুনরায় চেষ্টা করব , তাই আমরা সংযোগটি সত্যই মারা যাওয়ার সিদ্ধান্ত নেওয়ার 11 মিনিট আগে এটি অতিরিক্ত an
এই ক্ষেত্রে আমি যা দেখেছি তার সাথে মেলে: উদাহরণস্বরূপ, আমি যদি psql
কোনও প্রত্যন্ত পোস্টগ্র্রেএসকিউএল উদাহরণের সাথে সংযুক্ত একটি সেশন শুরু করি, তবে কিছু প্রশ্নের সাথে কোনও প্রতিক্রিয়া অপেক্ষা করে, যেমন
SELECT pg_sleep(30);
এবং তারপরে রিমোট সার্ভারটি একটি ভয়াবহ মৃত্যুবরণ করতে পারে (যেমন machine মেশিনে ট্র্যাফিক ছেড়ে দিন), আমি দেখি যে আমার পিএসকিএল সেশনটি এর সংযোগটি শেষ হয়ে গেছে তার আগে 2 ঘন্টা 11 মিনিট অপেক্ষা করছে। আপনি যেমন ভাবতে পারেন, এই ডিফল্ট সেটিংস কোডের জন্য মারাত্মক সমস্যা সৃষ্টি করে যা আমরা যখন একটি ডাটাবেসের সাথে কথা বলি, বলি, একটি ডাটাবেস ফেইলওভার ইভেন্ট। এই গিরিগুলি নীচে ঘুরিয়ে দেওয়া অনেক সাহায্য করেছে! এবং আমি দেখতে পাচ্ছি যে আমি এই ডিফল্টগুলি সামঞ্জস্য করার পরামর্শ দেওয়ার ক্ষেত্রে একা নই ।
সুতরাং আমার প্রশ্নগুলি হ'ল:
- ডিফল্টগুলি কত দিন ধরে এই রকম ছিল?
- এই টিসিপি সেটিংসকে ডিফল্ট করার মূল যুক্তিটি কী ছিল?
- কোনও লিনাক্স ডিস্ট্রোজ এই ডিফল্ট মান পরিবর্তন করে?
এবং এই সেটিংসের যুক্তি সম্পর্কিত অন্য কোনও ইতিহাস বা দৃষ্টিভঙ্গি প্রশংসা করা হবে।
TCP_KEEPIDLE
, TCP_KEEPCNT
এবং TCP_KEEPINTVL
।
TCP_USER_TIMEOUT
সেট করার পরিবর্তে সকেট বিকল্পটিও নির্দিষ্ট করা উচিত net.ipv4.tcp_retries2
। অবশ্যই অনেক অ্যাপ্লিকেশন (যেমন আমার উদাহরণে পোস্টগ্রিসকিউএল) TCP_USER_TIMEOUT
এখনও সমর্থন করে না।