লিনাক্সে কেন খোলা ফাইলের সংখ্যা সীমিত?


136

এখনই, আমি জানি কীভাবে:

  • প্রক্রিয়া অনুযায়ী উন্মুক্ত ফাইল সীমা সন্ধান করুন: ulimit -n
  • সমস্ত প্রক্রিয়া দ্বারা খোলা ফাইলগুলি গণনা করুন: lsof | wc -l
  • সর্বাধিক অনুমোদিত সংখ্যক উন্মুক্ত ফাইল পান: cat /proc/sys/fs/file-max

আমার প্রশ্ন: লিনাক্সে খোলা ফাইলগুলির সীমা কেন?


2
@ রব কিছুটা গুগল করে দেখতে পেল যে এটি একটি কাঁটাচামচ বোমা , এটি কি ফাইলের সীমাবদ্ধতা ব্যাখ্যা করার জন্য ব্যবহার করা যেতে পারে?
xanpeng

6
ঠিক আছে, প্রক্রিয়া সীমা এবং ফাইল সীমা গুরুত্বপূর্ণ তাই কাঁটাচামচ বোমার মতো জিনিসগুলি সমস্ত ব্যবহারকারীর জন্য কোনও সার্ভার / কম্পিউটার ভাঙবে না, কেবলমাত্র এটি ব্যবহারকারী এবং কেবলমাত্র অস্থায়ীভাবে does অন্যথায়, একটি ভাগ করা সার্ভারের কেউ একটি কাঁটাচামচ সেট আপ করতে পারে এবং এটি কেবল নিজেরাই নয়, সমস্ত ব্যবহারকারীদের জন্য একে সম্পূর্ণভাবে নক করে।
রব

3
খুব সুন্দর কিছু দরকারী কমান্ড যোগফল! : +1:
জোশুয়া পিন্টার

7
@ রব, একটি কাঁটাচামচ বোমার সাথে কিছু করার নেই কারণ ফাইলের সীমাটি প্রক্রিয়া অনুযায়ী এবং আপনি যখনই কাঁটাচামচ করেন তখনই এটি কোনও নতুন ফাইল হ্যান্ডেল খুলবে না।
psusi

উত্তর:


86

কারণটি হ'ল প্রতিটি ওপেন ফাইল পরিচালনা করার জন্য অপারেটিং সিস্টেমে মেমরির প্রয়োজন হয় এবং মেমরিটি একটি সীমাবদ্ধ সংস্থান especially বিশেষত এমবেডেড সিস্টেমে।

রুট ব্যবহারকারী হিসাবে আপনি প্রতি প্রক্রিয়া (মাধ্যমে ulimit -n) এবং প্রতি সিস্টেমের (উদাঃ echo 800000 > /proc/sys/fs/file-max) সর্বাধিক উন্মুক্ত ফাইলের গণনা পরিবর্তন করতে পারেন ।


21
একটি সুরক্ষার কারণও রয়েছে: যদি কোনও সীমা না থাকে, তবে কোনও ব্যবহারকারীল্যান্ড সফ্টওয়্যার সার্ভারটি ডাউন না হওয়া পর্যন্ত অবিরাম ফাইল তৈরি করতে সক্ষম হবে।
কোরেন

15
@ কোরেন এখানে আলোচিত সীমাগুলি কেবল ওপেন ফাইল হ্যান্ডলারের গণনার জন্য। একটি প্রোগ্রাম যেমন ফাইল হ্যান্ডলারগুলিও বন্ধ করতে পারে, এটি উপলব্ধ সমস্ত ডিস্কের স্থান পূর্ণ না হওয়া অবধি এটি যতগুলি ফাইল এবং তার ইচ্ছে মতো বড় আকারের তৈরি করতে পারে। এটি প্রতিরোধ করতে, আপনি ডিস্ক কোটা বা পৃথক পার্টিশন ব্যবহার করতে পারেন। আপনি এই অর্থে সত্য, যে সুরক্ষার একটি দিক সম্পদ ক্লান্তি রোধ করে - এবং এর জন্য সীমাবদ্ধতা রয়েছে।
জোফেল

1
@ জোফেল ধন্যবাদ আমি অনুমান করি যে খোলা ফাইল হ্যান্ডলগুলি স্ট্রাক্ট ফাইলের উদাহরণগুলির দ্বারা উপস্থাপিত হয় এবং এই স্ট্রাক্টটির আকারটি বেশ ছোট (বাইটস স্তর), সুতরাং /.../file-maxযতক্ষণ স্মৃতি ব্যবহৃত না হয় ততক্ষণ আমি কি বেশ বড় মূল্য দিয়ে সেট করতে পারি ?
xanpeng

7
@ এক্স্পেনপেগ আমি কোনও কার্নেল বিশেষজ্ঞ নই, তবে যতদূর আমি দেখতে পাচ্ছি, ডিফল্টটি file-max10 কে কে দ্বারা বিভক্ত র‌্যাম আকার বলে মনে হচ্ছে। ফাইল হ্যান্ডলারের জন্য প্রতি ব্যবহৃত আসল মেমরিটি আরও ছোট হওয়া উচিত ( struct fileকিছু ড্রাইভার নির্ভর মেমরির আকার ) এটি বেশ রক্ষণশীল সীমা বলে মনে হয়।
জোফেল

63

দয়া করে নোট করুন যে lsof | wc -lপ্রচুর অনুলিপি করা এন্ট্রি (ফোরকড প্রসেসগুলি ফাইল হ্যান্ডেলগুলি ভাগ করতে পারে ইত্যাদি) সরবরাহ করতে পারে। এই সংখ্যাটি নির্ধারিত সীমা চেয়ে অনেক বেশি হতে পারে /proc/sys/fs/file-max

লিনাক্স কার্নেলের দৃষ্টিকোণ থেকে খোলার ফাইলগুলির বর্তমান সংখ্যা পেতে, এটি করুন:

cat /proc/sys/fs/file-nr

উদাহরণ: এই সার্ভারটিতে সর্বাধিক 65536 ওপেন ফাইলগুলির মধ্যে 40096 রয়েছে, যদিও lsof অনেক বড় সংখ্যার রিপোর্ট করে:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504

1
যেমন lsofদু'বার বা ততোধিক ফাইলের প্রতিবেদন করা হবে, যেমন /dev/nullআপনি lsof|awk '{print $9}'|sort|uniq|wc -l
এটির

আপনি lsof|awk '!a[$NF]++{c++}END{print c}'খোলার ফাইলগুলির নন-অনুলিপি গণনা পেতে ব্যবহার করতে পারেন ।
পি ....

18

আমি মনে করি এটি মূলত historicalতিহাসিক কারণে।

একটি ইউনিক্স ফাইল বর্ণনাকারী একটি ছোট intমান, মতো কাজগুলির দ্বারা ফিরে openএবং creat, এবং প্রেরণ read, write, close, এবং তাই ঘোষণা।

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

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


1
20 ভাষা সি ফাইল ফাইল স্ট্রাকচারের জন্য সোলারিস সীমা ছিল। ফাইল হ্যান্ডেল গণনা সর্বদা বড় ছিল।
লোথার

@ লোথার: আকর্ষণীয়। আমি ভাবছি কেন সীমাটি পৃথক হবে। প্রদত্ত filenoএবং fdopenকার্যাদি আমি তাদের প্রায় বিনিময়যোগ্য হতে পারে বলে আশা করি।
কিথ থম্পসন

একটি ইউনিক্স ফাইল কেবলমাত্র ফাইল হ্যান্ডেল (ইন্ট) প্রত্যাবর্তনের চেয়ে বেশি। এখানে ডিস্ক বাফার এবং একটি ফাইল নিয়ন্ত্রণ ব্লক রয়েছে যা বর্তমান ফাইল অফসেট, ফাইলের মালিক, অনুমতি,
ইনোড

@ চককোট্রিল: হ্যাঁ, অবশ্যই কিন্তু যে ধরনের বেশিরভাগ তথ্য একটি ফাইল একটি মাধ্যমে অ্যাক্সেস করা আছে কিনা সংরক্ষণ করা করেছে intবর্ণনাকারী বা FILE*। যদি আপনার 20 টিরও বেশি ফাইল খোলা থাকে open()তবে তা fdopen()ব্যর্থ হবে?
কীথ থমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.