অদলবদল যে ধীর হতে পারে?


77

কোনওভাবেই আমি 14 গিগাবাইট মেমরি সরিয়ে আনি। অপরাধীকে হত্যা করার পরে, আমার আবারও প্রচুর ফ্রি মেমরি রয়েছে, তাই আমি ভেবেছিলাম যে আমি আবার গুরুত্বপূর্ণ ডেটা আনতে পারি । সুতরাং 32 জিবি ব্যবহৃত 5 গিগাবাইটের মধ্যে 5 জিবি এবং 14 জিবি স্ব্যুপ স্পেস ব্যবহৃত হওয়ায় আমি দৌড়ে গেলাম swapoff -a... এবং 4 ঘন্টা পরে প্রায় অর্ধেক কাজ শেষ হয়েছে।

এর অর্থ কম 1 এমবি / সেকেন্ড, আমি 200 এমবি / এস সহজেই অনুলিপি করতে পারি। আমার অদলবদল এনক্রিপ্ট করা হয়েছে তবে একইভাবে সমস্ত সাধারণ পার্টিশন রয়েছে এবং এস -এনআই এর সাহায্যে এটি কোনও লক্ষণীয় সিপিইউ লোড করতে পারে না (এবং স্ব্যাপের স্থানটি পূরণ করতে কয়েক মিনিট সময় নেয়)। আমি দেখতে পাচ্ছি যে অনুকূলিত করার কোনও বিশেষ কারণ নেই swapoff, তবে আমি আশ্চর্য হই যে কীভাবে এটি এত ধীর হতে পারে?


কেবলমাত্র আরও কিছু ডেটা যুক্ত করুন: আমার মূল মেমরিটি 32 জিবি এবং 4 টি হার্ডডিস্কের প্রতিটিতে আমার 32 জিবি সোয়াপ স্পেস রয়েছে (অবশ্যই একটি ওভারকিল, তবে কে যত্নশীল?)। পুরো অদলবদল স্থানটি (ডিক্রিপ্ট করা এবং) 5 মিনিটেরও কম সময়ে পড়তে পারে:

time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af  /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c  /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405  /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a  /dev/mapper/cryptswap2
real 264.27

পার্টিশনের একটি অংশ পড়া সব পড়ার চেয়ে ধীর হতে পারে না। তবুও এর প্রায় 1/10 তম পড়তে প্রায় 100 গুণ বেশি সময় লাগে।

আমি পর্যবেক্ষণ করেছি যে swapoffউভয় সিপিইউয়ের সময় বেশিরভাগ অলস ছিল (সম্ভবত একটি কোরের 10%) এবং ডিস্কগুলিও ছিল (এলইডি দ্বারা "মাপা")। আমি আরও দেখতে পেলাম যে একের পর এক অদলবদলগুলি বন্ধ ছিল।


1
আমি অবাক হই, যখন সিস্টেম লোড হওয়া পৃষ্ঠাগুলি নিজেই র‌্যামে ফিরে আসে তখন একই ঘটনা ঘটে? উদাহরণস্বরূপ, যদি আমি কোনও সিস্টেমকে ডিস্কে স্থগিত করা হয় এবং তারপরে শুরু করি, সমস্ত কিছু অদলবদল হয়ে গেছে এবং এটি আবার র‍্যামে লোড হচ্ছে। আমার কাছেও খুব ধীর বলে মনে হচ্ছে।
পেটর পুদলেক

সমস্ত সোয়াপ-ডিভাইসগুলি কি একই অগ্রাধিকার সহ সক্রিয় রয়েছে?
নীল

@ পেটার পুডলক: ডিস্কে সাসপেন্ড করা কিছুটা আলাদা, এটি সোয়াপ এরিয়াতে র‌্যামের বিষয়বস্তুকে একটি মুক্ত জায়গায় লিখে দেয়, এবং এটি (এবং আন-সাসপেন্ড) সম্ভবত আরও দ্রুত। এনক্রিপ্ট হওয়া অদলবদলের সাথে এটি কাজ করে না বলে আমি চেষ্টা করতে পারি না।
মার্টিনাস

@ নীল: হ্যাঁ, অগ্রাধিকারটি হ'ল ডিস্ক এবং তাদের বিভাজন।
মার্টিনাস

এটি আরও অদ্ভুত করে তোলে। এই ক্ষেত্রে সমস্ত ডিস্ক জুড়ে অদলবদল স্ট্রিপ করা হয় - এটি খুব দ্রুত হওয়া উচিত। iostat -d 5ডিস্কগুলিতেও কি কম আইও প্রদর্শন করেছিলেন swapoff?
নিল

উত্তর:


53

প্রথমে আপনার হার্ড ড্রাইভ থেকে আপনি কী আশা করতে পারেন তা দেখুন look আপনার হার্ড ড্রাইভ ক্রমান্বয়ে 200 এমবি / গুলি করতে পারে । আপনি যখন সময় সন্ধান করেন তখন এটি অনেক ধীর হতে পারে । একটি স্বেচ্ছাসেবী উদাহরণ চয়ন করতে, সিগেটের আধুনিক 3 টিবি ডিস্কের একটি, এসটি 3000 ডিএম 1001 এর চশমাটি দেখুন :

  • সর্বাধিক টেকসই ডেটা হার: 210 এমবি / সে

  • গড় পড়ার সন্ধান করুন: <8.5 এমএস

  • সেক্টর প্রতি বাইট: 4,096

আপনার যদি কখনই সন্ধান করার প্রয়োজন হয় না এবং যদি আপনার অদলবদলটি ডিস্কের কিনারার কাছে থাকে তবে আপনি সর্বোচ্চ হার = 210 এমবি / সেকেন্ড পর্যন্ত দেখতে আশা করতে পারেন

তবে যদি আপনার অদলবদলের ডেটাটি সম্পূর্ণরূপে খণ্ডিত হয় তবে সবচেয়ে খারাপ পরিস্থিতিতে, আপনার পড়া প্রতিটি সেক্টরের সন্ধান করতে হবে। এর অর্থ হ'ল আপনি কেবল প্রতি 8.5 এমএসে 4 কেবি বা 4 কেবি / 0.0085 = 470 কেবি / গুলি পড়তে পারবেন

সুতরাং ডান বাদুড় বন্ধ, তাই না ধারণাতীত যে আপনার হার্ড ড্রাইভে গতি বিরুদ্ধে চলমান আসলে হয়।


এটি বলেছিল, এটি নির্বোধ বলে মনে হচ্ছে যা swapoffএত ধীরে চলবে এবং পৃষ্ঠাগুলি যথাযথভাবে পড়তে হবে, বিশেষত যদি সেগুলি দ্রুত লিখিত হয় (যা আদেশে বোঝায়)। তবে এটি কেবল কার্নেলটি কীভাবে কাজ করে তা হতে পারে। উবুন্টু বাগ রিপোর্ট # 486666 একই সমস্যাটি নিয়ে আলোচনা করেছে:

The swap is being removed at speed of 0.5 MB/s, while the
hard drive speed is 60 MB/s;
No other programs are using harddrive a lot, system is not under
high load etc.

Ubuntu 9.10 on quad core.

Swap partition is encrypted.
Top (atop) shows near 100% hard drive usage
  DSK | sdc | busy 88% | read 56 | write 0 | avio 9 ms |
but the device transfer is low (kdesysguard)
  0.4 MiB/s on /dev/sdc reads, and 0 on writes

উত্তরগুলির মধ্যে একটি ছিল:

It takes a long time to sort out because it has to rearrange and flush the
memory, as well as go through multiple decrypt cycles, etc. This is quite
normal

বাগ রিপোর্টটি অমীমাংসিত বন্ধ ছিল।

মেল গোরম্যানের " লিনাক্স ভার্চুয়াল মেমরি ম্যানেজার বোঝার " বইটি কিছুটা পুরানো, তবে একমত যে এটি একটি ধীরগতি সম্পন্ন:

কোনও অঞ্চলকে নিষ্ক্রিয় করার জন্য দায়ী ফাংশনটি, সম্ভবত যথেষ্ট বলা হয় sys_swapoff()। এই ফাংশনটি মূলত আপডেট করার সাথে সম্পর্কিত swap_info_struct। প্রতিটি পেজড-আউট পৃষ্ঠা থেকে পেজিং প্রধান টাস্ক দায়িত্ব try_to_unuse()যা অত্যন্ত ব্যয়বহুল।

লিনাক্স-কার্নেল মেইলিং তালিকায় " গতি বাড়িয়ে সোয়াপ অফ " বিষয় নিয়ে ২০০ from সাল থেকে আরও কিছুটা আলোচনা হয়েছে - যদিও তারা যে গতি নিয়ে আলোচনা করছে সেখানে আপনি যা দেখছেন তার চেয়ে কিছুটা বেশি।


এটি একটি আকর্ষণীয় প্রশ্ন যা সম্ভবত সাধারণত উপেক্ষা করা হয়, যেহেতু swapoffখুব কমই ব্যবহৃত হয়। আমি মনে করি যদি সত্যিই এটা খুঁজিয়া বাহির করতে চেয়েছিলেন, প্রথম পদক্ষেপ আরো সাবধানে আপনার ডিস্কের ব্যবহার নিদর্শন দেখার জন্য চেষ্টা করতে হবে (হয়তো সঙ্গে atop, iostatঅথবা তার চেয়েও বেশী শক্তিশালী সরঞ্জাম মত perfবা systemtap)। সন্ধানের জন্য জিনিসগুলি অতিরিক্ত সন্ধান, ছোট আই / ও ক্রিয়াকলাপ, ধ্রুবক পুনর্লিখন এবং ডেটা মুভমেন্ট ইত্যাদি হতে পারে be


5
দুর্দান্ত ব্যাখ্যা। এটি নোট করা উচিত যে বেশিরভাগ টুকরো টুকরো টুকরো টুকরো টুকরো করা সম্ভব হবে এবং অদলবদলের মেমরির বৃহত অংশগুলি কোর-ডাম্পিং করে দ্রুত বেশিরভাগ অদলবদলকে
ব্র্যান্ডন

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

33

আমি আমার ল্যাপটপের সাথে একই সমস্যা ভুগছি যাতে এসএসডি রয়েছে যাতে চেষ্টা করা সময় সমস্যা হয় না।

আমি একটি বিকল্প ব্যাখ্যা পেয়েছি । এখানে একটি অংশ

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

সুতরাং এটি অন্য কোনও কিছুর চেয়ে কার্নেলের সমস্যা।


না, এটি কার্নেল সমস্যা নয় IMHO। এটি কিভাবে swapoffবাস্তবায়িত হয়। অদলবদল প্রক্রিয়াটি প্রস্থান করার সময় এটি এত বেশি সময় নেয় না।
Marki555

15
এটি swapoff যা কার্নেলের মধ্যে রয়েছে তা প্রয়োগের ক্ষেত্রে সমস্যা - সুতরাং কার্নেলের সমস্যা! আপনি দেখতে পাচ্ছেন যে আপনি যদি strace swapoffএটি করেন তবে এটি swapoffসিস্টেম কলকে কল করে।
নিক ক্রেগ-উড

1
আমার কাছে 48 গিগাবাইট র‌্যামের সাথে একটি সার্ভার রয়েছে (32 টিক্স), 6 জিবি ফ্রি বাগ সোয়াপ ব্যবহার করা হয়েছিল 0.7 গিগাবাইট। অদলবদল = 10, এটি 0 করার চেষ্টা করেছিল এবং কী ঘটেছিল তা দেখার জন্য অদলবদল চেষ্টা করে। অদলবদলটি ধীরে ধীরে ধীরে ধীরে প্রকাশ করে সোয়াপফফটি বয়সগুলি, সম্ভবত 30 মিনিট সময় নেয়। আমার প্রায় কোনও লোডের অধীনে এসএসডি নেই এবং সিপিইউ অনুরূপ, স্বাপঅফ প্রক্রিয়াটি আশা করুন যা এক সিপিইউ 100% নেয়।
23:25

1
Swapoff কীভাবে প্রয়োগ করা হয় তা (কার্নেলের মধ্যে) সমস্যা। কয়েক বছর আগে কার্নেল-ডেভ-এ আরও অনেক ভাল পদ্ধতির বিষয়ে আলোচনা হয়েছিল, তবে তারা বলে যে এটি একটি কর্নার কেস এবং এটি পরিবর্তনের প্রচেষ্টা চায় না।
Marki555

6
1 টিবি র‌্যাম (হ্যাঁ, টিবি) এবং 2 গিগাবাইট অদলবদল (সিলি এসএপি প্রয়োজনীয়তা) সহ সার্ভারে স্বাপফফটি সেই 2 জিবি 5% (100% এ 1 সিপিইউ কোর সহ) মুক্ত করতে 12 ঘন্টা সময় নিয়েছিল।
Marki555

22

হ্যাঁ, swapoffপ্রক্রিয়াটি ভয়াবহভাবে অক্ষম। কার্যকার্যটি সহজ: পরিবর্তিত পৃষ্ঠাগুলিতে পুনরাবৃত্তির পরিবর্তে প্রক্রিয়াগুলিতে পুনরাবৃত্তি। এই অজগর স্ক্রিপ্টটি ব্যবহার করুন (আমি অনুমোদিত নয়):

git clone https://github.com/wiedemannc/deswappify-auto

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

swapoff /dev/x

যেহেতু বেশিরভাগ পৃষ্ঠাগুলি এখন অদলবদল এবং স্মৃতিতে উভয়ই উপস্থিত swapoffরয়েছে , তাই এর খুব কমই কাজ করতে হবে এবং এখন বোধহয় দ্রুত হওয়া উচিত (আমি শত শত এমবি / গুলি দেখেছি)।

এগিয়ে ইতিহাস বিভাগ

পূর্বোক্ত অজগর স্ক্রিপ্টটি এই উত্তরটির বাকী উপর ভিত্তি করে তৈরি হয়েছে, যার ফলস্বরূপ আমার এই পুরানো উত্তরটির উন্নতি ছিল জোলং দ্বারা রচিত । স্ক্রিপ্টটি অনেক বেশি নিরাপদ হওয়ায় আমি কেবলমাত্র আমার বাকী উত্তরটি প্রতিরক্ষা শেষ লাইন হিসাবে চেষ্টা করার পরামর্শ দিচ্ছি :

perl -we 'for(`ps -e -o pid,args`) { if(m/^ *(\d+) *(.{0,40})/) { $pid=$1; $desc=$2; if(open F, "/proc/$pid/smaps") { while(<F>) { if(m/^([0-9a-f]+)-([0-9a-f]+) /si){ $start_adr=$1; $end_adr=$2; }  elsif(m/^Swap:\s*(\d\d+) *kB/s){ print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n" }}}}}' | sort -Vr | head

এই হয়তো 2 সেকেন্ডের রান এবং আসলে কিছু করতে হবে না, শুধু শীর্ষ 10 মেমরির অংশ (আসলে এটা আরো এক liners, ছাপে তালিকা; হ্যাঁ আমি কি এক liners, ভালবাসেন; শুধুমাত্র কমান্ড পরীক্ষা ঝুঁকি গ্রহণ, কপি এবং পেস্ট আপনার শেল; এগুলি অদলবদল থেকে পড়বে)।

...Paste the generated one-liners...
swapoff /your/swap    # much faster now

মূল এক-লাইনারটি নিরাপদ (আমার জন্য), এটি প্রচুর / প্রোক পড়ে না।

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

আরেকটি বিপদটি সিস্টেমে অত্যধিক মেমরি চাপ ফেলেছে, তাই স্বাভাবিকের সাথে পরীক্ষা করে দেখুন free -m

এটার কাজ কি?

for(`ps -e -o pid,args`) {

  if(m/^ *(\d+) *(.{0,40})/) { 
    $pid=$1; 
    $desc=$2; 

    if(open F, "/proc/$pid/smaps") { 

      while(<F>) { 

        if(m/^([0-9a-f]+)-([0-9a-f]+) /si){ 
          $start_adr=$1; 
          $end_adr=$2; 
        } elsif( m/^Swap:\s*(\d\d+) *kB/s ){
          print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n" 
        }
      }
    }
  }
}

এই পার্ল স্ক্রিপ্টের আউটপুট হ'ল gdbকমান্ডের একটি সিরিজ dump memory (range)যা অদলবদল করা পৃষ্ঠাগুলিকে স্মৃতিতে স্মরণ করে।

আউটপুটটি আকারের সাথে শুরু হয়, সুতরাং | sort -Vr | headআকারের (শীর্ষে) দশটি বৃহত্তম বিভাগ পাওয়ার জন্য এটি গর্তটি পাস করা যথেষ্ট সহজ । -Vসংস্করণ নম্বরের-উপযুক্ত সাজানোর জন্য ব্রিদিং, কিন্তু এটা আমার উদ্দেশ্য জন্য কাজ করে। সংখ্যার সাজানোর কাজটি কীভাবে করা যায় তা আমি বুঝতে পারি না।


আপনি এখানে সংখ্যার বাছাই সহ ব্যবহার করবেনsort -t = -k 2n
Stéphane Chazelas

9
প্রক্রিয়া মেমরিটি দেখার জন্য জিডিবি ব্যবহার করার কোনও প্রয়োজন নেই বলে মনে হচ্ছে (কমপক্ষে সাম্প্রতিক কার্নেলের উপর)। যে কেউ /proc/$pid/memসরাসরি খুলতে , সন্ধান করতে এবং পড়তে পারে। এখানে আপনার স্নিপেটের উপর ভিত্তি করে পিওসি রয়েছে: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae এইভাবে প্রক্রিয়াটি থামানো হয়নি, এএফএইসি এর ফলে কোনও বিপদ হবে না।
ডাব্লুজিএইচ

10

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

"লিনাক্স কার্নেল 3 য় সংস্করণ বোঝা" এর পৃষ্ঠা 724 দেখুন।

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