CoreOS: tcpdump রহস্যজনকভাবে নেটওয়ার্ক সমস্যা সমাধান করে (সকেটের অতিরিক্ত সংখ্যক ব্যবহৃত)


14

আমি আজ আপনার জন্য একটি রহস্য পেয়েছি। আমরা একটি ছোট, তিনটি নোড ইলাস্টিকসার্চ ক্লাস্টার অ্যাওরেতে কোরিওএস (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_thresh 32768 এ সেট করা হয়েছে এবং এটি সামান্য বাড়ানো সমস্যার সমাধান করে না।

সকেট ব্যবহৃত

আমরা আউজুরের সাথে যোগাযোগ করেছি যারা আমাদের মতোই এতে হতবাক হয়। আমি বুঝতে পারি যে এটি সম্ভবত সমস্যা নয় তবে কেবল একটি লক্ষণ। তবে এ পর্যন্ত পাওয়া একমাত্র বাস্তব জিনিস। আমার আশা এই লক্ষণটি বুঝতে পেরে আমি মূল কারণটির আরও কাছে যেতে পারি। এই নেটওয়ার্ক ড্রাইভারের সাথে অ্যাজুরে নেটওয়ার্ক ইন্টারফেসগুলি চালিত হয় ।

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


খোলা সকেটগুলি ফলস্বরূপ সমস্যা, মূল সমস্যা নয় আইএমএইচও। ব্রিজ ডিভাইসে ম্যাকভ্লান ডিভাইসগুলি (তাদের নিজস্ব ম্যাক ঠিকানা সহ) একটি লিনাক্স সিস্টেমে আমার এই আচরণ ছিল। ব্রিজটি প্রমিসে সেট করা ম্যাকভ্লান ডিভাইসগুলির কাজ করে। আমি কোরোস বা অ্যাজুরি জানি না। সমস্যাটি হ'ল একটি অন্তর্নিহিত স্তর উপরের স্তরের ম্যাক ঠিকানাগুলি সম্পর্কে জানে না।
AndreasM

আপনার মন্তব্যের জন্য ধন্যবাদ! আমি বুঝতে পেরেছি যে প্রচুর পরিমাণে সকেট ব্যবহার করা হচ্ছে তার মূল কারণ নয়, আমি কেবল একটি মূর্ত জিনিসকে আঁকড়ে ধরেছি যা আমি মেশিনে অস্বাভাবিক হিসাবে চিহ্নিত করতে পারি।
স্টিফান ক্লেইন

হাই স্টিফান কোন খবর? দয়া করে প্রতিবেদন করুন 1) ডাব্লুএলএল সক্ষম আছে? 2) সিসটেল-ওয়ে নেট.ipv4.route.flush = 1 সমাধান করে? 3) কোন কর্মক্ষম অবস্থায় আরপ ক্যাশে কি? কর্মরত অবস্থায়?
ম্যাসিমো

উত্তর:


4

প্রথমত, খুব ভাল লিখিত প্রশ্নের জন্য আপনাকে ধন্যবাদ!

আপনার বর্ণিত বিশদের স্তরটি যেহেতু অত্যন্ত উচ্চ এবং আপনি ইতিমধ্যে জিডিবি স্তরে রয়েছেন, তাই আমি ধরে নিয়েছি আমার উত্তরটি আপনার পক্ষে বেশি ব্যবহার হবে না। যাইহোক, এখানে চেষ্টা করুন:

  • সম্ভবত আপনি ইতিমধ্যে ভালো কিছু চেষ্টা ss -aeএবং lsof -n?
  • কি dmesgরিটার্ন আগ্রহের কিছু এই ঘটবে?
  • আপনি কি সার্ভারে iptables ব্যবহার করেন?
  • আপনি যদি টিসিপিডাম্প (বলুন ip link set [interface] promisc on) বাদে অন্য কোনও উপায়ে ব্যবহার করে প্রমিসিউস মোডটি সেট করেন , এটি কি সমস্যার সমাধান করে?
  • আপনি কি কোনও সন্দেহজনক প্রক্রিয়া, ফাইল বা অন্যান্য অদ্ভুত ক্রিয়াকলাপ পরীক্ষা করেছেন? কেবল এই ভেবে যে হয়ত কিছু অবাঞ্ছিত কদর্য প্রক্রিয়া ছায়ায় নিজেকে লুকিয়ে রাখছে, এবং যখনই প্রমিসিউস মোড সেট করা থাকে তখন চুপ করে যায়?
  • আপনি যদি tcpdump চলমান পটভূমি ছেড়ে যান, এই সমস্যাটি কি ফিরে আসবে?

আশা করি এটা কাজে লাগবে.


1
ধন্যবাদ তোমার উত্তরের জন্য! আপনি উল্লেখ করেছেন এমন কয়েকটি কমান্ডের ফলাফল আমি সংগ্রহ করেছি। তারা এখন ( gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c ) প্রশ্নের সাথে যুক্তও রয়েছে । অদ্ভুত জিনিস যে ভাবে পাবেন কম সকেট রিপোর্ট থেকে ss, lsofএবং netstatমধ্যে "ব্যবহৃত সকেট" থেকে চেয়ে /proc/net/sockstat। কেবলমাত্র মোট গণনা (যা কেবলমাত্র সেই ফাইলটি থেকে পড়ে মনে হয়) একই। iptablesরান করে তবে বিশেষ নিয়ম নেই (সংক্ষিপ্ত বিবরণ দেখুন), আমি নিজেই প্রম্পিস মোড সেট করার চেষ্টা করিনি বা ক্রমাগত tcpdump চালানোর চেষ্টা করিনি। পরের বার করতে হবে।
স্টিফান ক্লেইন

আমি ss -aepiআমার আউটপুট সংগ্রহে আউটপুট যুক্ত করেছি: gist.github.com/privatwolke/… - দুঃখজনকভাবে ডেমসগ যখন ঘটছে তখন ঠিক কিছুই দেয় না। আসলে ঘটনার আগের সর্বশেষ প্রবেশ 5 দিনের পুরনো।
স্টিফান ক্লেইন

যোগ করা হয়েছে dmesg / journalctl -kআউটপুট।
স্টিফান ক্লেইন

আমি যাচাই করেছি যে ip link set eth0 promisc onএকা মেশিনকে ব্যবহারের যোগ্য অবস্থায় ফিরিয়ে দেয় না।
স্টিফান ক্লেইন

হ্যালো, আপনি কি এই সাইটে এই অন্যান্য প্রশ্ন তাকান? serverfault.com/questions/614453/… মনে হচ্ছে আপনি xfrm4 ডেস্ট ক্যাশেটি অপসারণ করছেন। আপনি এই কার্নেল সেটিংসের সাহায্যে এটি বাড়িয়ে তুলতে পারেন: xfrm4_gc_thresh - INTEGER The threshold at which we will start garbage collecting for IPv4 destination cache entries. At twice this value the system will refuse new allocations. আমি যতদূর বলতে পারি এটি আইপ্যাকের সাথে সম্পর্কিত, যা আপনি এখানে চালাচ্ছেন বলে মনে হয় না।
পেড্রো পেরেজ 13

0

লিনাক্স কার্নেলের hv_netsvc ড্রাইভারের বাগের ফলে এটি ঘটেছিল। আমরা এটি একটি মাইক্রোসফ্ট বিকাশকারীকে দিয়ে সমাধান করতে পারতাম এবং প্রবাহটিকে ঠিকঠাক করে প্রবাহিত করতে পারি।

আমি এখানে প্রতিশ্রুতি বার্তাটি উদ্ধৃত করব কারণ এতে সমস্যাটি যথেষ্ট ভালভাবে যুক্ত হয়েছে:

আরএক্স সমাপ্তির বার্তার কারণে যখন রিং বাফারটি প্রায় পূর্ণ হয়ে যায়, তখন একটি টিএক্স প্যাকেট "লো ওয়াটারমার্ক" এ পৌঁছায় এবং সারিটি থামিয়ে দিতে পারে। টিএক্স সমাপ্তি যদি সারি থামার চেয়ে আগে উপস্থিত হয়, তবে ওয়েকআপটি মিস হয়ে যেতে পারে।

এই প্যাচটি শেষ মুলতুবি প্যাকেটের জন্য EAGAIN এবং সাফল্যের উভয় ক্ষেত্রেই আবরণে চেক সরিয়ে নিয়েছে, সুতরাং প্রয়োজনীয় হলে কাত নির্ভরযোগ্যভাবে জাগবে।

ভবিষ্যতের রেফারেন্সের জন্য, যে প্রতিশ্রুতি এটি সমাধান করে তা হ'ল https://github.com/torvalds/linux/commit/6d9cfab853ca60b2f77b5e4c40443216988cba1f

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