সার্ভারকে ঝামেলা না করে কীভাবে কয়েক মিলিয়ন ফাইল মুছবেন


11

আমি একটি এনজিনেক্স ক্যাশে ডিরেক্টরি মুছে ফেলতে চাই, যা আমি তা দ্বারা দ্রুত মুছে ফেলেছি:

mv cache cache.bak
mkdir cache
service nginx restart

এখন আমার কাছে একটি cache.bakফোল্ডার রয়েছে যার 2 মিলিয়ন ফাইল রয়েছে। আমি সার্ভারটি বিরক্ত না করে এটি মুছতে চাই।

একটি সরল rm -rf cache.bakসার্ভার ট্র্যাশ করে, এমনকি সবচেয়ে সহজ এইচটিটিপি প্রতিক্রিয়াটি rm চলাকালীন 16 সেকেন্ড সময় নেয়, তাই আমি এটি করতে পারি না।

আমি চেষ্টা করেছি ionice -c3 rm -rf cache.bak, কিন্তু তাতে কোন লাভ হয়নি। সার্ভারের একটি এইচডিডি রয়েছে, এসএসডি নয়, সম্ভবত কোনও এসএসডি এ এগুলি সমস্যা নাও হতে পারে।

আমি বিশ্বাস করি যে সেরা সমাধানটি হ'ল এক ধরণের থ্রোটলিংয়ের মতো, যেমন ক্যাশ ম্যানেজারে এনজিনেক্স কীভাবে তৈরি করে।

কীভাবে সমাধান করবেন? এমন কোনও সরঞ্জাম রয়েছে যা সঠিকভাবে এটি করতে পারে?

উবুন্টু 16.04 এ ext4


1
আপনি কীভাবে "আরএম-আরএফ ক্যাশে.বাক" থেকে পুনরুদ্ধার করলেন? দেখা যাচ্ছে যে আপনি নাম পরিবর্তন করার সময় এনজিনেক্স চলছিল, সুতরাং এটি ফাইল বর্ণনাকারী বজায় রাখতে পারে এবং এমনকি নতুন ডিরেক্টরিতে স্যুইচ করতে পারে। আমি মনে করি আপনাকে nginx পুরোপুরি বন্ধ করতে হবে, ক্যাশে মুছুন এবং তারপরে পুনরায় শুরু করতে হবে।
জান স্টেইনম্যান

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

আপনি কি সুন্দরrm ব্যবহার করে চালানোর চেষ্টা করেছেন ?
ভ্লাদিস্লাভ রাস্ট্রুসনি

একটি অনুরূপ ক্ষেত্রে উত্তর - - দ্রুত মুছে দেওয়ার rsync চেষ্টা unix.stackexchange.com/questions/37329/...
kawu

সমস্ত মন্তব্যের জন্য ধন্যবাদ, আমি আমার উত্তরগুলি লেখার জন্য সংক্ষিপ্ত করে রেখেছি।
হাইপারকনট

উত্তর:


9

এটির মতো একটি বাশ স্ক্রিপ্ট তৈরি করুন:

#!/bin/bash
rm -- "$*"
sleep 0.5

deleter.shউদাহরণ হিসাবে এটি সংরক্ষণ করুন । chmod u+x deleter.shএটি কার্যকর করার জন্য চালান ।

এই স্ক্রিপ্টটি এতে প্রবেশ করা সমস্ত ফাইলকে আর্গুমেন্ট হিসাবে মুছে ফেলে এবং তারপরে 0.5 সেকেন্ড ঘুমায়।

তাহলে, আপনি চালাতে পারেন

find cache.bak -print0 | xargs -0 -n 5 deleter.sh

এই কমান্ডটি ক্যাশে.বাকের সমস্ত ফাইলের একটি তালিকা পুনরুদ্ধার করে এবং একবারে পাঁচটি ফাইলের নাম মুছে ফেলুন স্ক্রিপ্টে to

সুতরাং, আপনি একসাথে কতগুলি ফাইল মুছে ফেলা যায় এবং প্রতিটি মুছে ফেলার অপারেশনের মধ্যে কতক্ষণ বিলম্ব হয় তা আপনি সামঞ্জস্য করতে পারেন।


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

xargsএকটি কমান্ড লাইনের সর্বোচ্চ আকার বোঝে এবং এটি ডিফল্টরূপে ছাড়িয়ে যাওয়ার চেষ্টা করে না। এই একটিতে একবারে 5 টিরও বেশি পাথের অতিরিক্ত সীমা নেই।
বাউলঅফ্রেড

1
কেবল সচেতন থাকুন যে প্রতি সেকেন্ডে 10 ফাইলের হারে 2 মিলিয়ন ফাইল মুছতে 55 ঘন্টা সময় লাগবে
অ্যান্ড্রু হেনেল

4

আপনার পৃথক ফাইল সিস্টেমে আপনার ক্যাশে সংরক্ষণ করার কথা বিবেচনা করা উচিত যা আপনি মন্তব্যে যেমন বলেছেন তেমন মাউন্ট / আনমাউন্ট করতে পারবেন। যতক্ষণ না আপনি না করেন ততক্ষণ আপনি এই এক লাইনারটি /usr/bin/find /path/to/files/ -type f -print0 -exec sleep 0.2 \; -exec echo \; -deleteধরে রেখে আপনার সন্ধানের বাইনারি / ইউএসআর / বিনের নীচে অবস্থিত এবং আপনি পর্দায় অগ্রগতি দেখতে চান তা ধরে নিতে পারেন। সেই অনুযায়ী ঘুম সামঞ্জস্য করুন, যাতে আপনি আপনার এইচডিডি চাপ না দিয়ে থাকেন।


-print0এখানে কোনও প্রয়োজন নেই, যেহেতু আপনি findকোথাও আউটপুট পাইপ করছেন না ।
তেরো কিলকেনেন

আপনি কেবল আরএম-ইনিংয়ের বিষয়ে আগ্রহী হতে পারেন। এটিকে পেরোনিয়া বলুন তবে আমি সর্বদা নিশ্চিত হতে চাই যে আমি সঠিক ফাইলগুলি মুছছি ting
অ্যালেক্স

আহ্ সত্য, আমি কমান্ডটি সঠিকভাবে ডিকোড করছি না, আমার খারাপ।
তেরো কিলকানেন

3

আপনি একটি ফাইন্ড কমান্ডের আউটপুট গ্রহণ করে স্ক্রিপ্টে আয়নিস চেষ্টা করতে চাইতে পারেন। নিম্নলিখিত মত কিছু:

ionice -c3 $(
for file in find cache.bak -type f; do
    rm $file
done
for dir in find cache.bak -depthe -type d -empty; do
    rmdir $dir
done
)

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

ফাইল সিস্টেমের একটি জার্নাল থাকলে জার্নালে পরিবর্তনগুলি লেখা হয়; প্রয়োগ; এবং জার্নাল থেকে সরানো হয়েছে। নিবিড় ক্রিয়াকলাপের জন্য এটি I / O প্রয়োজনীয়তা বৃদ্ধি করে।

আপনি ক্যাশে জার্নাল ছাড়াই একটি ফাইল সিস্টেম ব্যবহার করতে চাইতে পারেন।

আয়নিসের পরিবর্তে, ক্রিয়া সীমাবদ্ধ করতে আপনি একটি ঘুম কমান্ড ব্যবহার করতে পারেন। এটি আয়নিস না করলেও কাজ করবে, তবে আপনার সমস্ত ফাইল মুছতে অনেক সময় লাগবে take


2

আমি এখানে অনেক দরকারী উত্তর / মন্তব্য পেয়েছি, যা আমি উপসংহারের পাশাপাশি আমার সমাধানটিও দেখাতে চাই।

  1. হ্যাঁ, এই জাতীয় ঘটনাটি রোধ করার সর্বোত্তম উপায় হ'ল ক্যাশে দিরকে একটি পৃথক ফাইল সিস্টেমে রাখা। ফাইল সিস্টেমের নিকিং / দ্রুত বিন্যাসকরণে সর্বদা বেশ কয়েক সেকেন্ড (সম্ভবত কয়েক মিনিট) সময় লাগে, এতে কতগুলি ফাইল / ডায়ার উপস্থিত ছিল তার সাথে সম্পর্কিত নয়।

  2. ionice/ niceসমাধান, কিছু করিনি কারণ মোছার প্রক্রিয়া আসলে প্রায় কোনো ইনপুট / আউটপুট হত। আই / ও-এর কারণ কী ছিল আমি বিশ্বাস করি যে ফাইলগুলি মুছে ফেলার প্রক্রিয়া দ্বারা খুব দ্রুত ফাইলগুলি মুছে ফেলা হলে কার্নেল / ফাইল সিস্টেম স্তরের সারি / বাফারগুলি পূরণ হয়।

  3. আমি যেভাবে এটি সমাধান করেছি তা টেরো কিলকেনেনের সমাধানের অনুরূপ, তবে শেল স্ক্রিপ্ট কল করার দরকার পড়েনি। আমি --bwlimitমুছে ফেলার গতি সীমাবদ্ধ করতে সুইচ ইন আরসিএনসি ব্যবহার করেছি ।

সম্পূর্ণ আদেশ ছিল:

mkdir empty_dir
rsync -v -a --delete --bwlimit=1 empty_dir/ cache.bak/

এখন bwlimit কিলোবাইজে ব্যান্ডউইথকে সুনির্দিষ্ট করে, যা এই ক্ষেত্রে ফাইলের নাম বা ফাইলগুলির পথে প্রয়োগ করা হয়। এটি 1 কেবিপিএসে সেট করে, এটি প্রতি ঘন্টা 100,000 ফাইল, বা প্রতি সেকেন্ডে 27 টি ফাইল মুছছিল। ফাইলগুলিতে আপেক্ষিক পাথ ছিল cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e, যা 47 টি অক্ষর দীর্ঘ, সুতরাং এটি প্রতি সেকেন্ডে 1000/47 21 = 21 ফাইল দেবে, তাই আমার প্রতি ঘন্টা 100,000 ফাইলের অনুমানের অনুরূপ।

এখন কেন --bwlimit=1? আমি বিভিন্ন মূল্যবোধ চেষ্টা করেছি:

  • 10000, 1000, 100 -> সিস্টেম আগের মতো ধীর হয়ে যাচ্ছে
  • 10 -> সিস্টেম কিছুক্ষণের জন্য বেশ ভালভাবে কাজ করে তবে এক মিনিট বা একবারে আংশিক ধীরগতি তৈরি করে। এইচটিটিপি প্রতিক্রিয়া বার এখনও <1 সেকেন্ড।
  • 1 -> কোনও সিস্টেমের মন্দা নেই। আমি তাড়াহুড়ো করে নেই এবং 2 মিলিয়ন ফাইল এইভাবে <1 দিনে মুছতে পারে, তাই আমি এটি চয়ন করি।

আমি পদ্ধতিতে আরএসসিএন এর অন্তর্নির্মিত সরলতা পছন্দ করি তবে এই সমাধানটি আপেক্ষিক পাথের দৈর্ঘ্যের উপর নির্ভর করে। কোনও বড় সমস্যা নয় কারণ বেশিরভাগ লোকেরা পরীক্ষা এবং ত্রুটির মাধ্যমে সঠিক মান খুঁজে পেতে পারে।


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