আমি আজ আপনার জন্য একটি রহস্য পেয়েছি। আমরা একটি ছোট, তিনটি নোড ইলাস্টিকসার্চ ক্লাস্টার অ্যাওরেতে কোরিওএস (2023.5.0 / লিনাক্স 4.19.25-কোরোস) এর উপর ভিত্তি করে চালাচ্ছি। ইলাস্টিকসার্ক হোস্ট নেটওয়ার্ক মোডে একটি ডকার ধারকের ভিতরে চালিত হয়। এক বছরেরও বেশি সময় ধরে প্রায় সম্পূর্ণ রক্ষণাবেক্ষণ নিখরচনের পরে আমরা দেখছি মেশিনগুলি খুব আকর্ষণীয় অবস্থায় interestingুকছে।
হালনাগাদ
এই সমস্যাটি লিনাক্স কার্নেলের কোনও ড্রাইভারকে স্থির করে সমাধান করা হয়েছিল । নীচে উত্তর দেখুন।
লক্ষণ
মূলত, আক্রান্ত মেশিন এবং অন্যান্য দুটি নোডের মধ্যে নেটওয়ার্কিং মারা যায়। সমস্ত একই ভার্চুয়াল নেটওয়ার্ক এবং একই সাবনেটে রয়েছে এবং অন্যের সাথে ব্যবহারযোগ্যভাবে যোগাযোগ করতে পারে। আক্রান্ত নোডটি এখনও অন্য সাবনেটগুলি (আমি এটিতে প্রেরণ করতে পারি) এবং একটি পৃথক পিয়ার ভার্চুয়াল নেটওয়ার্ক থেকে পৌঁছাতে পারি। মেশিনটির ইন্টারনেটের সাথে খুব স্পর্শকাতর সংযোগও রয়েছে তবে বেশিরভাগ অনুরোধের সময়সীমা শেষ হয়ে যায়।
আমরা দেখেছি যে কোনও আক্রান্ত নোডে, "ব্যবহৃত সকেট" দ্বারা রিপোর্ট করা /proc/net/sockstatসংখ্যা খুব বেশি (স্বাস্থ্যকর নোডে ~ 300 এর পরিবর্তে ~ 4.5k) is পর্যবেক্ষণ দেখায় যে নোড অনুপলব্ধ হয়ে যাওয়ার মুহুর্ত থেকে এই সংখ্যাটি দ্রুত বেড়ে যায়।
মজার বিষয় হ'ল আমরা এই ব্যবহৃত সকেটের উত্স সনাক্ত করতে পারি না:
# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse 0 memory 0
তা ছাড়া মেশিনটি ঠিক আছে বলে মনে হচ্ছে। কোনও সন্দেহজনক প্রক্রিয়া চলছে না, সিপিইউ ব্যবহার ন্যূনতম এবং উপলভ্য মেমরির প্রাপ্যতা রয়েছে।
একই সাবনেটে একটি "অ্যাক্সেসযোগ্য" ভিএম পিং করার ফলে কয়েকটি EAGAINপ্রতিক্রিয়া দেখা যায় recvmsgএবং তারপরে ENOBUFSফিরে আসার পথে অতিক্রম করে sendmsg। স্ট্রেস পিং আউটপুট এখানে
আমি কিছু অতিরিক্ত আউটপুট সংগ্রহ করেছি (সিস্টেমে কোনও পরিবর্তন আনার আগে) এবং এটি এই লিস্টে পোস্ট করেছি: https://gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c
বিশ্লেষণ
ইলাস্টিক অনুসন্ধানটি প্রথম সন্দেহভাজন হিসাবে আমরা সার্ভারে আমরা যা ভাবতে পারি সেগুলি বন্ধ করার চেষ্টা করেছি। তবে স্থিতিস্থাপক যন্ত্রটি বন্ধ করে দেওয়া সকেটগুলি মুক্ত করে না। সমস্ত কোরিওএস-সম্পর্কিত প্রক্রিয়াগুলির জন্য একই জিনিস (আপডেট ইঞ্জিন, লকস্মিথেড, ...) এমনকি পুরো ডকার রানটাইম বা অ্যাজুরি-নির্দিষ্ট স্টাফ। কিছুই বলে মনে হচ্ছে না।
তবে এখন এটি আরও অচল হয়ে পড়েছে: আমরা tcpdumpকী চলছে তা দেখার জন্য মেশিনে চালানোর চেষ্টা করেছি । এবং দেখুন: সমস্যাটি নিজেই সমাধান হয়ে গেছে, সংযোগ পুনরুদ্ধার করা হয়েছিল। আমাদের থিয়োরিটি ছিল যে tcpdump কিছু ধরণের সিস্টস্কেল করে যা এটি সমাধান করে। আমরা gdb দিয়ে tcpdump চালিয়েছিলাম এবং সমস্ত সিস্টেমে ব্রেকপয়েন্টগুলি সেট করেছিলাম। প্রচুর ব্রেকপয়েন্টে পদক্ষেপ নেওয়ার পরে, আমরা শেষ পর্যন্ত দেখতে পেলাম ক্যাপচারিং সকেটে (বিশেষত এই লাইনটি lippcap- এ ) রেফারেন্স মোড স্থাপনের কাজটি এমন জিনিস যা সকেটকে কাউন্টারে পুনরায় সেট করে এবং আমাদের একটি সাধারণ অবস্থায় ফিরিয়ে দেয়।
অতিরিক্ত অনুসন্ধান
- আমরা যাচাই করেছি যে পতাকাটি
tcpdumpনিয়ে চলমান-p/--no-promiscuous-modeব্যবহৃত সকেটগুলি সাফ করে না এবং মেশিনটিকে ব্যবহারযোগ্য স্থানে ফিরিয়ে দেয়। - চলমান সকেটগুলি ব্যবহৃত কাউন্টারে
ifconfig eth0 txqueuelen 1001পুনরায় সেট করে তবে সংযোগটি পুনরুদ্ধার করা যায় না । - প্রমিস্ক মোড ম্যানুয়ালি সেট
ip link set eth0 promisc onকরাও সংযোগটি পুনরুদ্ধার করে না।net.ipv4.xfrm4_gc_thresh32768 এ সেট করা হয়েছে এবং এটি সামান্য বাড়ানো সমস্যার সমাধান করে না।
আমরা আউজুরের সাথে যোগাযোগ করেছি যারা আমাদের মতোই এতে হতবাক হয়। আমি বুঝতে পারি যে এটি সম্ভবত সমস্যা নয় তবে কেবল একটি লক্ষণ। তবে এ পর্যন্ত পাওয়া একমাত্র বাস্তব জিনিস। আমার আশা এই লক্ষণটি বুঝতে পেরে আমি মূল কারণটির আরও কাছে যেতে পারি। এই নেটওয়ার্ক ড্রাইভারের সাথে অ্যাজুরে নেটওয়ার্ক ইন্টারফেসগুলি চালিত হয় ।
CoreOS / কার্নেল এর জন্য দোষী?
সময়রেখার দৃষ্টিকোণ থেকে, সমস্যাগুলি শুরু হয়েছিল 2019-03-11 যা কোরিস সর্বশেষতম সংস্করণে স্বয়ংক্রিয়ভাবে আপডেট হওয়া দিন। রিলিজ নোট অনুসারে , এই আপডেটে 4.15.23 থেকে 4.19.25 পর্যন্ত কার্নেল আপডেট রয়েছে । আমি এখনও চেঞ্জলগগুলি দিয়ে যাচ্ছি সেখানে দেখার জন্য কোনও সমস্যা হতে পারে কিনা তা দেখতে। এখনও অবধি আমি কেবল আবিষ্কার করেছি যে হাইপারভিভ নেটওয়ার্ক ড্রাইভার সাম্প্রতিক মাসগুলিতে বেশ কয়েকটি আপডেট পেয়েছে , যার সবকটিই 4.19.25 এর অংশ বলে মনে হয় না। কোরিওস ৪.১৯.২৫ তে যে প্যাচসেট প্রয়োগ করেছে তা তাত্পর্যপূর্ণ নয় , তবে একটি জাল nf_conntrack_ipv4 মডিউলটি প্রবর্তনকারী প্যাচটি নতুন।
সাহায্য করুন!
এখনও অবধি, আমাদের যে প্রশ্নগুলি রয়েছে সেগুলি নিম্নলিখিত:
এই "সকেটগুলি ব্যবহৃত" মেট্রিককে স্কাইরকেটে কী কারণে হতে পারে? আমি এই মেট্রিকের জন্য কার্নেল উত্সগুলি পড়েছি এবং এটি কেবল কোনও পাল্টা বলে মনে হয় যা আসলে কী ধরণের সকেটগুলি বা সেগুলি কী তৈরি করেছিল সে সম্পর্কে কোনও উল্লেখ নেই।
কেন প্রায় 4.5k এ নম্বর ফ্ল্যাটলাইন করে? কোন সীমা এই কারণ হতে হবে?
কার্নেল 4.14.96 এবং 4.19.25 এর মধ্যে উল্লেখযোগ্য কিছু পরিবর্তন হয়েছে?
কেন
setsockopt()libpcap এ কলটি রাষ্ট্রটিকে পুনরায় সেট করে?
সম্পর্কিত কোরিস বাগ: https://github.com/coreos/bugs/issues/2572
