Ext3 / লিনাক্সে কীভাবে দ্রুত make rm` করা যায়?


32

আমার ডিফল্ট বিকল্পগুলির সাথে ext3 ফাইল সিস্টেম মাউন্ট করা আছে। এটিতে আমার কাছে প্রায় ~ 100GB ফাইল রয়েছে files

এ জাতীয় কোনও ফাইল অপসারণ করতে দীর্ঘ সময় (8 মিনিট) সময় লাগে এবং প্রচুর আইও ট্র্যাফিক তৈরি করে, যা সার্ভারে লোড বাড়িয়ে তোলে।

আরএমকে বাধাগ্রস্ত না করার কোনও উপায় আছে কি?


4
মূলত এখান থেকে কোনও পদ্ধতি কার্যকর হয়নি, তাই আমরা আমাদের নিজস্ব বিকাশ করেছি। এটি এখানে বর্ণনা করেছেন: depesz.com/index.php/2010/04/04/how-to-remove-backups

উত্তর:


14

সবচেয়ে আকর্ষণীয় উত্তরটি মূলত প্রশ্নটির একটি মন্তব্যে দাফন করা হয়েছিল। এটি আরও দৃশ্যমান করার জন্য এটি প্রথম শ্রেণীর উত্তর হিসাবে রয়েছে:

মূলত এখান থেকে কোনও পদ্ধতি কার্যকর হয়নি, তাই আমরা আমাদের নিজস্ব বিকাশ করেছি। এটি এখানে বর্ণিত: http://www.depesz.com/index.php/2010/04/04/how-to-remove-backups/ - Depesz এপ্রিল 6 '10 এ 15:15

এই লিঙ্কটি একটি কার্যক্ষম সমাধানের অনুসন্ধান এবং আবিষ্কারের একটি অবিশ্বাস্যভাবে বিশ্লেষণ বিশ্লেষণ।

এছাড়াও নোট:

নিবন্ধটি বলে:

আপনি দেখতে পাচ্ছেন, আমি -c2 -n7আয়নিসের বিকল্পগুলি ব্যবহার করেছি , যা বুদ্ধিমান বলে মনে হচ্ছে।

যা সত্য, তবে ব্যবহারকারী টিএফটি বলছে আপনি যদি কোনও বাধা না চান তবে -c3' নিষ্কলুষ ' -c2'সেরা চেষ্টা' এর চেয়ে ভাল পছন্দ হবে । তিনি -c3ব্যাকগ্রাউন্ডে তৈরি করতে ব্যবহার করেছেন এবং বিল্ডটিকে চিরকাল অপেক্ষা না করে ভালভাবে কাজ করতে পেরেছেন। আপনার যদি সত্যিই 100% আইও ব্যবহার হয় তবে -c3মুছে ফেলাটি কখনও সম্পূর্ণ হতে দেবে না তবে তিনি পরীক্ষিত পরীক্ষার উপর ভিত্তি করে এমনটি আশা করেন না।


18

এক্সটেন্ট 4 বা অন্য কিছু আধুনিক ফাইল সিস্টেমের আপগ্রেড করুন যা এক্সটেন্টগুলি ব্যবহার করে। যেহেতু ext3 এক্সটেন্টের চেয়ে পরোক্ষ ব্লকস স্কিম ব্যবহার করে, বড় ফাইলগুলি মুছে ফেলা অনিবার্যভাবে প্রচুর কাজকে আবশ্যক করে।



4

দক্ষতার দিক থেকে, ফাইলের জন্য একটি আরএম ব্যবহার করা সর্বোত্তম নয়, কারণ এতে প্রতিটি আরএমের জন্য কাঁটাচামচ এবং এক্সিকিউট প্রয়োজন।

ধরে নিই যে আপনার একটি ফাইল.টেক্সট রয়েছে যে ফাইলগুলি আপনি মুছে ফেলতে চান এটি আরও কার্যকর হবে তবে এটি এখনও ধীর হতে পারে:

xargs -i rm {} < list.txt

আর একটি পদ্ধতি হ'ল: nice -20 xargs -i rm {} < list.txt
(এতে কম সময় লাগবে তবে আপনার সিস্টেমে ব্যাপক প্রভাব ফেলবে :)

অথবা

আমি জানি না এটি কত দ্রুত হবে তবে:

mv <file-name> /dev/null 

অথবা

দ্রুত ফাইল সিস্টেম (একটি লুপ ডিভাইস ব্যবহার করে?) দিয়ে একটি বিশেষ মাউন্ট পয়েন্ট তৈরি করুন, আপনার বিশাল ফাইলগুলি সংরক্ষণ এবং মুছতে এটি ব্যবহার করুন।
(সম্ভবত ফাইলগুলি মুছে ফেলার আগে সেখানে সরিয়ে ফেলুন, সম্ভবত এটি দ্রুত বা সম্ভবত ফাইলগুলি চলে যেতে চাইলে এটি আনমাউন্ট করুন)

অথবা

cat /dev/null > /file/to/be/deleted(সুতরাং এটি এখন শূন্য আকারের) এবং আপনি যদি এটি rm -rf <file>এখনই অদৃশ্য হয়ে যেতে চান

বা আরও ভাল

বিড়াল ফেলে দাও এবং কর # > /file/to/be/emptied


ঠিক আছে, আমি 1 ফাইল মুছে ফেলছি , সুতরাং কোনও ওভারহেড নেই।

stackoverflow.com/questions/1795370/... - এই খুব পরীক্ষা

1

আমার কাছে ডিরেক্টরিটি যুক্তিসঙ্গত গতিতে মুছে ফেলার সমস্যা হয়েছিল, প্রক্রিয়াটি ডিস্কটিকে লক করে ডিস্কটি অ্যাক্সেস করার চেষ্টা করার প্রক্রিয়াগুলির একটি পাইলআপ তৈরি করছিল turns আয়নিস কাজ করে নি, এটি কেবল 99% ডিস্ক আইও ব্যবহার অবিরত করেছে এবং অন্যান্য সমস্ত প্রক্রিয়াটিকে লক করে দিয়েছে।

পাইথন কোডটি এখানে আমার জন্য কাজ করেছে। এটি একসাথে 500 টি ফাইল মুছে ফেলে, তারপরে অন্যান্য প্রক্রিয়াগুলি তাদের কাজটি করতে দেয়, তারপরে চালিয়ে যেতে 2 সেকেন্ড বিরতি নেয়। দুর্দান্ত কাজ করে।

import os, os.path
import time

for root, dirs, files in os.walk('/dir/to/delete/files'):
    file_num = 0
    for f in files:
        fullpath = os.path.join(root, f)
        os.remove(fullpath)
        if file_num%500 == 1:
            time.sleep(2)
            print "Deleted %i files" % file_num
        file_num = file_num + 1

1
এ্যাকটি 3 ফাইল সিস্টেমে 100G + ফাইলে এটি ব্যবহার করে দেখুন। সমস্যাটি একক ফাইলের আকারে, ফাইল সংখ্যা নয়।

আপনার ক্ষেত্রে এটি শোনাচ্ছে যে এটি কাজ করবে না। তবে আমার কাছে এক টন ছোট ফাইল ছিল। সাহায্য করার জন্য ধন্যবাদ.
নিক উডহ্যামস

1

আমার দুই সেন্ট.

আমি ইতিমধ্যে এই সমস্যা পেয়েছি। "ধারাবাহিক স্ক্রিপ্টে যা দ্রুত চালাতে হয়, প্রক্রিয়াটি প্রচুর ফাইল সরিয়ে দেয়" .. সুতরাং "আরএম" সেই স্ক্রিপ্টের গতি IO অপেক্ষার / সম্পাদনের সময়টির কাছাকাছি করে দেবে।

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

তারপরে আমি এমভি দ্বারা "আরএম" কে "আবর্জনা ফোল্ডারে" প্রতিস্থাপন করে মূল স্ক্রিপ্টটি আপডেট করেছি (সংঘর্ষ এড়াতে ফাইলটির নামের শেষে একটি কাউন্টার যুক্ত করে ফাইলটির নাম পরিবর্তন করুন)।

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

আশা করি সেই সাহায্য ..


0

এছাড়াও নোট করুন যে ডেনিস উইলিয়ামসনের উত্তর, যিনি আয়নিকে বোঝার জন্য একটি কার্যকারিতা হিসাবে প্রস্তাব করেন, কেবল তখনই কাজ করবে যখন আপনার ব্লক ডিভাইসটি সিএফকিউ আইও শিডিয়ুলার ব্যবহার করে।


0

আপনার ব্যাকআপগুলি সঞ্চয় করার জন্য আপনি একটি লুপ ফাইল সিস্টেম তৈরি করার চেষ্টা করতে পারেন।

# dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

তারপরে, আপনি যখন ব্যাকআপগুলি সাফ করতে চান:

# umount /mnt/backups
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

Presto! কিছুক্ষণের মধ্যে পুরো ভার্চুয়াল ফাইল সিস্টেমটি সাফ হয়ে যায়।


সমস্যাটি সমাধান করে না, কারণ এটি কেবল তখনই কাজ করবে যদি আমি প্রদত্ত ফাইল সিস্টেমে সমস্ত ব্যাকআপ সরিয়ে ফেলতে চাই।

0

আপনি একাধিক উইথ xargs ব্যবহার করতে পারেন

find . -type f | xargs -P 30 rm -rf 

যেখানে 30 আপনি তৈরি করতে চান এমন থ্রেডের সংখ্যা। আপনি যদি শূন্য ব্যবহার করেন তবে সিস্টেমটি কার্য সম্পাদনকারী ব্যবহারকারীর পক্ষে সর্বোচ্চ থ্রেড উপলব্ধ করে।


1
findএকটি -deleteবিকল্প আছে যা আরও ভাল বিকল্প।
অ্যারিল

0

এমভি <ফাইল / নাম> / দেব / নাল

/ dev / নাল একটি ফাইল যা ডিরেক্টরি নয়। কোনও ফাইল, কোনও ফাইলে স্থানান্তরিত করতে পারে না বা আপনি এটি ওভাররাইট করে ঝুঁকিপূর্ণ।

দ্রুত ফাইল সিস্টেম (একটি লুপ ডিভাইস ব্যবহার করে?) দিয়ে একটি বিশেষ মাউন্ট পয়েন্ট তৈরি করুন, আপনার বিশাল ফাইলগুলি সংরক্ষণ এবং মুছতে এটি ব্যবহার করুন। (সম্ভবত ফাইলগুলি মুছে ফেলার আগে সেখানে সরিয়ে ফেলুন, সম্ভবত এটি দ্রুত বা সম্ভবত ফাইলগুলি চলে যেতে চাইলে এটি আনমাউন্ট করুন)

আমি এটি ব্যবহারিক মনে করি না। এটি অপ্রয়োজনীয়ভাবে অপারেটর চেয়ে বেশি I / O ব্যবহার করবে।


-1

/ dev / নাল একটি ফাইল যা ডিরেক্টরি নয়। কোনও ফাইল, কোনও ফাইলে স্থানান্তরিত করতে পারে না বা আপনি এটি ওভাররাইট করে ঝুঁকিপূর্ণ।

আসলে এটি একটি ডিভাইস এবং এতে লিখিত সমস্ত ডেটা বাতিল হয়ে যায় তাই mv <file> /dev/nullবোধগম্য হয়

উইকিপিডিয়া থেকে,
ইউনিক্সের মতো অপারেটিং সিস্টেমে বিনামূল্যে এনসাইক্লোপিডিয়া , / dev / নাল বা নাল ডিভাইস একটি বিশেষ ফাইল যা এতে লিখিত সমস্ত ডেটা বাদ দেয় (তবে লেখার অপারেশন সফল হয়েছে বলে রিপোর্ট করে) এবং কোনও প্রক্রিয়াতে কোনও ডেটা সরবরাহ করে না যা এটি থেকে পড়ে (তাত্ক্ষণিক ইওএফ উত্পাদন করে) [[1]


1
এটি ভুল এবং অসাধারণ বিপজ্জনক। / dev / নাল একটি ডিভাইস, যা একটি বিশেষ ফাইল-জাতীয় অবজেক্ট। আপনি যদি রুট হন তবে "এমভি / কিছু / ফাইল / দেব / নাল" বিশেষ / দেব / নাল ডিভাইসটি মুছে ফেলবে এবং আপনার ফাইলটিকে সেখানে সরিয়ে দেবে! সুতরাং পরের বার কেউ / ডিভ / নাল ব্যবহার করার চেষ্টা করার পরে তারা ডিভাইসের পরিবর্তে একটি আসল ফাইল ব্যবহার করবে এবং বিপর্যয় ডেকে আনে। (যখন উইকিপিডিয়া বলে যে এটি "এতে লিখিত সমস্ত ডেটা বাতিল করে দেয়", তার মানে "বিড়াল / কিছু / ফাইল> / দেব / নাল" পড়বে / কিছু / ফাইল পড়বে এবং আপনি যে ডেটা পড়েছেন তা ফেলে দেবে, তবে এটি প্রভাবিত করবে না মূল ফাইল))
user9876
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.