লিনাক্সে বাফার ক্যাশে আকার সীমাবদ্ধ করুন


25

লিনাক্স কার্নেলকে বাফার ক্যাশে কেবলমাত্র একটি নির্দিষ্ট শতাংশের স্মৃতি ব্যবহার করার কথা বলার উপায় আছে? আমি জানি /proc/sys/vm/drop_cachesযে সাময়িকভাবে ক্যাশে সাফ করার জন্য ব্যবহার করা যেতে পারে, তবে এমন কোনও স্থায়ী সেটিং রয়েছে যা এটিকে প্রধান মেমরির 50% এরও বেশি বাড়তে বাধা দেয়?

যে কারণটি আমি এটি করতে চাই তা হ'ল আমার কাছে একটি সার্ভার রয়েছে যা একটি কেফ ওএসডি চালাচ্ছে যা নিয়মিতভাবে ডিস্ক থেকে ডেটা পরিবেশন করে এবং কয়েক ঘন্টাের মধ্যে পুরো শারীরিক মেমরিটি বাফার ক্যাশে ব্যবহার করতে সক্ষম করে। একই সময়ে, আমাকে এমন অ্যাপ্লিকেশনগুলি চালনা করতে হবে যা দৈহিক মেমরির একটি বিশাল পরিমাণ (জিবি 10s) বরাদ্দ করবে। জনপ্রিয় বিশ্বাসের বিপরীতে (বাফার ক্যাশে সম্পর্কিত প্রায় সমস্ত প্রশ্নের বিষয়ে দেওয়া পরামর্শ দেখুন), পরিষ্কার ক্যাশে প্রবেশাধিকার ছাড়াই মেমরিটি স্বয়ংক্রিয়ভাবে মুক্ত করা তাত্ক্ষণিক নয় : বাফার ক্যাশে পূর্ণ হওয়ার পরে আমার অ্যাপ্লিকেশন শুরু করা এক মিনিট সময় নিতে পারে ( *), ক্যাশে সাফ করার পরে (ব্যবহার করে echo 3 > /proc/sys/vm/drop_caches) একই অ্যাপ্লিকেশনটি প্রায় তাত্ক্ষণিকভাবে শুরু হয়।

(*) প্রারম্ভকালের এই মিনিটের সময়, অ্যাপ্লিকেশনটি নতুন স্মৃতিতে ত্রুটিযুক্ত হয়ে উঠেছে তবে তার 100% সময় কার্নেলে ব্যয় করে, ভিটুন নামে একটি ফাংশন অনুসারে pageblock_pfn_to_page। এই ফাংশনটি মনে হয় বিশাল পৃষ্ঠাগুলি সন্ধানের জন্য প্রয়োজনীয় মেমরি সংযোগের সাথে সম্পর্কিত, যা আমাকে বিশ্বাস করতে পরিচালিত করে যে আসলে খণ্ডিতকরণই সমস্যা।


1
ক্যাশে টিয়ারিং বলে কিছু আছে। সিএইচপি ওএসডি পুল সেট {ক্যাশেপুল} হিট_সেট_কাউন্ট 1 সিএফ ওএসডি পুল সেট {ক্যাচপুল} হিট_সেট_পিরিয়ড 3600 সিএফ ওএসডি পুল সেট {ক্যাশেপুল} টার্গেট_ম্যাক্স_বিটস 1000000000000 উদাহরণ হিসাবে দেখুন। docs.ceph.com/docs/master/rados/operation/cache-tiering
মাইকেল ডি।

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

উত্তর:


14

আপনি যদি কোনও চূড়ান্ত সীমা না চান তবে কেবল বাফারগুলি দ্রুত ছড়িয়ে দেওয়ার জন্য কার্নেলকে চাপ দিন, আপনার উচিত vm.vfs_cache_pressure

এই পরিবর্তনশীলটি কার্নেলের প্রবণতা নিয়ন্ত্রণ করে মেমরিটিকে পুনরায় দাবি করতে যা ভিএফএস ক্যাশে, বনাম পেজক্যাচ এবং অদলবদলের ক্যাশে করার জন্য ব্যবহৃত হয়। এই মানটি বাড়ানো যে হারে ভিএফএস ক্যাশে পুনরুদ্ধারযোগ্য তা বৃদ্ধি করে।

0 থেকে 200 পর্যন্ত ব্যাপ্তি higher উচ্চ চাপের জন্য 200 এর দিকে সরান। ডিফল্ট 100 এ সেট করা আছে You আপনি slabtopকমান্ডটি ব্যবহার করে আপনার মেমরির ব্যবহার বিশ্লেষণ করতে পারেন । আপনার ক্ষেত্রে, মান dentryএবং *_inode_cacheমান অবশ্যই বেশি হওয়া উচিত।

আপনি যদি একটি নিখুঁত সীমা চান, আপনার সন্ধান করা উচিত cgroups। সিফ ওএসডি সার্ভারকে একটি ক্রাগের মধ্যে রাখুন এবং সিগ্রুপের memory.limit_in_bytesজন্য প্যারামিটার সেট করে সর্বাধিক মেমরি সীমাবদ্ধ করুন ।

memory.memsw.limit_in_bytesমেমরি এবং অদলবদ ব্যবহারের যোগফলের জন্য সর্বোচ্চ পরিমাণ নির্ধারণ করে। যদি কোনও ইউনিট নির্দিষ্ট না করা হয় তবে মানটি বাইট হিসাবে ব্যাখ্যা করা হয়। তবে, বৃহত্তর ইউনিটগুলির প্রতিনিধিত্ব করার জন্য প্রত্যয় ব্যবহার করা সম্ভব - কিলোবাইটের জন্য কে বা কে, মেগাবাইটের জন্য এম বা এম, এবং গিগাবাইটের জন্য জি বা জি।

তথ্যসূত্র:

[1] - গ্লাস্টারএফএস লিনাক্স কার্নেল টিউনিং

[2] - RHEL 6 রিসোর্স ম্যানেজমেন্ট গাইড


1
limit_in_bytesসেট সহ একটি সিগ্রুপ মনে হচ্ছে এটি করছে। ধন্যবাদ!
উইম

4
আমি মনে করি vfs_cache_pressureকেবলমাত্র দাঁত এবং আয়নড ক্যাশেগুলি সাফ করে, এবং বাফার ক্যাশে করার কোনও সম্পর্ক নেই।
কাওয়িং-চিউ

আপনার কাজের চাপের জন্য পর্যাপ্ত র‌্যাম না রাখলে vfs_cache_pressureউপরের 100পরিমাণ বাড়ানো সাহায্য করতে পারে। এটি র‌্যামের ব্যবহার হ্রাস করবে তবে সামগ্রিকভাবে দরিদ্র I / O পারফরম্যান্সের কারণ ঘটবে।
মিক্কো রেন্টালাইনেন

3

আমি A% সম্পর্কে জানি না তবে, আপনি একটি সময়সীমা নির্ধারণ করতে পারেন যাতে x মিনিটের পরে এটি ড্রপ হয়।

টার্মিনালে প্রথম

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

বর্তমান ক্যাশেগুলি সাফ করার জন্য।

এটিকে একটি cron-job প্রেস Alt-F2 করুন, টাইপ করুন gksudo gedit /etc/crontab, তারপরে নীচের দিকে এই লাইনটি যুক্ত করুন।

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

এটি প্রতি 15 মিনিটে পরিষ্কার হয়। আপনি যদি প্রথম প্যারামিটারটি * / 15 এর পরিবর্তে * বা * / 5 তে পরিবর্তন করে সত্যিই চান তবে আপনি 1 বা 5 মিনিটে সেট করতে পারেন

আপনার বিনামূল্যে র‌্যাম দেখতে, ক্যাশে বাদে:

free -m | sed -n -e '3p' | grep -Po "\d+$

আমি এখানে কিছুটা অপ্রয়োজনীয় বোধ করছি। যতদূর আমি জানি, এর মধ্যে 3 > drop_cachesরয়েছেsync
andras.tim

1
@ andras.tim না - সিঙ্কটি নোংরা পৃষ্ঠাগুলি ডিস্কে লিখে, 3 ড্রপ_ক্যাচগুলি কেবল পরিষ্কার পৃষ্ঠাগুলি এবং অন্যান্য ক্যাশে ব্যবহৃত মেমরিটিকে পুনরায় দাবি / দমন করে। আপনাকে সিঙ্ক চালাতে হবে না তবে আপনি যদি এটি করেন তবে ময়লার বদলে আরও মেমরি পরিষ্কার হয়ে যাবে এবং যখন আপনি ক্যাশে ফেলবেন তখন আরও মেমরি মুক্ত হবে
ড্যানিয়েল এস স্টার্লিং

2

আমি মনে করি আপনার প্রশ্নের একেবারে শেষ অংশটি সঠিক পথে আছে। আমি সন্দেহ করি যে এপি, NUMA- সচেতন মেমরি বরাদ্দকৃত পৃষ্ঠাগুলি সিপিইউ বা বি এর মধ্যে স্থানান্তরিত করবে, সম্ভবত, স্বচ্ছ বিশাল পৃষ্ঠাগুলির ডিফ্র্যাগ কোডটি সুসংগত, প্রান্তিক অঞ্চলগুলি অনুসন্ধান করার চেষ্টা করছে।

বিশাল কর্মপরিধি এবং স্বচ্ছ বিশাল পৃষ্ঠাগুলি উভয়কে নির্দিষ্ট কাজের চাপে চিহ্নিত কর্মক্ষমতা উন্নতির জন্য চিহ্নিত করা হয়েছে এবং প্রচুর সুবিধা না দিয়ে বিপুল পরিমাণ সিপিইউ সময় গ্রহণের জন্য দায়ী।

আপনি কোন কার্নেলটি চালাচ্ছেন তা / / প্রোম / মেমিনফো (বা কমপক্ষে হিউজেপস_ * মানগুলি) এর বিষয়বস্তু, এবং, যদি সম্ভব হয় তবে ভিটিউন প্রোফাইলার কলগ্রাফ রেফারেন্সিং পৃষ্ঠা ব্লক_পিএফএন_টো_পেজ () জানতে সহায়তা করবে।

এছাড়াও, আপনি যদি আমার অনুমান করতে চান, তবে এর সাথে বিশাল পৃষ্ঠার ডিফ্র্যাগ অক্ষম করে দেখুন:

প্রতিধ্বনি 'কখনই নয়'> / sys / কার্নেল / মিমি / স্বচ্ছ_হেজপেজ / ডিফ্র্যাগ

(এটি আপনার কার্নেলের উপর নির্ভর করে পরিবর্তে এটি হতে পারে :)

প্রতিধ্বনি 'কখনই নয়'> / সিএস / কার্নেল / মিমি / রেডহ্যাট_টান্সপারেন্ট_হেজপেজ / ডিফ্র্যাগ

সবশেষে, এই অ্যাপ্লিকেশনটি কি আপনি লিখেছেন এমন দশটি জিগ রাম ব্যবহার করছেন? কী ভাষা?

যেহেতু আপনি এই শব্দটি ব্যবহার করেছেন, "মেমরি পৃষ্ঠায় ত্রুটিযুক্ত", আমি অনুমান করছি যে আপনি অপারেটিং ডিজাইন এবং ভার্চুয়াল মেমরির সাথে যথেষ্ট পরিচিত familiar আমি এমন পরিস্থিতি / অ্যাপ্লিকেশনটি কল্পনা করার জন্য সংগ্রাম করছি যা এতটা আক্রমণাত্মকভাবে দোষী হয়ে উঠবে যে আমি প্রচুর পরিমাণে I / O তে পড়ছি না - প্রায় সবসময় বাফার ক্যাশে থেকে যে আপনি সীমাবদ্ধ করার চেষ্টা করছেন।

(যদি আপনি কৌতূহলী হন তবে এমএএপি_এএনএনওয়াইওয়ামস এবং এমএপি_পুলিউট এবং মিনিকোর (2) এর মতো এমএম্যাপ (2) পতাকাগুলি দেখুন যা কোন ভার্চুয়াল পৃষ্ঠাগুলিতে প্রকৃতপক্ষে কোনও ম্যাপযুক্ত শারীরিক পৃষ্ঠা রয়েছে তা দেখতে ব্যবহার করা যেতে পারে))

শুভকামনা!


2

যদি সিফ ওএসডি একটি পৃথক প্রক্রিয়া হয়, আপনি প্রক্রিয়া দ্বারা ব্যবহৃত সংস্থানগুলি নিয়ন্ত্রণ করতে সিগ্রুপগুলি ব্যবহার করতে পারেন :

মেমরি সীমা সহ গ্রুপ 1 এর মতো একটি সিগ্রুপ তৈরি করুন (50 গিগাবাইটের উদাহরণস্বরূপ, সিপিইউর মতো অন্যান্য সীমা সমর্থিত, উদাহরণস্বরূপ সিপিইউতেও উল্লেখ করা হয়েছে):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

তারপরে, আপনি যদি অ্যাপ্লিকেশনটি ইতিমধ্যে চলমান থাকেন তবে এই সিগ্রুপে অ্যাপটি আনুন:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

অথবা এই সিগ্রুপের মধ্যে আপনার অ্যাপ্লিকেশনটি কার্যকর করুন:

cgexec -g memory,cpu:group1 your_app_name

0

টিউনড একটি গতিশীল অভিযোজিত সিস্টেম টিউনিং ডেমন যা ব্যবহারের উপর নির্ভর করে গতিযুক্ত সিস্টেম সেটিংস টিউন করে।

 $ man tuned

সম্পর্কিত ডকুমেন্টেশন এবং কনফিগারেশন ফাইলগুলি দেখুন।

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

অতিরিক্ত তথ্য

সিঙ্ক কমান্ড flushes বাফার, অর্থাত্, বাহিনী সব অলিখিত তথ্য ডিস্কে লেখার প্রয়োজন হবে, এবং যখন এক নিশ্চিত যে সবকিছু নিরাপদে লেখা আছে হতে চায় ব্যবহার করা যাবে। প্রথাগত ইউনিক্স সিস্টেমে ব্যাকগ্রাউন্ডে আপডেট নামে একটি প্রোগ্রাম চলছে যা প্রতি 30 সেকেন্ডে একটি সিঙ্ক করে, তাই সাধারণত সিঙ্ক ব্যবহার করার প্রয়োজন হয় না। লিনাক্সের একটি অতিরিক্ত ডিমন, বিডিফ্লুশ রয়েছে , যা ভারী ডিস্ক আই / ও-এর কারণে হঠাৎ হিমশীতল এড়াতে আরও ঘন ঘন একটি অপূর্ণ সিঙ্ক তৈরি করে যা কখনও কখনও সিঙ্ক হয়

লিনাক্সের অধীনে, বিডিফ্লুশ আপডেটের মাধ্যমে শুরু হয়। এটি নিয়ে উদ্বিগ্ন হওয়ার কোনও কারণ নেই, তবে যদি বিডিফ্লুশ কোনও কারণে মারা যায় তবে কার্নেলটি এটি সম্পর্কে সতর্ক করবে এবং আপনার নিজের হাতে এটি শুরু করা উচিত ( / sbin / আপডেট )।


1
এটি কি কেবল নোংরা প্রবেশের জন্য নয়? আমি মনে করি না যে এটি আমার সিস্টেমে সমস্যাটি সমস্ত পরিষ্কার কারণ - বিলম্বটি নোংরা পৃষ্ঠাগুলি ফিরে লেখার ক্ষেত্রে নয়, পরিষ্কারগুলি অপসারণ করে ফাঁক ফাঁক করে দেওয়া হয়।
উইম

হ্যাঁ, এটি নোংরা পৃষ্ঠাগুলির জন্য, আমি মনে করি আপনি গতিশীল মোডে টিউন করে অন্যান্য পারফরম্যান্স সমস্যাগুলিও ঠিক করতে পারেন।
ইজাজ আহমদ খান 10

"যেহেতু লিনাক্স ২.6, [বিডিএফলুশ] সিস্টেম কলটি অবচয় করা হয়েছে এবং কিছুই করে না future ভবিষ্যতের কার্নেল রিলিজে এটি পুরোপুরি অদৃশ্য হয়ে যাওয়ার সম্ভাবনা রয়েছে। আজকাল, বিডিফ্লুশ () দ্বারা সম্পাদিত টাস্কটি কার্নেল পিডিফ্লুশ থ্রেড দ্বারা পরিচালিত হয়।" man7.org/linux/man-pages/man2/bdflush.2.html
সোর্সজেডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.