"এলএস" এর চেয়ে "এলএস *" এত বেশি সময় নেয় কেন?


28

আমার একটি ডিরেক্টরিতে বেশ কয়েকটি ফাইল রয়েছে:

$ ls | wc -l
9376

কেহ ব্যাখ্যা করতে পারেন কেন এই ধরনের ব্যবহার করে বিপুল সময় পার্থক্য আছে ls *এবং ls?

$ time ls > /dev/null
real    0m0.118s
user    0m0.106s
sys     0m0.011s

এবং

$ time ls * > /dev/null
real    1m32.602s
user    0m0.233s
sys     0m0.438s

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

সম্পাদনা করুন:

$ time ls -l > /dev/null
real    0m58.772s
user    0m0.113s
sys     0m0.452s
$ time ls -l * > /dev/null
real    1m19.538s
user    0m0.252s
sys     0m0.461s

এবং আমার যুক্ত করা উচিত যে আমার উদাহরণে কোনও উপ ডিরেক্টরি নেই:

$ diff <(ls) <(ls *)
$

উত্তর:


47

আপনি যখন lsতর্ক ছাড়াই চালান , এটি কেবল একটি ডিরেক্টরি খুলবে, সমস্ত বিষয়বস্তু পড়বে, সেগুলি বাছাই করে প্রিন্ট আউট করবে।

আপনি যখন চালনা করেন ls *, প্রথমে শেলটি প্রসারিত হয় *, যা কার্যকরভাবে একইভাবে কার্যকর যা একই রকম lsহয়েছিল, বর্তমান ডিরেক্টরি এবং কলগুলির সমস্ত ফাইল দিয়ে একটি আর্গুমেন্ট ভেক্টর তৈরি করে lslsতারপরে সেই আর্গুমেন্ট ভেক্টর এবং প্রতিটি access(2)তর্কটির জন্য প্রক্রিয়া করতে হবে এবং তার অস্তিত্ব পরীক্ষা করার জন্য ফাইলটি কল করে। তারপরে এটি প্রথম (সাধারণ) হিসাবে একই আউটপুট প্রিন্ট করবে ls। বড় আর্গুমেন্ট ভেক্টর এবং শেলের উভয় শেল প্রসেসিংয়ে lsসম্ভবত ছোট ব্লকের প্রচুর মেমরি বরাদ্দ থাকবে, এতে কিছুটা সময় নিতে পারে। যাইহোক, যেহেতু ছোট ছিলাম sysএবং userসময় কিন্তু অনেকটা realসময়, অধিকাংশ সময় ডিস্ক জন্য অপেক্ষা বদলে CPU- র ব্যবহার মেমরি অ্যালোকেশন করছেন অতিবাহিত করা হত।

প্রতিটি কল করতে access(2)অনুমতি সম্পর্কিত তথ্য পেতে ফাইলের ইনোডটি পড়তে হবে। এর অর্থ কেবল একটি ডিরেক্টরি পড়ার চেয়ে অনেক বেশি ডিস্ক পড়ে এবং সন্ধান করে। আপনার জিপিএফএসে এই অপারেশনগুলি কতটা ব্যয়বহুল তা আমি জানি না, তবে যে তুলনাটি আপনি দেখিয়েছেন ls -lযা ওয়াইল্ডকার্ডের ক্ষেত্রে একই রকম রান সময় রয়েছে, তাই ইনোডের তথ্য পুনরুদ্ধার করার জন্য প্রয়োজনীয় সময়টি প্রাধান্য পেয়েছে বলে মনে হয়। জিপিএফএসের প্রতিটি পঠন ক্রিয়াকলাপে আপনার স্থানীয় ফাইল সিস্টেমের তুলনায় কিছুটা বেশি বিলম্ব থাকলে, আমরা আশা করব যে এই ক্ষেত্রে এটি আরও প্রকট হবে।

ওয়াইল্ডকার্ড কেস এবং ls -l50% এর মধ্যে পার্থক্যটি ডিস্কে ইনোডের ক্রম দ্বারা ব্যাখ্যা করা যেতে পারে। ডিরেক্টরিতে ফাইলের নাম এবং ls -lস্ট্যাট (2) বাছাইয়ের আগে ডিরেক্টরি অনুসারে ফাইলগুলি সম্পাদনা করলে আইওডগুলি ক্রমান্বয়ে বিছানো হয় , ls -lসম্ভবত বেশিরভাগ ইনোডগুলি একটি ঝাড়ুতে পড়তে পারে। ওয়াইল্ডকার্ডের সাহায্যে শেল ফাইলের নামগুলি পাসের আগে বাছাই করবে ls, সুতরাং lsসম্ভবত আরও একটি ডিস্কে ইনোডগুলি পড়বে, আরও বেশি ডিস্কের মাথা গতি যুক্ত করবে।

এটি লক্ষ্য করা উচিত যে আপনার timeআউটপুটটিতে শেল দ্বারা ওয়াইল্ডকার্ড প্রসারিত করার সময়টি অন্তর্ভুক্ত করবে না।

আপনি যদি সত্যিই যা দেখতে চান তা দেখতে, ব্যবহার করুন strace(1):

strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *

এবং প্রতিটি ক্ষেত্রে কোন সিস্টেম কলগুলি করা হচ্ছে তা দেখুন।

Actually আমি access(2)আসলে জানি না বা অন্য কিছু যেমন ব্যবহার করা হয় তা জানি না stat(2)। তবে উভয়টিরই সম্ভবত একটি ইনোড সন্ধানের প্রয়োজন (আমি নিশ্চিত নই যে access(file, 0)কোনও ইনোড লুকোপসাইকে বাইপাস করা উচিত কিনা ))


2
ভাল উত্তর, আমি শুধু সম্পর্কে একটি অনুরূপ এক :) পোষ্ট করতে ছিল তবে হাঁ, এই সঠিক, এটা সব looping মধ্যে দক্ষতাসম্পন্ন সম্পর্কে, সাথে lsএটা ঠিক ফাইল সিস্টেম "কি জন্য inode সন্তান অনুরোধ করতে পারেন pwdযেখানে সঙ্গে হিসাবে" ls *এটি জিজ্ঞাসা করতে হবে "ইনোডের বাচ্চারা (এবং ফাইলটি কী) a" এর পরে বি, সি, ডি ইত্যাদি রয়েছে etc.
এনজে

@ এনজে একটি ক্যোয়ারী বনাম অনেকগুলি এখন পর্যন্ত ভাল সংক্ষিপ্তসার। @ ক্যাম: বিস্তারিত উত্তরের জন্য ধন্যবাদ। আমি ls -lপাশাপাশি আউটপুট পোস্ট করেছি (এখনও প্রায় 30 সেকেন্ড কম ls *)
সেবাস্তিয়ান

@ সেবাস্তিয়ান যেমন কাম বলেছেন, টাইমস্ট্যাম্পস / মালিকের তথ্য / অনুমতি ইত্যাদি সম্পর্কে তথ্য পেতে প্রতিটি ফাইলের যত ls -lবেশি সময় লাগবেlsstat(2)
এনজে

6
ভুলে যাবেন না, বর্তমান ডিরেক্টরিতে সমস্ত এন্ট্রিগুলিতে *গ্লোবস যা কোনও পিরিয়ড দিয়ে শুরু হয় না - উপ-ডিরেক্টরিগুলির নাম সহ। যা তখন 'এড' হবে । ls
শাদুর

@camh: আমি একটি বিট আরো পরীক্ষিত (আমার সম্পাদনাগুলি দেখুন) এবং যে পাওয়া গেছে: ls< ls -l< ls -l *< ls *(আমি সবসময় এটা তিনবার দৌড়ে)। আপনার ব্যাখ্যার সাথে, আমি কেন বুঝতে পারছি না যে ls -l *তার চেয়ে দ্রুত কেনls *
সেবাস্তিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.