কিভাবে একটি স্মৃতি ফাঁস সনাক্ত?


16

আমার বর্তমান উবুন্টু সিস্টেমে আরও বড় মেমরি ফুটো আছে বলে মনে হচ্ছে

অদ্ভুত এক্লিপস মেমরি ত্রুটিগুলি প্রতিবেদন করার পরে ( /ubuntu/148998/eclipse-constant-dif فر-out-of-memory-erferences ) আজ আমার কনসোলে আমি 'পর্যাপ্ত নয় স্মৃতি' ত্রুটি বার্তা পেতে শুরু করেছি - যখন টাইপ করা sudo -s- বা এমনকি - টাইপ করার মতো সাধারণ কাজ করাfree -m

'ফ্রি-এম' টাইপ করে পুনরাবৃত্তিটি আমাকে দেখায় যে কীভাবে আমার র‌্যাম দ্রুত 700M থেকে 900M এ চলে যায়, কয়েক সেকেন্ডে 2000M আকারে বেড়ে যায় (মেমরিটি মুক্ত করার পরে echo 3 > /proc/sys/vm/drop_caches)

গ্রহনটি এর কারণ নয়, আমি পুরোপুরি প্রক্রিয়াটি মেরেছিলাম এবং মেষটি এখনও উপরে উঠেছিল। ফাঁসটি কোথা থেকে আসছে তা সনাক্ত করার কোনও উপায় আছে? আমি এমনকি আমার সিস্টেমে আর আপডেট করতে পারি না, যেহেতু apt-get updateব্যর্থ হয় (সম্ভবত এটি স্মৃতির বাইরে থাকে)

ব্যবহার Ubuntu 11.10


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

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

উত্তর:


9

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

মেমপ্রফ একটি লাইব্রেরি সি-লাইব্রেরির মেমরি বরাদ্দ ফাংশনগুলিকে ওভাররাইড করার জন্য প্রাক-লোড করে কাজ করে এবং আপনাকে আপনার প্রোগ্রামটি পুনরায় সংকলনের প্রয়োজন হয় না।

memprof

সূত্র: উবুন্টু ম্যানুয়াল


11

প্রথমে নিশ্চিত করুন যে কোনও অস্থায়ী ফোল্ডার উপলব্ধ রয়েছে যাতে পর্যাপ্ত ফাঁকা জায়গা রয়েছে। নিম্নলিখিত কমান্ডগুলি ডাম্প তৈরি করে যা আকারে বেশ কয়েকটি জিবি হতে পারে।

আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে একটি নতুন tmp ফোল্ডার তৈরি করতে পারেন। আপনি /tmpপর্যাপ্ত স্থান সহ একটি ভিন্ন ফাইল সিস্টেমে পরিবর্তন করতে চাইতে পারেন

TMPDIR=$(mktemp -d -t -p /tmp)

মেমরি ফাঁস খুঁজে পেতে পদক্ষেপ

  1. প্রক্রিয়াটির পিআইডি সন্ধান করুন যা মেমরির ফাঁস সৃষ্টি করে (আপনি htopউপলভ্য হলে উদাহরণস্বরূপ ব্যবহার করতে পারেন ) এবং এটি একটি ভেরিয়েবলে সংরক্ষণ করুনpid

    ps -aux
    
  2. ভেরিয়েবলটিতে পিআইডি উপলব্ধ রয়েছে তা প্রদত্ত pid, আপনি ব্যবহার করে মেমরির খরচ ক্যাপচার করতে /proc/$pid/smapsএবং কিছু ফাইলের মধ্যে সংরক্ষণ করতে পারেন beforeMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. স্মৃতিশক্তি বৃদ্ধি পেতে কিছু সময় অপেক্ষা করুন।
  4. /proc/$pid/smapsআবার ক্যাপচার করুন এবং এটি সংরক্ষণ করুনafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. প্রথম smapsএবং দ্বিতীয় মধ্যে smapsযেমন পার্থক্য সন্ধান করুন

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. ঠিকানা সীমাটি নোট করুন যেখানে মেমরিটি বৃদ্ধি পেয়েছে, উদাহরণস্বরূপ:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. চলমান প্রক্রিয়াতে মেমরি ডাম্প করতে জিডিবি ব্যবহার করুন বা ব্যবহারের মাধ্যমে কর্ডড করুন

    gcore -o $TMPDIR/process $PID
    
  8. আমি কোনও ফাইলটিতে মেমরি ডাম্প করতে চলমান প্রক্রিয়াতে জিডিবি ব্যবহার করেছি।

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. এখন, stringsকমান্ড ব্যবহার করুন বা hexdump -Cমুদ্রণ করতেmemory.dump

    strings memory.dump
    

    এটি থেকে আপনি পঠনযোগ্য তথ্য পাবেন যা আপনাকে আপনার উত্স কোডে এই স্ট্রিংগুলি সনাক্ত করতে সহায়তা করে।

  10. ফাঁস খুঁজে পেতে আপনার উত্সটি বিশ্লেষণ করুন।

আমি একটি ডকার পাত্রে আছি, cat /proc/2882/smaps > /tmp/before.txt২ য় ধাপে চলার সময় অনুমতিটি ত্রুটি থেকে বঞ্চিত হলাম আমি কী ভুল করেছি?
ডেভি

এই পদ্ধতিটি আমার 9 ম পদক্ষেপ পর্যন্ত কাজ করেছিল আমার ক্ষেত্রে ফুটোটিতে কোনও পাঠযোগ্য বা সনাক্তযোগ্য ডেটা নেই। আমি কীভাবে তথ্য ফাঁস হয়ে গিয়েছিলাম তার প্রতীক নামগুলি পেতে পারি?
ক্রেগ

8

ড্রপ_কেচে ট্রিক মেমরি মুক্ত করবে না, এটি ক্যাশে পুনরায় সেট করবে। ব্যবহার PS কমান্ড আপনাকে যা ব্যবহারসমূহ আরো মেমরি প্রক্রিয়া শনাক্ত করতে চান।

উদাহরণস্বরূপ, আবাসিক মেমরি ব্যবহারকারীদের শীর্ষ 15 তালিকার নিরীক্ষণ করা।

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

আপনি ভাগ করা মেমরি রিজার্ভেশনও পরীক্ষা করতে পারেন তবে কেবলমাত্র এই বিভাগগুলির মালিক কে আপনি জানতে পারবেন।

পিএমএপ বরাদ্দ:

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

মনে রাখবেন যে সংরক্ষিত বরাদ্দগুলি বাস্তব বরাদ্দকৃত পৃষ্ঠাগুলির চেয়ে অনেক বেশি (df 'ব্যবহৃত')

সিস্টেম ভি বরাদ্দ:

$ ipcs -m 

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 294912     ed         700        122880     2          dest         
0x00000000 327681     ed         700        4823040    2          dest         
0x00000000 491522     ed         600        393216     2          dest         
0x00000000 589827     ed         700        4578120    2          dest         
0x00000000 425988     ed         700        27852      2          dest         
0x00000000 458757     ed         600        393216     2          dest         

সম্পাদনা করুন : সর্বাধিক মেমরির ব্যবহার সহ প্রক্রিয়াগুলি পাস --sort -rssকরার জন্য পাস করা দরকার ps, অন্যথায় প্রক্রিয়া তালিকাটি ক্রমবর্ধমান সংখ্যাসমূহ অনুসারে বাছাই করা হয় এবং কমপক্ষে মেমরির ব্যবহার সহ প্রক্রিয়াগুলি দেয়।


5

আমার একটি পুরানো মেশিন রয়েছে যা আমি ব্যবহার করি যা ক্রমাগত মেমরি ফাঁস বার্তা ছড়িয়ে দেয়:

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

আমার লিপি:

sync; sudo echo 3 > /proc/sys/vm/drop_caches

নাম দিয়েছি cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

আপনি দেখতে পাচ্ছেন আমি নীচে নেমে এসেছি 374 এমবি, দৌড়েছি sync; sudo echo 3 > /proc/sys/vm/drop_cachesএবং 417 এমবি ফিরে পেয়েছি। এক করতে পারেন cronএটা প্রতি 5 মিনিটে চালানোর জন্য বা শুধু একটি টার্মিনাল খোলা আছে এবং এটি চালানোর যখন আপনি ধীর কর্মক্ষমতা দেখুন। হ্যাঁ, আমার মেশিনে স্মৃতি যুক্ত করা দরকার ...



1
আপনার পোস্টের নীচে সম্পাদনা লিঙ্কটি ব্যবহার করুন । মার্কডাউন ফর্ম্যাটিং সাহায্যের সাথে সংযুক্ত পাঠ্য অঞ্চলটির উপরে একটি ফর্ম্যাটিং সরঞ্জামদণ্ড এবং কমলা প্রশ্ন চিহ্ন রয়েছে ।
ডেভিড ফোস্টার

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

অনেক ধন্যবাদ, ডেভিড ... আমি পুরোপুরি সম্মত হয়েছি ফ্ল্যাশ করা / ছেড়ে দেওয়ার ক্যাশে বিপথগামী ... তবে কিছু একটা হ্যাং হয়ে যাচ্ছে এবং মেশিনটিকে ফ্রিজ / লকআপ তৈরি করছে ... এটি কেবল ফায়ারফক্সের সমস্যা হিসাবে ভাবছে b ..
ওয়ারপিগ 0

3

মেমস্ট্যাট একটি ভাল সরঞ্জাম যা প্রতিটি ব্লক দ্বারা ব্যবহৃত মেমরির পরিমাণ এবং বোঝা লাইব্রেরি দ্বারা কতটা মেমরি ব্যবহৃত হয় তা দেখায়। সেরা সরঞ্জাম নয় তবে বিশদ এবং পরিসংখ্যান সংগ্রহ করার জন্য এটি মূল্যবান।

memstat -w -p pid ব্যবহার করার জন্য একটি ভাল কমান্ড।


1
লিঙ্কটি অসম্পূর্ণ, আমি মনে করি এই এক উত্তম
vladkras

1

আমারও একই সমস্যা ছিল তবে খুব অদ্ভুত সমাধান নিয়ে।

কোনও অজানা কারণে আমার ল্যাপটপ সেটআপ এবং চলমান অবস্থায় আমার একটি মেইল ​​সার্ভার ছিল I আমি জানি না কেন এটি আমার কাছে ছিল ... তবে আমি এর পরিষেবাটি বন্ধ করে দিয়েছিলাম এবং দেখা গেছে যে আমার ল্যাপটপে থাকা সফ্টওয়্যারটি একটি ডিডোস আক্রমণের শিকার হয়েছিল। এরপরে সবকিছু স্বাভাবিক ছিল।

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