ডিফ্র্যাগিং র‌্যাম / ওওএম ব্যর্থতা


11

এই প্রশ্নটি মোটামুটি দীর্ঘ, তাই আমি শীর্ষে প্রশ্নগুলি জিজ্ঞাসা করব এবং তারপরে প্রশ্নগুলিতে আসার আমার পদ্ধতিটি অনুসরণ করব:

  1. (ব্যস্তবক্স ভিত্তিক) আরএম কি কার্যকর সংঘবদ্ধ র্যাম না থাকার কারণে কার্যকর করা যায় নি?
  2. যদি তা হয়, তবে কোনও সিস্টেম পুনরায় চালু না করে ডিএমএ-কে ডিফ্র্যাগ করার কোনও হালকা ওজন আছে?
  3. তা না হলে কিসের কারণ? কীভাবে ভবিষ্যতে এটি থেকে রোধ করতে পারি?

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

এর পরে, আমি লক্ষ্য করেছি যে আমার শেল কমান্ডগুলির আরও অনেকগুলি প্রত্যাশার মতো পারফর্ম করছে না।

Rm সঠিকভাবে কার্যকর করতে ব্যর্থ হওয়ার পরে আমি dmesg থেকে একটি আউটপুট দিয়ে শুরু করব :

প্রক্রিয়া 6821 (আরএম) থেকে 61440 দৈর্ঘ্যের বরাদ্দ ব্যর্থ হয়েছে

প্রতি সিপিইউতে ডিএমএ:

সিপিইউ 0: হাই: 0, বিটিচ: 1 ইউএসডি: 0

অ্যাক্টিভ_অ্যানন: 0 অ্যাক্টিভ_ফিল: 1 অ্যাক্টিভ_অ্যানন: 0 অ্যাক্টিভ_ফিল: 0 অবিশ্বাস্য: 6 টি নোংরা: 0 লিখনব্যাক: 0 অস্থির: 0 ফ্রি: 821 স্ল্যাব: 353 ম্যাপড: 0 পেজ টেবিল: 0 বাউন্স: 0

ডিএমএ ফ্রি: 3284 কেবি মিনিট: 360 কেবি নিম্ন: 448 কেবি উচ্চ: 540 কেবি অ্যাক্টিভ_অ্যানন: 0 কেবি নিষ্ক্রিয়_আনন: 0 কেবি অ্যাক্টিভ_ফিল: 4 কেবি নিষ্ক্রিয়_ফিল: 0 কেবি অনিবার্য: 24 কেবি বর্তমান: 8128 কেবি পৃষ্ঠাগুলি_স্ক্যানড: 0 সমস্ত_আপনিযোগ্য? না

lowmem_re সংরক্ষণ []: 0 0 0

ডিএমএ: 31 * 4 কেবি 47 * 8 কেবি 42 * 16 কেবি 64 * 32 কেবি 1 * 64 কেবি 0 * 128 কেবি 0 * 256 কেবি 0 * 512 কেবি 0 * 1024 কেবি 0 * 2048 কেবি 0 * 4096 কেবি = 3284 কেবি

14 টি মোট পেজকেই পেজ

প্রক্রিয়া ডেটার জন্য র‌্যাম বরাদ্দ করতে অক্ষম, ভুল 12

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

তারপরে আমি একটি দ্রুত গণিত / স্যানিটি পরীক্ষা করেছিলাম এবং বুঝতে পেরেছি যে প্রোগ্রামটি একমাত্র 64kB সংলগ্ন মেমরি স্লটে চালাতে সক্ষম হওয়া উচিত ছিল। আরএম 61440 বাইট (60 কেবি) অনুরোধ করছিল।

আমি একটি ভাল পুরানো "ম্যানুয়াল ডিফ্র্যাগ" করেছি এবং সিস্টেমটি পুনরায় বুট করেছি। আমি যখন সিমটেমটি পুনরায় বুট করি তখন আমি আউটপুট / প্রোক / বন্ধুসিনফো:

Node 0, zone DMA 2 8 3 12 0 1 0 1 0 1 0

যা আমি মানচিত্রে সন্দেহ করি:

  • 2 এক্স 4 কেবি
  • 8 এক্স 8 কেবি
  • 3 এক্স 16 কেবি
  • 12 x 32 কেবি
  • 1 এক্স 128 কেবি
  • 1 এক্স 512 কেবি

তবে যদি মানগুলির উপরের তালিকার সংখ্যার যোগফল থাকে তবে এটি / proc / meminfo এর ফলাফলের সাথে মেলে না :

MemTotal:           6580 kB
MemFree:            3164 kB
Buffers:               0 kB
Cached:              728 kB
SwapCached:            0 kB
Active:              176 kB
Inactive:            524 kB
Active(anon):          0 kB
Inactive(anon):        0 kB
Active(file):        176 kB
Inactive(file):      524 kB`
Unevictable:           0 kB
Mlocked:               0 kB
MmapCopy:            844 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:             0 kB
Mapped:                0 kB
Slab:               1268 kB
SReclaimable:        196 kB
SUnreclaim:         1072 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:        3288 kB
Committed_AS:          0 kB
VmallocTotal:          0 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB

পুনরুদ্ধার করার জন্য, আমার প্রশ্নগুলি হ'ল:

  1. পর্যাপ্ত পরিমাণে র‌্যাম না থাকায় আরএম কি কার্যকর করা হয়নি?
  2. যদি তা হয়, তবে কোনও সিস্টেম পুনরায় চালু না করে ডিএমএ-কে ডিফ্র্যাগ করার কোনও হালকা ওজন আছে?
  3. তা না হলে কিসের কারণ? কীভাবে ভবিষ্যতে এটি থেকে রোধ করতে পারি?

আমি ল্যানট্রোনিক্সের এক্সপোর্ট প্রো (8 এমবি, লিনাক্স ওএস) ইউসি্লিনাক্স সংস্করণ 2.6.30 ব্যবহার করছি। ব্যবহৃত শেলটি হুশ।


গৌণ পয়েন্ট: আপনি আপনার মেমরি খণ্ডের তালিকা থেকে 1 x 2048 কেবি রেখে গেছেন। যদি আপনি এটি অন্তর্ভুক্ত করেন তবে যোগফলটি 3192 কেবি হয় যা / proc / meminfo এ তালিকাভুক্ত 3164 কেবি এর খুব কাছাকাছি।
অ্যালেক্স সেলবি

উত্তর:


11

আপনার প্রশ্ন 2 তে (মেমরি ডিফ্র্যাগমেন্টিং), https://www.kernel.org/doc/Docamentation/sysctl/vm.txt থেকে উদ্ধৃত :

compact_memory

কেবলমাত্র CONFIG_COMPACTION সেট করা থাকলে উপলব্ধ। 1 টি যখন ফাইলে লেখা থাকে, সমস্ত অঞ্চলগুলি এমনভাবে সংক্ষিপ্ত করা হয় যে যেখানে সম্ভব সেখানে নিখরচায় মেমরি উপলব্ধ blocks উদাহরণস্বরূপ বিশাল পৃষ্ঠাগুলির বরাদ্দে এটি গুরুত্বপূর্ণ হতে পারে যদিও প্রক্রিয়াগুলি প্রয়োজনীয়ভাবে সরাসরি মেমরিরও কমপ্যাক্ট করবে।

এটি সূচিত করে যে নিম্নলিখিত কমান্ডটি (মূল অধিকারগুলির সাথে চালিত হয়েছে এবং উপরে উল্লিখিত কার্নেল বিকল্পটি সক্ষম করা থাকলে)

echo 1 > /proc/sys/vm/compact_memory

কর্নেলটিকে যতটা সম্ভব মেমরি ডিফল্ট করার চেষ্টা করতে বলা উচিত। যেমন কিছু RHEL6 সংস্করণে সতর্ক থাকুন, এটি কার্নেলটি ক্র্যাশ করতে পারে ...


1
ফিরে আসতে এবং একটি পুরানো প্রশ্নে মন্তব্য করার জন্য সময় ব্যয় করার জন্য ধন্যবাদ!
ওল্ডটাইনফয়েল

7

এটি কিছুটা সময় নিয়েছে, তবে আমি ভেবেছিলাম যে আমার সাব 3 টি প্রশ্নের উত্তর না পাওয়া পর্যন্ত আমি উত্তর দেওয়া বন্ধ করে দেব।

যদিও আমি শুরু করার আগে, আমি উল্লেখ করব যে "ডি-ফ্রেগমেন্টিং" ওয়ার্কিং মেমরির ক্ষেত্রে এটি সঠিক শব্দটিকে "কমপ্যাক্টিং" ওয়ার্কিং মেমরি হিসাবে উল্লেখ করা হয়।

১. পর্যাপ্ত পরিমাণে র‌্যাম না থাকায় আরএম কি কার্যকর করা হয়নি?

আমি আমার উপসংহারে সঠিক ছিলাম - আরএম কার্যকর করে নি কারণ সেখানে যথেষ্ট পরিমাণে র‌্যাম নেই। সিস্টেমটি র‌্যাম অর্জন করেছে এবং এটি খণ্ডিত করে চলেছে, ফলে এটি অগ্রহণযোগ্য।

২. যদি তাই হয়, কোনও সিস্টেম পুনরায় চালু না করে ডিএমএ-কে ডিফ্র্যাগ করার কোনও হালকা পদ্ধতি আছে?

সন্ধান করে এম্বেড থাকা সিস্টেমটি পুনরায় আরম্ভ করার সংক্ষেপে মেমরিটি সংক্ষেপণের কোনও উপায় নেই। এমএমইউ-কম সিস্টেমের ক্ষেত্রে প্রতিরোধই গেমটির নাম।

আমার অংশটি যদি চিন্তা করে যে সফ্টওয়্যারটিতে এমএমইউ অনুকরণ করতে লিনাক্স কার্নেলটি হ্যাক করা সম্ভব হয়। আমি মনে করি যদি এটি সম্ভব হয় তবে কেউ ইতিমধ্যে এটি করে ফেলবে। আমি এটির সম্পূর্ণ নতুন ধারণাটি কল্পনা করতে পারি না;)

৩. কীভাবে আমি ভবিষ্যতে এটি হতে রোধ করতে পারি?

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

প্রকল্পের প্রথম পুনরাবৃত্তিতে, আমরা গুরুতর ফাংশনগুলি (যেমন আরএম) সম্পাদন করার জন্য আমার শেল স্ক্রিপ্ট কলগুলিতে নির্ভর করে। আমাদের প্রয়োজন না হলে আমরা চাকাটি পুনরায় উদ্ভাবনের প্রয়োজন দেখিনি see

তবে, আমি কোনও এমএমইউ-কম সিস্টেমের ক্ষেত্রে শেলটি এড়ানো সম্ভব হবার পরামর্শ দিচ্ছি -

( প্রশ্ন , মৃত্যুদণ্ড কার্যকর করলে কী হয় ls -la /path/to/directory/ | grep file-i-seek?)

( উত্তর : এটি একটি নতুন সাবপ্রসেস শুরু করে)

আপনার সি প্রোগ্রামে যদি আপনাকে কিছু কোর শেল স্ক্রিপ্ট কার্যকারিতা বাস্তবায়ন করতে হয় তবে আমি ব্যাসিবক্সে উত্স কোডটি পরীক্ষা করে দেখার পরামর্শ দিচ্ছি । আপনার এম্বেড থাকা সিস্টেমে আপনি সি ব্যবহার করবেন এমন সম্ভাবনা রয়েছে ..


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

3
[আমি বুঝতে পারি যে এটি পুরানো] একটি এমএমইউ অনুকরণ করা শক্ত ... এমএমইউ ব্যতীত প্রতিটি প্রোগ্রাম মেমরি বাসে উপস্থিত হওয়ার সাথে সাথে সরাসরি শারীরিক ঠিকানা ব্যবহার করে। আপনি একটি অনুকরণ করতে পারেন, তবে আপনাকে প্রতিটি মেমরি অ্যাক্সেস (যেমন একটি প্রকৃত এমএমইউয়ের মতো করে) আটকাতে হবে। পারফরম্যান্স ভয়ানক হবে। বিকল্পভাবে, আপনি অপ্রত্যক্ষ পয়েন্টারগুলি ব্যবহার করতে পারেন (যেমন ম্যাক ওএস ক্লাসিক তাদেরকে "হ্যান্ডলগুলি" বলে ডাকে) তবে তারপরে আপনার পুরোপুরি একটি কঠিন এপিআই, এবং প্রাক-ক্ষয়ক্ষতির মুখোমুখি খুব কঠিন একটি (ম্যাক ওএস ক্লাসিক সহযোগিতামূলক মাল্টিটাস্কিং ব্যবহার করেছে) ।
ডারোবার্ট

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