ডিরেক্টরিটিকে সর্বদা ক্যাশে থাকতে বাধ্য করুন


35

আমার সম্পূর্ণ সি ++ প্রকল্পের সংকলন করতে সময়টি আরও উন্নত করতে আমি বিভিন্ন পদ্ধতি পরীক্ষা করে দেখছি। বর্তমানে এটি ~ 5 মিনিট সময় নেয়। আমি ডিসটিসি, সিসিচি এবং অন্যান্যদের সাথে পরীক্ষা করেছিলাম। সম্প্রতি, আমি আবিষ্কার করেছি যে আমি যদি আমার পুরো প্রকল্পটি কোনও র‌্যাম-ড্রাইভে অনুলিপি করি এবং সেখান থেকে সংকলন করি তবে এটি সংকলনের সময়টিকে তার মূলের 30% পর্যন্ত নামিয়ে ফেলবে - মাত্র 1.5 মিনিটের মধ্যে।

স্পষ্টতই, র‌্যাম ড্রাইভ থেকে কাজ করা ব্যবহারিক নয়। সুতরাং, আমি ওএসকে সর্বদা নির্দিষ্ট ডিরেক্টরি ক্যাশে রাখতে বাধ্য করতে পারি এমন কোনও উপায় কি কেউ জানেন ? আমি এখনও ডিরেক্টরিটি স্বাভাবিকের মতো ডিস্কে আবার সিঙ্ক করতে চাই, তবে আমি সবসময় মেমরির মধ্যেও ডেটার একটি অনুলিপি চাই। এটা কি সম্ভব?

সম্পাদনা: একটি সম্ভাব্য সমাধান হিসাবে, আমরা কেবল একটি ডিমন চালু করার কথা চিন্তা করেছি যা rsyncপ্রতি 10 সেকেন্ড বা তারপরে র‌্যাম ড্রাইভের সাথে ডিস্ক ড্রাইভ সিঙ্ক করতে চালিত হয়। তারপরে আমরা র‌্যাম ড্রাইভ থেকে সংকলনটি চালাচ্ছি। rsyncফাস্ট গন্গনে করা হয়, কিন্তু এই সত্যিই কাজ করবে? অবশ্যই ওএস আরও ভাল করতে পারে ....


Tmpfs এবং ext3 / 4 এর মধ্যে ক্যাশে কেবল পার্থক্য নয়; তাদের জার্নালিং রয়েছে, উদাহরণস্বরূপ, যা ক্যাশে নির্বিশেষে লেখা হবে।
আন্দ্রে পরমস

1
আপনি কি আমাদের timeসংকলন করে ফলাফলটি আমাদের সাথে ভাগ করে নিতে পারেন? এটি কিছু উত্থাপনকারী বিতর্ক দূর করবে। make clean && /usr/bin/time -v make( timeকমান্ডে নির্মিত ব্যাশ ব্যবহার করবেন না )
শেলহোলিক

1
@ She বাশের বিল্ট-ইন কমান্ড কেন নয়?
tshepang

3
@ শেপাপাং timeবিল্ট ইন ব্যাশ ( help time) এর আইএন man time/ ও, প্রসঙ্গে, সুইচগুলি সম্পর্কিত জিএনইউ সময় ( ) এর চেয়ে অনেক কম বিশদ (কোনও ভার্বোজের বিকল্প নেই) রয়েছে ...
শেলহোলিক

উত্তর:


18

ক্যাশে ফাইলের একগুচ্ছ রাখার সুস্পষ্ট উপায় হ'ল প্রায়শই এটি অ্যাক্সেস করা। লিনাক্স অদলবদল এবং ক্যাশিংয়ের মধ্যে সালিশ করার ক্ষেত্রে বেশ ভাল, তাই আমি সন্দেহ করি যে আপনি যে গতির পার্থক্যটি লক্ষ্য করছেন তা আসলে ওএসকে ক্যাশে রাখে না, তবে tmpfs ব্যবহার এবং আপনার অন্যান্য প্রচেষ্টার মধ্যে কিছু অন্য পার্থক্য রয়েছে।

প্রতিটি ক্ষেত্রে আইও কী করছে তা পর্যালোচনা করার চেষ্টা করুন। এটির জন্য প্রাথমিক সরঞ্জাম iotop। অন্যান্য সরঞ্জামগুলি কার্যকর হতে পারে; দেখতে লিনাক্স ডিস্ক আই লোড ভাঙ্গন, ফাইলসিস্টেম পাথ এবং / অথবা প্রক্রিয়া দ্বারা? , লিনাক্সের কোন প্রোগ্রাম সময়ের সাথে I / O পরিমাপ করতে পারে? , এবং অন্যান্য থ্রেড সার্ভার ফল্ট এ।

এখানে কী ঘটতে পারে সে সম্পর্কে কয়েকটি অনুমান দেওয়া আছে। আপনি যদি পরিমাপ নেন তবে দয়া করে সেগুলি দেখান যাতে আমরা এই অনুমানগুলি নিশ্চিত বা অস্বীকার করতে পারি।

  • আপনার যদি ফাইল অ্যাক্সেসের সময়গুলি চালু থাকে তবে ওএস এই অ্যাক্সেসের সময়গুলি লেখার জন্য বেশ কিছুটা সময় নষ্ট করতে পারে। সংকলন গাছের জন্য অ্যাক্সেসের সময়গুলি অকেজো, সুতরাং তা নিশ্চিত করুন যে সেগুলি noatimeমাউন্ট বিকল্পটি বন্ধ করে দিয়েছে । আপনার tmpfs + rsync সমাধানটি হার্ড ডিস্ক থেকে কখনই পড়ে না , তাই এটিতে সময় লেখার জন্য অতিরিক্ত সময় ব্যয় করতে হবে না।
  • যদি লেখকগুলি সিঙ্ক্রোনাইজ হয়, হয় সংকলক কলগুলির sync()কারণে বা কার্নেল ঘন ঘন তার আউটপুট বাফারগুলি ফ্লাশ করে, লেখাগুলি tmpfs এর চেয়ে হার্ড ডিস্কে বেশি সময় নেয়।

আমারও এই অনুভূতি আছে। সংকলন সিপিইউ নিবিড়, আইও এর চেয়ে বেশি।
ফুনেহে

হুম, আমি এখানে জারডিসির একটি মন্তব্য গিলস অনুমানকে নিশ্চিত বা অস্বীকার করে দেখতে চাই। 1.5 বনাম 5 মিনিট বেশ বড় পার্থক্য ...
ড্যানিয়েল অ্যাল্ডার

8

ডিফল্টরূপে লিনাক্স র‌্যামকে ডিস্ক ক্যাশে হিসাবে ব্যবহার করে। একটি প্রদর্শন হিসাবে, time find /some/dir/containing/a/lot/of/files > /dev/nullদুইবার চালানোর চেষ্টা করুন , দ্বিতীয় বারটি প্রতিটি ডিস্ক ইনোডগুলি ক্যাশে হওয়ার কারণে অনেক দ্রুত। এখানে মূল বিষয়টি হ'ল কীভাবে এই কার্নেল বৈশিষ্ট্যটি ব্যবহার করতে হবে এবং এটি প্রতিস্থাপনের জন্য আপনার প্রচেষ্টা বন্ধ করতে হবে।

পয়েন্টটি পরিবর্তন করতে হয় swappiness। আসুন তিনটি প্রধান ধরণের মেমরি ব্যবহার বিবেচনা করুন: সক্রিয় প্রোগ্রাম, নিষ্ক্রিয় প্রোগ্রাম এবং ডিস্ক ক্যাশে। স্পষ্টতই সক্রিয় প্রোগ্রামগুলির দ্বারা ব্যবহৃত স্মৃতিটি মুছে ফেলা উচিত নয় এবং অন্য দু'জনের মধ্যে পছন্দটি বেশ নির্বিচারে। আপনি কি দ্রুত প্রোগ্রাম স্যুইচিং বা দ্রুত ফাইল অ্যাক্সেস চান? একজন কম swappiness সাহায্য ঠিক স্মরণে কর্মসূচি রাখা (এমনকি যদি দীর্ঘ সময়ের জন্য ব্যবহার করা হয় না) এবং একটি উচ্চ swappiness সাহায্য ঠিক আরো ডিস্ক ক্যাশে রাখা (অব্যবহৃত প্রোগ্রাম সোয়াপিং দ্বারা)। (অদলবদল স্কেল 0 থেকে 100 এবং ডিফল্ট মান 60 হয়)

আপনার সমস্যার আমার সমাধান হ'ল অদলবদলকে খুব উচ্চে পরিবর্তন করা (90-95 কে 100 না বলে) এবং ক্যাশে লোড করা:

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

যেমনটি আপনি অনুমান করছেন, আপনার সমস্ত উত্স ফাইল এবং অবজেক্ট ফাইলের পাশাপাশি সংকলক, শিরোনাম ফাইল, লিঙ্কযুক্ত লাইব্রেরি, আপনার আইডিই এবং অন্যান্য ব্যবহৃত প্রোগ্রাম অন্তর্ভুক্ত করার জন্য আপনার অবশ্যই পর্যাপ্ত ফ্রি মেমরি থাকতে হবে।


এটি সাধারণভাবে দরকারী, তবে আমি যা চাই তা হ'ল আমার সোর্স কোডটি স্বল্পতাযুক্ত হওয়া উচিত, তবে অন্য সব কিছুতে স্বাভাবিক অদলবদল থাকে। মূলত, আমার পটভূমিতে প্রচুর স্টাফ চলছে, তবে উত্স কোডের জন্য অন্যান্য 2 জিবি সর্বদা রাখার সময় আমি এগুলিকে 8 জিবি 6 এর মধ্যে সীমাবদ্ধ করতে চাই । আমি যে সুযোগটি বদলে যাব তা নিতে চাই না ... কখনও ... কারণ এটি বিরক্তিকর।
জেরেডিসি

অদলবদল সিস্টেম বিস্তৃত। আসলে আপনি যদি অন্য কিছু করছেন এবং আপনার ফাইলগুলি মেমরি থেকে লোড হয়ে যায় তবে আপনাকে কেবল দ্বিতীয় লাইনের সাথে এটি পুনরায় লোড করতে হবে। যদি স্মৃতিটিকে অন্য কোনও কারণে মুক্ত করতে হয়, তবে আপনি অদলবদল থেকে সত্যিই "চান্স নিতে চান না"। বিটিডাব্লু, tmpfsএকই ক্ষেত্রে এটিও মুছে ফেলা হবে।
শেলহোলিক

2
ব্যক্তিগতভাবে আমি পড়েছি একটি উচ্চ স্বচ্ছলতা ওয়ার্কস্টেশনগুলিতে বিস্মৃতকরূপে ভয়াবহ। যদিও কিছু ফাংশন বৃহত্তর ক্যাশে (যেমন আরও ক্যাশেড ফাইলগুলি) দ্বারা ত্বরান্বিত হতে পারে এটি একটি মূল্যে আসে: আপনি প্রোগ্রামগুলির মধ্যে স্যুইচ করার সময় প্রতিক্রিয়াশীলতার ক্ষেত্রে এটির জন্য অর্থ প্রদান করেন, যা সিস্টেমে কাজ করার সময় ব্যবহারকারীরা প্রথমে লক্ষ্য করেন। ব্রাউজার থেকে অফিসে অন্য ব্রাউজারে ইমেল করতে যাওয়ার সময় আমি প্রতিটি প্রোগ্রামের জন্য আবার অদলবদল করতে 1-2 সেকেন্ড অপেক্ষা করতে পারি না my আমার সমস্ত লিনাক্স মেশিনে আমি সাধারণত স্বল্পতার সাথে 10 এর কম মান রাখি
fgysin মনিকা

6

জোর করে ক্যাশে করা এটি করার সঠিক উপায় নয়। হার্ড ড্রাইভে উত্স রাখা এবং tmpfs এ তাদের সংকলন করা ভাল। অনেকগুলি বিল্ড সিস্টেম, যেমন কিউমেক এবং সিএমকে আউট-অফ-সোর্স বিল্ডকে সমর্থন করে।


6

inosyncএটা পছন্দ ডেমন শব্দসমূহ ঠিক আছে আপনি যা চান তা আপনি একটি ramdisk এবং করতে rsync যাচ্ছেন পারেন। প্রতি 10 সেকেন্ড বা তারপরে আর রিসাইং করার পরিবর্তে, ফাইল পরিবর্তিত হলে এটি লিনাক্সের ইনোটিফাই সুবিধাকে আরএসসিএন ব্যবহার করে। আমি এটি inosyncপ্যাকেজ হিসাবে ডেবিয়ান সংগ্রহস্থলে খুঁজে পেয়েছি বা এর উত্সটি http://bb.xnull.de/projects/inosync/ এ উপলব্ধ ।


এটি বেশ কার্যকর মনে হচ্ছে। আমি এটি খতিয়ে দেখব এবং ফিরে রিপোর্ট করব। ধন্যবাদ!
জেরেডিসি

5

এই জিনিসটি আমার পক্ষে কাজ করছে বলে মনে হচ্ছে যদি আমি নির্দিষ্ট ফাইল বা সমস্ত ফাইলকে একটি নির্দিষ্ট ডিরেক্টরিতে ক্যাশে রাখতে চাই।

vmtouch মনে হয় ঠিক জিনিস করতে। উদাহরণ 5 আপনি যা প্রয়োজন তা হতে পারে।

vmtouch -dl /whatever/directory/

আমার সাথে এটি রুট হিসাবে চালানো দরকার sudo


1
এটি নতুন / সরানো ফাইলগুলি দেখতে পাবে না।
vi।

3

পর্যাপ্ত স্মৃতি দেওয়া আপনার রামডিস্কের বাইরে কোনও আই / ও হয় না। এটি ফাইল পড়তে বা লেখার যে কোনও কিছুই গতি বাড়িয়ে তুলতে পারে। I / O হ'ল ধীরতম ক্রিয়াকলাপগুলির মধ্যে একটি। এমনকি আপনি যদি বিল্ডের আগে সমস্ত কিছু ক্যাশে করে থাকেন তবে আপনার কাছে লেখার জন্য আই / ওএস রয়েছে, যদিও এর ন্যূনতম প্রভাব থাকতে হবে।

আপনি সমস্ত ফাইলকে ক্যাশে প্রি-লোড করে কিছু গতি অর্জন করতে পারেন, তবে এতে যে সময় নেওয়া হয়েছিল তা মোট বিল্ড বারের মধ্যে অন্তর্ভুক্ত করা উচিত। এটি আপনাকে খুব বেশি সুবিধা দিতে পারে না।

ডিস্কের পরিবর্তে অবজেক্ট এবং মধ্যবর্তী ফাইলগুলিকে র‌্যামে তৈরি করা। ইনক্রিমেন্টাল বিল্ডগুলি করা আপনার ঘন ঘন বিল্ডগুলিতে উল্লেখযোগ্য লাভ পেতে পারে। বেশিরভাগ প্রকল্পগুলিতে আমি একটি দৈনিক পরিষ্কার বিল্ড এবং এর মধ্যে বর্ধিত বিল্ডগুলি করি। ইন্টিগ্রেশন বিল্ডগুলি সর্বদা পরিষ্কার বিল্ড থাকে তবে আমি সেগুলি প্রতিদিন একেরও কম সীমাবদ্ধ করার চেষ্টা করি।

আপনি টাইম অফ করে একটি ext2 পার্টিশন ব্যবহার করে কিছু কর্মক্ষমতা অর্জন করতে পারেন। আপনার উত্সটি ext3 / 4 এর মতো ভ্রমণ করা ফাইল সিস্টেমে সংস্করণ নিয়ন্ত্রণে থাকতে হবে।


2

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

আপনি এটিকে আউটপুট নিরীক্ষণ করতে vmstat 1(আপনার ওএসের জন্য যে কোনও সমতুল্য সরঞ্জামটি ব্যবহার করতে পারেন) নিরীক্ষণের জন্য একটি স্ক্রিপ্ট লিখে স্বয়ংক্রিয় করতে পারেন এবং লিখিত এবং পড়ার মতো ব্লকের সংখ্যার যোগফল রাখতে পারেন। সমষ্টি একবার আপনার পছন্দসইয়ের এক প্রান্ত পেরিয়ে যাওয়ার পরে, আপনি ক্যাশে করতে চান এমন সমস্ত ফাইল পড়ুন, যোগফলটি পুনরায় সেট করুন, তারপরে vmstat আউটপুট পর্যবেক্ষণ চালিয়ে যান। দ্রুত ফাইল পড়ার জন্য: যদি আপনার গাছে অনেকগুলি ফাইল থাকে তবে find ... -exec catতার পরিবর্তে চেষ্টা করুন find ... -print0 | xargs -0 catবা এমন কোনও কাস্টম প্রোগ্রাম যা প্রতিটি ফাইলের জন্য বিড়ালকে কার্যকর করবে না।

মনিটরিং ডিস্ক আইও স্থির বিরতি ব্যবহার করা পছন্দনীয় কারণ এটি ডিস্ক আইও লোডের উপর নির্ভর করে আপনার ডেটা কম বেশি ঘন ঘন পুনরায় পড়ার সংকেত দেয়।

আমি এই স্বয়ংক্রিয় পদ্ধতিটি সেই সিস্টেমে সফলভাবে ব্যবহার করেছি যেখানে আমার কিছু ইনডেক্স ফাইলের দরকার ছিল সবসময় দ্রুত হওয়ার জন্য, হার্ড ড্রাইভ I / O এড়ানো। আমি লগ ইন করার সময় অ্যাক্সেস হয়ে যাওয়া প্রতিটি ফাইলের একটি তালিকা তৈরি করতে স্ট্রেস ব্যবহার করেছি যাতে আমি দ্রুত লগইনগুলির জন্য সমস্ত কিছু ক্যাশে গরম রাখতে পারি।

এটি সেরা সম্ভাব্য সমাধান নাও হতে পারে তবে এটি আমার পক্ষে ভাল।

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