লিনাক্স: টোটাল অদলবদল = প্রসেস দ্বারা ব্যবহৃত স্বাপ?


17

সুতরাং, অদলবদলের ব্যবহার উচ্চতর সোয়াপ ব্যবহারের ব্যবস্থায় কোথা থেকে আসে সে সম্পর্কে আমি কিছু তদন্ত করার চেষ্টা করছি:

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

প্রতি প্রক্রিয়া অনুসারে ব্যবহৃত সোয়াপ আপ যোগ করা হচ্ছে:

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

যা মোট ব্যবহৃত অদলবদলের জন্য কম মান দেয়। বাকী ব্যবহৃত স্বাপস্পেসটি কোথায়? এটি কি কার্নেলের ভিতরে ভিমলোক () 'এডি মেমরি? অন্যকিছু? আমি কীভাবে এটি সনাক্ত করতে পারি?

মেমিনফোর আউটপুট:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

বাফার এবং ক্যাশে অন্তর্ভুক্ত রয়েছে এবং তারা কোনও প্রক্রিয়ার সাথে সম্পর্কিত নয়।
সোনারলোকস

2
@ গোল্ডিলোকস: না, এগুলি শারীরিক স্মৃতিতে রয়েছে। এছাড়াও, তারা যোগ করে না।
নিনজ

আপনি ঠিক বলেছেন, আমি ধারণা করি যে অদলবদল করা ক্যাশে করা অর্থহীন would তবে, আমি মনে করি যে অদলবদল হয়ে যাওয়া জিনিসগুলি সেখানে রেখে দেওয়া যেতে পারে এবং নিজের মালিকানাধীন প্রক্রিয়াটি নষ্ট হয়ে যাওয়ার পরেও ট্র্যাক করা যেতে পারে, যতক্ষণ না সেই অদলবদলের স্থান অন্যথায় প্রয়োজন হয় না; এটি পরে সময় সাশ্রয় করে যদি কোনও প্রক্রিয়া একই পৃষ্ঠাটি লোড করে এবং সেই পৃষ্ঠাটি আবার অদলবদল করতে হয় - এটি ইতিমধ্যে অদলবদলে রয়েছে। গুগল "অদলবদল ক্যাশে" linux-tutorial.info/modules.php?name=MContent&pageid=314 প্রকৃত "ক্যাশে ক্যাশে" কীভাবে আসে তা সমান্তরালভাবে (এটি এখন ডিফ্যান্ট প্রক্রিয়াগুলি থেকে মেমরিতে সংরক্ষণ করা জিনিস) ralle
সোনারলোকস

... অর্থ, তোমার, যে "কাপড় ক্যাশে মধ্যে সোয়াপ" তাই অর্থহীন, শুধুমাত্র সেই সেখানে র্যাম ক্যাশে আউট সোয়াপিং দ্বারা পাবেন না নয়।
স্বর্ণলোকস

1
উত্তরটি কি ঠিক ততটা নয় যে কার্নেলটি অদলবদল করতে পারে এবং এটি আপনার প্রক্রিয়াকরণের অন্তর্ভুক্ত নয়? বিশেষত কার্নেলের কাছে আজকাল "ব্যবহারকারীর স্থান" প্রক্রিয়াগুলির পুরো গাদা রয়েছে ... কেবলমাত্র একটি অনুমিত অনুমান।
আইএন

উত্তর:


11

আপনি যে পার্থক্যটি পর্যবেক্ষণ করছেন তা আসলে অদলবদলের জন্য অ্যাকাউন্টবিহীন থাকার কারণে নয়। কার্নেলটি কখনও কখনও /proc/*/exeলিঙ্কগুলিতে যুক্ত হয় এমন "(মুছে ফেলা)" আউটপুট হয় readlinkএবং এটি আপনার অজ স্ক্রিপ্টে পার্স ত্রুটি সৃষ্টি করে এবং আপনি কার্যকরভাবে প্রক্রিয়া গণনা করছেন না যার বাইনারিগুলি এখন আপনার মোট উপস্থিত নেই in

কিছু কার্নেলগুলি "(মুছে ফেলা)" শব্দটি /proc/*/exeসংমিশ্রণের লক্ষ্যে সিলেক করে যখন প্রক্রিয়াটির জন্য মূল এক্সিকিউটেবল আর কাছাকাছি থাকে না।

আপনার কমান্ডটি মোটের চেয়ে কম দেখানোর কারণ এটি। এই readlinkজাতীয় লিঙ্কগুলির আউটপুট "/ পাথ / টু / বিন (মুছে ফেলা)" এর মতো কিছু হবে যা awkআউটপুটটিকে স্ট্রিংয়ের পরিবর্তে প্রতিস্থাপন করার সময় পার্স ত্রুটির সৃষ্টি করে (এটি বন্ধনী এবং স্পেস পছন্দ করে না)। উদাহরণস্বরূপ, এটি করুন:

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

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

আপনি যদি কোনও জায়গায় stderr কে পুনঃনির্দেশ না দিয়ে আপনার মূল কমান্ডটি চালনা করেন তবে আপনি সম্ভবত কয়েকটি "পলাতক স্ট্রিং ধ্রুবক" ত্রুটি লক্ষ্য করবেন। এই ত্রুটিগুলি উপরের ফলাফল এবং আপনার এড়ানো উচিত নয়।

আপনার আসল কমান্ডের অন্যান্য সম্ভাব্য উন্নতিগুলি উপেক্ষা করে আপনি এটি "মুছে ফেলা)" মুছে ফেলার মাধ্যমে এটিকে সংশোধন করতে পারেন ( আউটপুটে |awk '{print $1}'যুক্ত নোট readlink):

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

awkএর আউটপুট স্থির করতে এই ব্যবহারটি readlinkভেঙে যেতে পারে যদি নামটিতে ফাঁকা স্থান থাকে - আপনি ব্যবহার করতে পারেন sedবা যে কোনও পদ্ধতি পছন্দ করেন method

বোনাস তথ্য

যাইহোক, আপনি কেবল ব্যবহার করতে পারেন smem -t। "অদলবদল" কলামটি আপনি যা চান তা প্রদর্শন করে।

যদিও এটি নিজেই গণনা করা যায়, আপনি VmSwapক্ষেত্র থেকে আরও তথ্য সরাসরি এই /proc/*/statusতথ্যতে পেতে পারেন (এসএমএসে কিছু কার্নেল সমর্থন প্রয়োজন এবং এটি সর্বদা উপলব্ধ নয়), এবং যথাযথ ফাইলনাম প্যাটার্ন ব্যবহার করে ত্রুটি আউটপুট পুনর্নির্দেশ করা এড়ানো উচিত যা এড়ানো যায় না এর সাথে শুরু করতে ত্রুটিগুলি:

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

আপনার যদি সত্যিকারের বাইনারি প্রয়োজন না হয় এবং কেবল প্রক্রিয়া নাম রাখার সাথে মোকাবিলা করতে পারেন তবে আপনি এগুলি থেকে সমস্ত কিছু পেতে পারেন status:

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

এবং পরিশেষে, যদি কেবলমাত্র পিআইডিই যথেষ্ট থাকে তবে আপনি কেবল এটির মাধ্যমে এটি করতে পারেন awk:

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

বিঃদ্রঃ:

এখন এটি বলার অপেক্ষা রাখে না যে freeএবং এর মধ্যে কোনও পার্থক্য নেই smem(পরেরটি আপনার স্ক্রিপ্টের মতো)। প্রচুর পরিমাণে রয়েছে (উদাহরণস্বরূপ, https://www.google.com/search?q=smem+free দেখুন , যা মেমরির ব্যবহার সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য প্রথম পৃষ্ঠায় পর্যাপ্ত ফলাফলের চেয়ে বেশি রয়েছে)। তবে সঠিক পরীক্ষা ছাড়াই আপনার নির্দিষ্ট পরিস্থিতি সমাধান করা যাবে না।


5

Tmpfs দ্বারাও অদলবদল ব্যবহৃত হয় যদি কার্নেলের আরও নিখরচায় র‌্যাম প্রয়োজন হয় বা কেবল কারণ এটি কিছু সময়ের জন্য অব্যবহৃত থাকে ... সুতরাং কোনও tmpf ব্যবহারের ফলে অদলবদল গ্রাস হতে পারে।


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