সকেটগুলি lsof দ্বারা পাওয়া গেছে তবে নেটস্ট্যাট দ্বারা নয়


19

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা স্পষ্টতই সকেট খোলার মাধ্যমে ফাইল বর্ণনাকারীর বাইরে চলেছে, তবে এই সকেটগুলি ঠিক কী করে তা আমি খুঁজে পাই না। এগুলি lsof আউটপুট হিসাবে প্রদর্শিত হবে

java    9689 appuser 1010u  sock       0,5          263746675 can't identify protocol
java    9689 appuser 1011u  sock       0,5          263746676 can't identify protocol
java    9689 appuser 1012u  sock       0,5          263746677 can't identify protocol
java    9689 appuser 1014u  sock       0,5          263746678 can't identify protocol
java    9689 appuser 1015u  sock       0,5          263746679 can't identify protocol
java    9689 appuser 1016u  sock       0,5          263746681 can't identify protocol

এবং / proc / $ পিআইডি / এফডি হিসাবে

lrwx------ 1 appuser appuser 64 Jun 23 11:49 990 -> socket:[263732085]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 991 -> socket:[263732086]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 992 -> socket:[263735307]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 993 -> socket:[263732088]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 995 -> socket:[263735308]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 996 -> socket:[263735309]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 997 -> socket:[263745434]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 998 -> socket:[263745435]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 999 -> socket:[263745436]

তবে এর মধ্যে কোনও মিল নেই netstat -a

এই সকেটগুলি কী এবং কীভাবে তারা কী করে তা আমি জানতে পারি?

সম্পাদনা : আমি lsof এফএকিউতে grep $SOCKET /proc/netপ্রস্তাবিত হিসাবে দৌড়ানোর চেষ্টা করেছি , যেখানে OC সোকেট উদাহরণস্বরূপ 263746679, কিন্তু এটির কোনও ফলও হয়নি results


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


আমরা আমাদের একটি .NET কোর ওয়েব অ্যাপস (কেস্ট্রল সহ উবুন্টু সার্ভার) দিয়ে সম্প্রতি এই সমস্যার মুখোমুখি হয়েছি, তবে রেকর্ড করা ডিভাইসটি "প্রোটোকল: টিসিপি" নামযুক্ত "0,9" is 0 এবং 9 এর ডিভাইসগুলি ঠিক কী তা জানার চেষ্টা করা কঠিন প্রমাণিত হয়েছে। তবে লক্ষণগুলি সমস্তরকম মনে হয় যেমন সকেটগুলি বাঁধাই না করে এবং ব্যবহার না করে খোলার ক্ষেত্রে একই রকম।
আইসলেভা

উত্তর:


17

আপনি যদি কোনও সকেট তৈরি করেন তবে এটি ঘটতে পারে তবে এর সাথে কখনও সংযুক্ত () বা বাঁধুন না। আপনার সেরা বাজি অ্যাপ্লিকেশনটি স্ট্রেস (-fF) করা এবং তারপরে কোন সকেটগুলি সমস্যা সৃষ্টি করছে তা নির্ধারণের জন্য lsof এর আউটপুট সহ ক্রস-রেফারেন্স হতে পারে। ডিবাগিংয়ের বোনাস পদ্ধতি হিসাবে: আপনি যদি আপনার সকেট কলগুলি ডিবাগিং তথ্যের সাথে গুটিয়ে রাখেন এবং সেগুলিকে / dev / নালটিতে লিখে রাখেন তবে এটি আপনাকে হাসি-উত্সব-লগ ফাইলগুলি না দিয়ে স্ট্রেসে উপস্থিত হবে।


ধন্যবাদ, এটি আকর্ষণীয় মনে হচ্ছে। আমি যদি আমাদের আবেদনের ক্ষেত্রে সত্যই এটি ঘটে থাকে তা জানার চেষ্টা করব।
রবার্ট মুন্তানু

1
কিছুটা একই লাইন বরাবর, কারণ এটি জাভা স্ট্রেস ব্যবহার করা খুব কঠিন হতে পারে; আপনার নিজের সকেট সাবক্লাস তৈরি করা আরও ভাল পদ্ধতি হতে পারে যা প্যারেন্ট (রিয়েল) জেডিকে সকেটে পাস করার আগে তথ্য লগ করে। স্ট্রেস কেবল ওএস-তে অন্তর্নিহিত জাভা কলগুলি দেখতে পাবে এবং আপনার থ্রেডের অভ্যন্তরে দেখতে পাচ্ছে না যে আসলে actually সকেট কলগুলি কী করছে, এটি স্ট্রেস করার জন্য কেবল জাভাটির একটি বড় বলের মতো দেখাচ্ছে।
ট্রয়ঞ্জেল

@ ট্রাইয়েঞ্জেল: আমি (পুনরায়) বাইটম্যান ( jboss.org/byteman ) একটি খুব সুন্দর সরঞ্জাম আবিষ্কার করেছি যা আমাকে এই কলগুলি সনাক্ত করতে প্রয়োজনীয় বাইকোড ইনজেক্ট করতে সহায়তা করে।
রবার্ট মুন্তানু

সর্বাধিক দরকারী উত্তর, সুতরাং এটি অনুগ্রহ লাভ করে। ধন্যবাদ!
রবার্ট মুন্তানু

2

পাইথন ব্যবহার করে, এসএসএল সকেটে আমি একই সমস্যার মুখোমুখি হয়েছি:

  • আমি যখন সকেট.ক্লোজ () ব্যবহার করি, সকেটটি অনির্দিষ্ট সময়ের জন্য CLOSE_WAIT অবস্থায় থাকে
  • আমি যখন সকেট.শটডাউন () ব্যবহার করি তখন lsof "প্রোটোকল সনাক্ত করতে পারে না" বলে

সমাধানটি হ'ল এসএসএল স্তরটি বন্ধ করার আগে আনপ্রেপ করা ছিল:

  • অরিগসক = সকেট.অনরপ ()
  • origsock.close ()

এটি আমার অ্যাপে সকেটগুলি সঠিকভাবে বন্ধ করে দেয়।


1

আপনার ফাইলের বর্ণনাকারীর সীমাটি যদি আমি প্রথমে করতাম তবে তা অন্তর্ভুক্ত করা উচিত:

~# vi /etc/sysctl.conf
fs.file-max = 331287

পরবর্তী আমি নিশ্চিত করব যে আপনার সিস্টেমটি আপ টু ডেট রয়েছে, এতে সমস্ত গ্রন্থাগার এবং সার্ভার অন্তর্ভুক্ত রয়েছে। এটি সম্ভব যে আপনার জাভা অ্যাপ্লিকেশন সার্ভারটির মেয়াদ শেষ হয়ে গেছে (যদি আপনি এটি ব্যবহার করে থাকেন)। এটিরও একটি সম্ভাবনা যে আপনার অ্যাপ্লিকেশন সার্ভারটি ভুল কনফিগার করা হয়েছে, আপনার কনফিগারেশন ফাইলটি দেখে আপনার connectionTimeoutএবং / অথবা আপনার maxKeepAliveRequests( আপনার অ্যাপ্লিকেশন সার্ভারটি কী ব্যবহার করছে বা আপনি যদি কোনওটি ব্যবহার করছেন তবে আমি নিশ্চিত নই ...)।

এই অ্যাপ্লিকেশনটি কী করে তা আমি নিশ্চিত নই, তবে আপনি যদি মনে করেন না যে এটির জন্য কয়েক হাজার সকেটের প্রয়োজন হয় তবে এটি আপনার জাভা অ্যাপ্লিকেশনটিতে অবশ্যই একটি "ফাইল বর্ণনাকারী ফাঁস" । আপনাকে বিক্রেতার কাছে বাগ রিপোর্ট পাঠাতে হতে পারে। এই বাগের প্রতিবেদনে আপনার সমস্যাটি কীভাবে পুনরায় তৈরি করবেন সে সম্পর্কে তথ্য অন্তর্ভুক্ত করা উচিত।

সমস্যাটি ডিবাগ করার কয়েকটি উপায় এখানে রয়েছে।

এই সকেটগুলি কীভাবে ব্যবহৃত হচ্ছে তা দেখার জন্য ওয়ায়ারশার্ক (বা ক্লায়ারের জন্য twireshark) সেরা সরঞ্জাম। ওয়্যারশার্ক আপনাকে তারের উপর দিয়ে ফেলে দেওয়া ধরণের ট্র্যাফিকের বিরতি দেবে। এটি সম্ভবত প্রথম কয়েকটি সংযোগ সফল হবে এবং তারপরে এটি ফাইল বর্ণনাকারীর সীমাতে আঘাত হানবে। একবার ফাইল বর্ণনাকারী সীমাটি আঘাত হ'ল তারপরে ওয়্যারশার্ক কোনও কিছু বাছাই করতে যাচ্ছে না (এবং এই বিষয়টির জন্য আরও সুন্দর নেটস্ট্যাট), তবে এটি সমস্যাটি সঙ্কুচিত করতে সহায়তা করবে। সম্ভবত অনেকগুলি বহির্গামী এসওয়াইএন প্রেরণ করা হচ্ছে এমন ক্ষেত্রে, তবে কোনও এসওয়াইএন / এসি কে পাওয়া যাচ্ছে না এইভাবে অনেকগুলি টিসিপি সংযোগ কেবলমাত্র SYN_WAIT অবস্থায় আটকে আছে।

যদি আপনার সোর্স কোডটিতে অ্যাক্সেস থাকে এবং আপনি কীভাবে সকেট তৈরি হচ্ছে তা জানেন (যেমন স্ট্রেস ব্যবহার করে বা কেবল কোড সন্ধান করা) তবে আপনি প্রকল্পটি Eclipse (বা অন্য কোনও IDE) এ খুলতে পারেন এবং ফাংশনটিতে একটি ব্রেক পয়েন্ট সেট করতে পারেন যা এই সকেট তৈরি করছে। ব্রেকপয়েন্টটি যখন আঘাত হানে তখন আপনি স্ট্যাক ট্রেসটি দেখতে পারেন। এই ফাইল বিবরণকারী ফাঁস হতে পারে একটি সাধারণ অসীম লুপ বা সম্ভবত সকেটের সময়সীমা মান খুব বড়। আর একটি সম্ভাবনা হ'ল জাভা অ্যাপ্লিকেশনগুলি socket.close()সংযোগগুলি পরিষ্কার করার জন্য কোনও কাজ করছে না । ঘনিষ্ঠভাবে কাজ করা সাধারণত একটি finelyব্লকের মধ্যে করা হয় try/catch(হ্যাঁ একটি সকেটের অবশ্যই জাভাতে সর্বদা চেষ্টা / ধরা থাকতে হবে বা এটি তৈরি করবে না)। দিনের শেষে সম্ভবত সম্ভবত জাভা অ্যাপ্লিকেশনটি তার আইওএক্সেপশন সঠিকভাবে পরিচালনা করছে না।


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

@ রবার্ট মুন্তানু আপনি যদি এই অ্যাপটি তৈরি করে থাকেন তবে এটি স্ট্যাকওভারফ্লোয়ের জন্য প্রশ্ন। আপনি যত বেশি সকেট খুলছেন তা কখনই কম নয়।
দাড়কাক

রুক: আমি কোড-ভিত্তিক এটি খুঁজে বের করে দিয়েছি এবং এটি সিসাদমিন হিসাবে আবিষ্কার করার চেষ্টা করেছি tried এজন্য আমি এসএফ-এ পোস্ট করেছি। এবং হ্যাঁ, আমি জানি কোনওভাবে অনেক বেশি সকেট খোলা রয়েছে। তবে কোথায় আছে শূন্য সূত্র রয়েছে ...
রবার্ট মুন্তানু

@ রবার্ট মুন্তানু আপনাকে সকেট তৈরির উপর ব্রেক পয়েন্ট সেট করতে হবে এবং সেই সময়ে স্ট্যাক ট্রেস এবং মেমোরিটি দেখতে হবে। আমি সন্দেহ করি আপনি একটি অসীম লুপে পড়ছেন। আপনার কোডটি এই জাতীয় জটিল সমস্যার জন্য সর্বোত্তম পদ্ধতির হতে চলেছে যদিও কোনও ভেরিয়েবল এবং পদক্ষেপটি দেখতে সক্ষম হচ্ছেন।
দাড়কাক

দুর্ভাগ্যক্রমে দুর্ভাগ্যক্রমে এটি 20 সার্ভারগুলির মধ্যে একটিতে আপাতদৃষ্টিতে এলোমেলো হয়ে যায় - সর্বদা এক নয় - কেবল উত্পাদন পরিবেশে, এবং সম্ভবত প্রতি সপ্তাহে দু'বার। নাহলে আউট আউট করা বরং সহজ হত। সকেট তৈরি / বাঁধাই / সংযোগ / বন্ধ কলগুলি ট্র্যাক করতে আমি বর্তমানে বাইটম্যান ( jboss.org/byteman ) ব্যবহার করছি । আশা করি এর থেকে কিছু বেরিয়ে আসবে।
রবার্ট মুন্তানু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.