এই স্মৃতি সমস্যাটি কীভাবে সমাধান করবেন?


10

আমার কাছে একটি স্ট্যান্ডার্ড লিনাক্স (ডেবিয়ান টেস্টিং) ল্যাপটপ রয়েছে, যার সাথে অদলবদল বিভাজন রয়েছে।

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

  1. ল্যাপটপের সামনে বসে থাকুন
  2. একটি টার্মিনাল খুলুন
  3. টাইপ করুন python, তারপরa = [0]*100000000

এখন সম্ভাবনা বেশি যে আপনার কাছে সেই বড় তালিকাটি পরিচালনা করার মতো পর্যাপ্ত র‍্যাম নেই। লিনাক্সটি র‍্যামটি পূরণ করবে, তারপরে অদলবদল করবে এবং কয়েক মিনিট পরে, ওওএম কিলারটি ট্রিগার করা হবে এবং প্রায় (প্রায়) এলোমেলো পরিষেবাগুলি মেরে ফেলা হবে এবং আশা করা যায়, আপনি যদি ভাল সময়ে সিটিআরএল + সি আঘাত করেন python, এবং যদি টার্মিনাল হয় এখনও ফোকাস ছিল, কম্পিউটার আবার প্রতিক্রিয়াশীল হয়ে উঠবে।

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

ulimit -Sv [mem] আমি পিছনে শুনি!

হো হো! "এর cgroupsমাধ্যমে ব্যবহার করুন cgexec!" প্রথম সারিতে কেউ বলে!

হ্যাঁ, আপনি ঠিক বলেছেন: এগুলি সত্যিই খুব ভাল সমাধান। কিন্তু:

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

আমি যা চাই তা হ'ল কার্নেলটি বলে: "আপনি ব্যবহারকারীর ফু (রুট নয়) এর মালিক , আপনি প্রচুর স্মৃতি ব্যবহার করেন এবং আমরা স্মৃতিশক্তি হারিয়ে ফেলছি! দুঃখিত, এখন মারা যান!"

বা: "আপনি কী করছেন? আপনার এক্স এমবি দরকার এবং সেখানে কেবল ওয়াই এমবি পাওয়া যায় Yes হ্যাঁ, সোয়াপ্যাপ খালি, তবে আপনার নোংরা কাজটি করার জন্য আপনি SWAP ব্যবহার করার ইচ্ছা করেন না, না? আমি বলেছে না! তোমার জন্য কোন স্মৃতি নেই! আপনি যদি জেদ করেন তবে আপনি মারা যাবেন! "


2
ইতিমধ্যে এই নিবন্ধে বর্ণিত একটি অ্যালগরিদম রয়েছে যা ওওএম ঘাতককে সঠিক প্রক্রিয়া চয়ন করতে সহায়তা করে। পরিবর্তন /proc/sys/vm/overcommit_memoryকম স্মৃতিতে কার্নেল আচরণকে প্রভাবিত করে।
জোফেল

1
হ্যাঁ, তবে overcommit_memoryবিশেষ ফাইলটি ব্যবহারযোগ্য মেমরিরূপে র‌্যাম + স্যুপ ব্যবহার করে। আমি এখনও অদলবদল করব :)

1
এটি কীভাবে এটির সদৃশ নয় এটি আপনাকেও ব্যাখ্যা করতে হবে : unix.stackexchange.com/questions/34334/… যা আপনাকে ডাব্লুআরটি সিগ্রুপ এবং স্বতন্ত্র ব্যবহারকারীর সাথে বিবাদ করে। গীত। আপনি যদি অদলবদল করতে না চান তবে অদলবদল অক্ষম করুন
স্বর্ণলোক

1
আমি অদলবদল চাই! আমি হাইবারনেশন চাই, আমি অব্যবহৃত বাইটগুলি সঞ্চিত রাখতে চাই ! তবে আমি চাই না যে ব্যবহৃত বাইটগুলি সেখানে সংরক্ষণ করা হোক। লিঙ্কটি সম্পর্কে, ulimitsএকটি খারাপ ধারণা যা প্রায় সর্বত্র দেখানো হয়েছে যেহেতু এটি প্রতি প্রক্রিয়া সীমাবদ্ধতা ... আমি আপনাকে জানিনা :) সম্পর্কে cgroups, এটি অবশ্যই ভাল তবে এর সাধারণ কিছু নেই: আমি আমার ল্যাপটপের কথা বলছি তবে আমিও একটি "গণনা" সার্ভারের মালিক যা আমরা ভাগ করে নেওয়ার জন্য তিনজন। আমি যদি প্রতি ব্যবহারকারীর সীমাবদ্ধতা প্রয়োগ করি তবে আমি সবচেয়ে খারাপ পরিস্থিতি দ্বারা সীমাবদ্ধ থাকব, তাই না?

1
আপনি যে কোনও প্রক্রিয়া স্থির করেন cgroups- এর ক্ষেত্রে প্রযোজ্য- ব্যবহারকারীর সমস্ত প্রক্রিয়া একটি পৃথক গোষ্ঠীতে রাখুন এবং এটি যা চান তা করা উচিত।
পিটার্ফ

উত্তর:


4

আপনার শ্রবণে কেউ পরামর্শ দিয়েছে cgroups। ঠিক আছে, সেই দিকটি অনুসন্ধান করার চেষ্টা করুন কারণ এটি আপনাকে সরবরাহ করতে পারে:

  • আপনি বেছে নিয়েছেন এমন একটি গোষ্ঠীর জন্য প্রয়োগ (যেমন পদ্ধতি প্রশস্ত নয় তবে প্রক্রিয়া অনুযায়ী নয়)
  • সীমাটি গ্রুপের জন্য নির্ধারিত আছে
  • সীমা অচল
  • তারা মেমরি এবং / অথবা মেমরি + অদলবদলে কঠোর সীমাবদ্ধতা প্রয়োগ করতে পারে

এরকম কিছু আপনাকে আপনার লক্ষ্যগুলির নিকটে নিয়ে আসতে পারে :

group limited {
  memory {
    memory.limit_in_bytes = 50M;
    memory.memsw.limit_in_bytes = 50M;
  }
}

এটি জানায় যে এই সিগ্রুপের অধীনে কাজগুলি কেবলমাত্র সর্বোচ্চ 50 এম মেমরি এবং 50 এম মেমরি + অদলবদল ব্যবহার করতে পারে, তাই যখন মেমরিটি পূর্ণ থাকে, তখন এটি অদলবদল করে না, তবে যদি মেমরিটি পূর্ণ না থাকে এবং কিছু ডেটা ম্যাপ করা যায় অদলবদল, এটি অনুমোদিত হতে পারে।

সিগ্রুপের মেমরি ডকুমেন্টেশনের একটি অংশ এখানে দেওয়া হয়েছে :

মেমসউ সীমা ব্যবহার করে আপনি সিস্টেম OOM এড়াতে পারবেন যা অদলবদলের অভাবজনিত কারণে হতে পারে।


এখনও ঠিক আমি প্রত্যাশা ছিল কি না। তবে আমি যা প্রত্যাশা করি এবং বাস্তবতার মধ্যে পার্থক্য প্রায়শই বেশ বড় হয় :) এই ক্ষেত্রে, আমি নিশ্চিত হতে চেয়েছিলাম যে আমি overcommit_memoryকার্নেল ভেরিয়েবলের মতো কিছু মিস করিনি । সবাইকে ধন্যবাদ.

0

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

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

এই পোস্টে একটি প্রতিক্রিয়া দ্বারা অনুপ্রাণিত হয়ে , আমি নিম্নলিখিত স্ক্রিপ্ট লিখেছি (আমি এটাকে watch_memory.sh বলেছি):

#!/bin/bash

MONITOR=$(free | grep 'buffers/cache:')
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))

while :; do
    if [ "$MEM_PERC" -gt "95" ]
    then
        kill $1
        echo "$1 killed for using too much memory."
        exit
    fi
    sleep 1

    MONITOR=$(free | grep 'buffers/cache:')
    MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
    MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')
    MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))
done

এই স্ক্রিপ্টটি প্রতি সেকেন্ডে নিখরচায় মেমরির শতাংশের জন্য পরীক্ষা করে। সিস্টেমটি শেষ হয়ে গেলে, আপনার "বলির ছাগল" পিড (স্ক্রিপ্টের পক্ষে যুক্তি হিসাবে পাস করা) মারা যায়।

স্ক্রিপ্টের অগ্রাধিকার (কমনীয়তা) সামঞ্জস্য না করে, বধির ছাগলটিকে হত্যা করতে 10-10 সেকেন্ড সময় লেগেছে, তবে এটি এখনও কার্যকর হয়েছে। নেতিবাচক অগ্রাধিকার সহ স্ক্রিপ্টটি চালনার ফলে লঙ্ঘনের পরে তাত্ক্ষণিকভাবে হত্যা ঘটে (এই উদাহরণের মধ্যে 1196 আমি স্মরণশক্তি হারিয়ে না গেলে মেরে ফেলতে চাইছি এমন পিড):

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