মেমরি অ্যাপ্লিকেশন টিয়ারডাউন আউট লিনাক্স এড়িয়ে চলুন


34

আমি খুঁজে পাচ্ছি যে উপলক্ষে আমার লিনাক্স বাক্সটি স্মৃতিশক্তি থেকে সরে গেছে এবং এটি এটিকে মোকাবেলা করার জন্য এলোমেলো প্রক্রিয়া ছিন্ন করতে শুরু করে।

আমি কৌতূহল করছি এড়াতে প্রশাসকরা কী করেন? মেমোরির পরিমাণ বাড়ানোর একমাত্র আসল সমাধান (কী একা স্বাপ বদলাবে?), বা এড়াতে সফটওয়্যার সহ বক্স সেটআপ করার আরও ভাল উপায় আছে কি? (যেমন, কোটা, বা এরকম কিছু?)।


আমি কোন উত্তর এখানে পাওয়া গেছে: serverfault.com/questions/362589/... প্যাট্রিক প্রতিক্রিয়া খুব শিক্ষণীয়
আমরি

উত্তর:


44

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


আপনার স্মৃতি ম্যানেজমেন্টে কিছুটা উদ্বিগ্নতা ফিরিয়ে আনতে:

  1. ওওম কিলারটি অক্ষম করুন ( vm.oom-kill = 0/etc/sysctl.conf এ রাখুন )
  2. মেমরি ওভারকমিট অক্ষম করুন ( vm.overcommit_memory = 2/etc/sysctl.conf এ রাখুন )
    নোট করুন যে এটি একটি ট্রিনিয়ার মান: 0 = "আমাদের পর্যাপ্ত র‌্যাম থাকলে অনুমান", 1 = "সর্বদা হ্যাঁ বলুন", 2 = "আমরা না বললে না বলুন" স্মৃতি আছে ")

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

আপনার মেশিনটিকে পুনরায় লোড করতে পুনরায় বুট করুন /etc/sysctl.conf, বা procরিবুট ছাড়াই এখনই সক্ষম করতে ফাইল সিস্টেমটি ব্যবহার করুন :

echo 2 > /proc/sys/vm/overcommit_memory 

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

11
জাভা প্রোগ্রামাররা অব্যবহৃত মেমরি বরাদ্দ করে না, জাভাতে কোনও ম্যালোক নেই। আমি মনে করি আপনি এটিকে XX এর মতো JVM সেটিংসের সাথে বিভ্রান্ত করছেন। যাই হোক না কেন, অদলবদল স্থান যুক্ত করে ভার্চুয়াল মেমরির আকার বাড়ানো ওভারকমিটিংয়ের চেয়ে অনেক বেশি নিরাপদ সমাধান।
jlliagre

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

8
জালিয়াগ্রে, আমি বলেছিলাম জাভা ভিএম (ভার্চুয়াল মেশিন), জাভা প্রোগ্রাম নয়, যদিও প্রশাসকের দৃষ্টিকোণ থেকে এটি একই রকম :)
আলেকসান্দার ইভানিসেভিক

8
সম্ভবত এখানে উল্লেখযোগ্য যে উপরোক্ত যোগ /etc/sysctl.confসম্ভবত পরবর্তী পুনরায় বুট উপর প্রভাব ফেলবে; যদি আপনি এখনই পরিবর্তন করতে চান তবে sysctlরুট অনুমতি নিয়ে আপনার কমান্ডটি ব্যবহার করা উচিত যেমনsudo sysctl vm.overcommit_memory=2
নিকগ্রিম


3

একটি সার্ভারের সংক্ষিপ্ত উত্তরটি হ'ল আরও বেশি র্যাম কিনে ইনস্টল করুন।

এমন একটি সার্ভার যা নিয়মিতভাবে OOM (আউট-অফ-মেমরি) ত্রুটিগুলি অনুভব করে , তারপরে লিনাক্স কার্নেলগুলিতে ভিএম (ভার্চুয়াল মেমরি) পরিচালকের ওভারকমিট সিস্টেস্টল বিকল্প ছাড়াও, এটি ভাল জিনিস নয়।

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

অনেক অ্যাপ্লিকেশনের জন্য দু'বারের বেশি বরাদ্দকরণ (2x) স্বাম হিসাবে র্যামের পরিমাণ উন্নতিতে হ্রাস ফিরিয়ে দেয়। কিছু বৃহত গণনামূলক সিমুলেশনে, গতি ধীর-ডাউন সহনীয় হলে এটি গ্রহণযোগ্য হতে পারে।

র‌্যামের সাথে (ইসিসি বা না) সামান্য পরিমাণের জন্য যথেষ্ট সাশ্রয়ী হতে পারে, উদাহরণস্বরূপ 4-16 জিবি, আমাকে স্বীকার করতে হবে, আমি দীর্ঘসময় নিজেরাই এই সমস্যাটি অনুভব করিনি।

মেমরি ব্যবহারের ধরণগুলির মধ্যে দুটি সবচেয়ে সাধারণ দ্রুত মূল্যায়ন হিসাবে মেমরির ব্যবহার অনুসারে বাছাই করা freeএবং মেমরির ব্যবহার সহ মেমরির ব্যবহারের দিকে তাকানোর মূল বিষয়গুলি top। সুতরাং নিশ্চিত হয়ে নিন যে আপনি প্রতিটি ক্ষেত্রের অর্থ খুব কমপক্ষে সেই আদেশগুলির আউটপুটে বুঝতে পেরেছেন।

অ্যাপ্লিকেশনগুলির কোনও নির্দিষ্টকরণ (উদাহরণস্বরূপ ডাটাবেস, নেটওয়ার্ক পরিষেবা সার্ভার, রিয়েল-টাইম ভিডিও প্রসেসিং) এবং সার্ভারের ব্যবহার (কয়েকটি বিদ্যুত ব্যবহারকারী, ব্যবহারকারী / ক্লায়েন্ট সংযোগের 100-1000s) এর সাথে আমি কোনও সাধারণ সুপারিশ নিয়ে ভাবতে পারি না ওম সমস্যা


3

শারীরিক স্মৃতির পরিমাণ বাড়ানো সমস্ত পরিস্থিতিতে কার্যকর প্রতিক্রিয়া হতে পারে না।

এটি পরীক্ষা করার একটি উপায় হ'ল 'atop' কমান্ড। বিশেষত এই দুটি লাইন।

এটি যখন স্বাস্থ্যকর ছিল তখন এটি সার্ভারের বাইরে চলে যায়:

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

যখন এটি খারাপভাবে চলছিল (এবং আমরা 50 থেকে 90 এর মধ্যে ওভারকমিট_মেমোরিটি সামঞ্জস্য করার আগে, আমরা ভিএমকমের সাথে 50 জি-র উপরে ভালভাবে চলতে দেখতাম, ওম-কিলার প্রতি কয়েক সেকেন্ডে প্রক্রিয়াগুলি ফুটিয়ে তুলেছিল, এবং এনএফএসডি শিশু প্রসেসগুলি প্রসারণের কারণে বোঝা আমূলভাবে বাড়ছিল kept আপ এবং ক্রমাগত পুনরায় তৈরি।

আমরা সম্প্রতি সদৃশ কেস করেছি যেখানে মাল্টি-ইউজার লিনাক্স টার্মিনাল সার্ভারগুলি ভার্চুয়াল মেমরির বরাদ্দকে ব্যাপকভাবে প্রতিশ্রুতি দেয় তবে অনুরোধকৃত পৃষ্ঠাগুলির খুব কমই সত্যই গ্রাস হয়।

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


2

কোনও প্রক্রিয়াটি মারা যাওয়ার আগে যে মেমরির দাবি করার অনুমতি দেওয়া হয়েছে তা হ্রাস করতে আপনি ইউলিমিট ব্যবহার করতে পারেন। এটি খুব কার্যকর যদি আপনার সমস্যাটি এক বা কয়েক রান দূরে প্রসেস হয় যা আপনার সার্ভারকে ক্র্যাশ করে।

যদি আপনার সমস্যাটি হয় যে আপনার কেবলমাত্র পরিষেবাগুলি চালনার জন্য পর্যাপ্ত স্মৃতি নেই আপনার কেবলমাত্র তিনটি সমাধান রয়েছে:

  1. ক্যাশে এবং অনুরূপ সীমাবদ্ধ করে আপনার পরিষেবাদি দ্বারা ব্যবহৃত মেমরি হ্রাস করুন

  2. একটি বৃহত্তর অদলবদল তৈরি করুন। এটি আপনার পারফরম্যান্সে ব্যয় করতে পারে তবে আপনাকে কিছু সময় কিনতে পারে।

  3. আরও স্মৃতি কিনুন


0

আমার এই বাগের সাথে সম্পর্কিত একই সমস্যা ছিল এবং সমাধানটি ছিল পুরানো / নতুন (স্থির) কার্নেলটি ব্যবহার করা।

তবে সেই সময়টিতে আমি আমার মেশিনটি পুনরায় চালু করতে পারি নি তাই এই কমান্ডের সাহায্যে রুট এবং স্পষ্ট সিস্টেম ক্যাশে হিসাবে লগইন করার জন্য একরকম কুৎসিত workaround ছিল:

echo 3 > /proc/sys/vm/drop_caches

-5

@ voretaq7 লিনাক্সের মেমরি পরিচালনার মস্তিষ্ক-ক্ষতিগ্রস্থ ধারণা নেই, ডিফল্টরূপে vm.overcommit_ratio 0,

0       -   Heuristic overcommit handling. Obvious overcommits of
            address space are refused. Used for a typical system. It
            ensures a seriously wild allocation fails while allowing
            overcommit to reduce swap usage.  root is allowed to
            allocate slightly more memory in this mode. This is the
            default.

এইভাবে, যদি আপনার 4 গিগাবাইট র‌্যাম থাকে এবং আপনি ভার্চুয়াল মেমরির ম্যালোক সহ 4.2 গিগাবাইট বরাদ্দ দেওয়ার চেষ্টা করেন, আপনার বরাদ্দ ব্যর্থ হবে।

Vm.overcommit_ratio = 1 দিয়ে

            1    -   Always overcommit. Appropriate for some scientific
            applications. Classic example is code using sparse arrays
            and just relying on the virtual memory consisting almost
            entirely of zero pages.

Vm.overcommit_ratio = 2 সহ

           2    -   Don't overcommit. The total address space commit
            for the system is not permitted to exceed swap + a
            configurable percentage (default is 50) of physical RAM.
            Depending on the percentage you use, in most situations
            this means a process will not be killed while accessing
            pages but will receive errors on memory allocation as
            appropriate.

            Useful for applications that want to guarantee their
            memory allocations will be available in the future
            without having to initialize every page.

সুতরাং ডিফল্টরূপে লিনাক্স অতিরিক্ত কাজ করে না, যদি আপনার অ্যাপ্লিকেশনটির আরও মেমরি থাকে তবে আপনার কোডটি বগী


2
আপনি এখানে নিজেকে বিরোধিতা করেছেন। শীর্ষে আপনি "ডিফল্টরূপে vm.overcommit_ratio 0 হয়" এবং তারপরে নীচে আপনি "ডিফল্ট লিনাক্স দ্বারা overcommit করেন না" বলে থাকেন। যদি পরবর্তীটি সত্য হয়, vm.overcommit_ratio ডিফল্ট হিসাবে 2 হবে!
মাইকেল হ্যাম্পটন

vm.overcommit_ratio = 0, malloc আপনার শারীরিক র‌্যামের চেয়ে বেশি মেমরি বরাদ্দ করে না, সুতরাং আমার পক্ষে ওভারকমিট করবেন না, ওভারকমিট হ'ল আপনি যখন আপনার শারীরিক র‌্যামের চেয়ে বেশি ভার্চুয়াল বরাদ্দ করতে পারেন
c4f4t0r 10:57

2
হ্যাঁ, আপনি ভুল বুঝে গেছেন।
মাইকেল হ্যাম্পটন

আপনি ভুল বুঝে গেছেন, ডিফল্ট 0, রাম এর চেয়ে বেশি ভার্চুয়াল মেমরি বরাদ্দ করতে বরাদ্দ দেয় না এবং 2 ভিএম.ওভার কমিট_রেটিও + সোয়াপ স্পেসের অনুমতি দেয় না, তাই যদি আমার ভুল
বোঝে তবে

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