প্রশ্ন মিলিয়ন ফাইল দিয়ে একটি ডিরেক্টরি উপর আরএম


পটভূমি: প্রায় দুই বছর বয়সী, 7200-RPM SATA ড্রাইভগুলি 3Ware RAID কার্ডের সাথে সংযুক্ত, ext3 FS মাউন্ট করা নোটিমাইম এবং ডেটা = অর্ডার, পাগল লোডের অধীনে নয়, কার্নেল 2.6.18-92.1.22.el5, আপটাইম 545 দিন । ডিরেক্টরিটিতে কোনও সাবডিরেক্টরি নেই, কয়েকটি বড় (কয়েকটি কেবি) বেশী মাত্র কয়েক মিলিয়ন ছোট (~ 100 বাইট) ফাইল।

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

ext3_dx_add_entry: Directory index full!

প্রশ্নের ডিস্ক অবশিষ্ট প্রচুর ইনডো আছে:

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            60719104 3465660 57253444    6% /

তাই আমি অনুমান করছি যে এর অর্থ হল আমরা ডিরেক্টরী ফাইলটিতে কতগুলি এন্ট্রি থাকতে পারি তা সীমাবদ্ধ করি। কোন ফাইল কত হবে তা কোনও ধারণা নেই, তবে এটি আরও বেশি হতে পারে না, যেমন আপনি দেখতে পারেন, তিন মিলিয়ন বা তার চেয়েও বেশি। এটা ভাল না, মনে রেখো! কিন্তু যে আমার প্রশ্ন এক অংশ: ঠিক উপরের সীমানা কি? এটা কি টুনযোগ্য? আমি yelled এ আগে-আমি এটা সুর করতে চান নিচে; এই বিরাট ডিরেক্টরি সমস্যা সব ধরণের সৃষ্টি।

যাইহোক, আমরা যে সমস্ত ফাইল জেনারেট করেছিলাম সেই কোডটিতে সমস্যাটিকে ট্র্যাক করেছি এবং আমরা এটি সংশোধন করেছি। এখন আমি ডিরেক্টরি মুছে ফেলার সাথে আটকে আছি।

এখানে কয়েকটি বিকল্প:

  1. rm -rf (dir)

আমি এই প্রথম চেষ্টা। আমি ছেড়ে দেই এবং দেড় দিন পর কোন দৃশ্যমান প্রভাব ছাড়াই এটি মেরে ফেলতাম।

  • ডিরেক্টরিটি আনলিঙ্ক করুন (2): নিশ্চিতভাবে মূল্য বিবেচনা করুন, তবে প্রশ্নটি অনিলঙ্ক (2) এর মাধ্যমে মুছে ফেলার চেয়ে fsck এর মাধ্যমে ডিরেক্টরিগুলির মধ্যে ফাইলগুলি মুছতে দ্রুততর হবে কিনা তা প্রশ্ন। যে, এক উপায় বা অন্য, আমি অব্যবহৃত হিসাবে যারা inodes চিহ্নিত করতে হবে। এটি অবশ্যই অনুমান করা হয়েছে যে আমি fsck কে বলতে পারি যে ফাইলগুলিতে / হারানো + পাওয়া ফাইলগুলি এন্ট্রি না ছাড়াই; অন্যথায়, আমি শুধু আমার সমস্যা সরানো হয়েছে। অন্য সব উদ্বেগ ছাড়াও, এটি সম্পর্কে আরও কিছু পড়ার পরে, এটি সম্ভবত আমি কিছু অভ্যন্তরীণ FS ফাংশন কল করতে চাই, কারণ আনলিঙ্ক (2) রূপের যে কোনওটি আমি খুঁজে পাচ্ছি না সেটি আমাকে কেবল মুছে ফেলতে দেয় এন্ট্রি সঙ্গে একটি ডিরেক্টরি। ঘৃণা।
  • while [ true ]; do ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null; done )
  • এটি আসলে সংক্ষিপ্ত সংস্করণ; আমি চলমান আসলটি, যা যখন আমরা ফাইলগুলি মুছে ফেলার জন্য রান আউট করি তখন কিছু অগ্রগতি-রিপোর্টিং এবং ক্লিন স্টপ যোগ করে, এটি হল:

    এক্সপোর্ট আমি = 0;
    সময় (যখন [সত্য];
      ls-uf | মাথা -3 নং | grep -qf '.png' || বিরতি;
      ls-uf | মাথা -10000 | xargs rm -f2> / dev / null;
      এক্সপোর্ট আমি = $ (($ i + 10000));
      ইকো "$ আমি ...";
    সম্পন্ন )

    এই বরং ভাল কাজ বলে মনে হচ্ছে। যেমনটি আমি লিখেছি, এটি গত ত্রিশ মিনিটের মধ্যে 260,000 টি ফাইল মুছে দিয়েছে।


    97
    2017-09-22 23:57


    উত্স


    আরএম (জিএনইউ কোর্টিলস) 8.4 এই বিকল্পটি আছে: "-v, --verbose ব্যাখ্যা করা হচ্ছে কি করা হচ্ছে"। এটি মুছে ফেলা হচ্ছে যে সব ফাইল প্রদর্শন করা হবে। - Cristian Ciupitu
    প্রকৃতপক্ষে, এটি একটি অগ্রগতি বার করার সুষ্ঠু উপায় হতে পারে: যেহেতু প্রতিটি ফাইলটি 30 অক্ষর দীর্ঘ (36 + একটি '\ n') হতে পারে, আমি তার জন্য সহজে একটি প্যাসারার লিখতে পারি এবং যেহেতু printf () হয় সস্তা এবং আরএম কমান্ডটি ইতিমধ্যে লোড করা ফাইলের নাম আছে, কোনও বিশেষ কর্মক্ষমতা শাস্তি নেই। পুরো শেবাং করার জন্য একটি অ স্টার্টারের মতো মনে হচ্ছে, যেহেতু আমি যে কোনওভাবে এটি করতে "আরএম" পেতে পারিনি। কিন্তু এটি একটি আন্তঃ 10,000 অগ্রগতি বার হিসাবে বেশ ভাল কাজ করতে পারে; সম্ভবত একটি "।" প্রতি শত ফাইল জন্য? - BMDan
    rm -rfv | pv -l >/dev/null। পিভি পাওয়া যাবে EPEL সংগ্রহস্থল। - Cristian Ciupitu
    পিভি অতিশয় সন্ত্রস্ত। আমি আমার জগতে পিভি ইনস্টলেশনের একটি ট্রেইল ছেড়ে। - BMDan
    আমি সম্প্রতি এই সঠিক একই সমস্যা ছিল। ধন্যবাদ! - richo


    উত্তর:


    দ্য data=writeback মাউন্ট বিকল্পটি ফাইল সিস্টেমের জার্নালিং প্রতিরোধ করার জন্য চেষ্টা করার যোগ্য। এটি কেবল মুছে ফেলার সময়ই করা উচিত, তবে সার্ভারটি বন্ধ হয়ে যাওয়া বা মোছা ক্রিয়াকলাপ চলাকালীন পুনরায় বুট করা হলেও ঝুঁকি থাকে।

    অনুসারে এই পৃষ্ঠা,

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

    অপশন হয় হয় সেট হয় fstab বা মাউন্ট অপারেশন সময়, প্রতিস্থাপন data=ordered সঙ্গে data=writeback। মুছে ফেলা ফাইল ধারণকারী ফাইল সিস্টেম remounted করতে হবে।


    30
    2017-09-26 05:49



    তিনি থেকে সময় বৃদ্ধি করতে পারে commit  পছন্দ: "এই ডিফল্ট মানটি (বা কোনও কম মান) কর্মক্ষমতা ক্ষতিগ্রস্ত করবে, তবে এটি ডেটা-সুরক্ষাের জন্য ভাল। এটি 0 এ সেট করা একই ডিফল্ট (5 সেকেন্ড) এ চলে যাওয়ার একই প্রভাব ফেলবে। এটি খুব বড় মানগুলিতে সেট করা হবে। পারফরম্যান্সের উন্নতি". - Cristian Ciupitu
    লিখনব্যাকটি আমি দেখছি এমন নথির ব্যতীত স্টেলার দেখায় (gentoo.org/doc/en/articles/l-afig-p8.xml#doc_chap4) স্পষ্টভাবে উল্লিখিত হয়েছে যে এটি এখনও মেটাডেটা পত্রিকাগুলিকে জার্নাল করে যা আমি মনে করি যে আমি যে সমস্ত ডেটা পরিবর্তন করছি তা আমি অন্তর্ভুক্ত করেছি (আমি অবশ্যই ফাইলগুলিতে কোনও তথ্য পরিবর্তন করছি না)। আমার ভুল বোঝার বিকল্প? - BMDan
    অবশেষে, এ লিঙ্কটিতে উল্লেখ করা হয়নি যে, তথ্য = লেখার একটি বিশাল সুরক্ষা গর্ত হতে পারে, যেহেতু প্রদত্ত এন্ট্রি দ্বারা নির্দেশিত তথ্যটিতে অ্যাপ দ্বারা লিখিত ডেটা থাকতে পারে না, অর্থাত্ ক্র্যাশটি ফলস্বরূপ হতে পারে পুরাতন, সম্ভাব্য সংবেদনশীল / ব্যক্তিগত তথ্য প্রকাশ করা হচ্ছে। এখানে কোনো উদ্বেগ নেই, যেহেতু আমরা কেবল এটি সাময়িকভাবে চালু করছি, তবে আমি বা অন্যরা যে প্রস্তাবটি জুড়ে চললে তা সচেতন ছিল না সে ক্ষেত্রে আমি সবার কাছে সেই সতর্কতার বিষয়ে সতর্কতা অবলম্বন করতে চেয়েছিলাম। - BMDan
    প্রতিশ্রুতি: যে বেশ slick! পয়েন্টার জন্য ধন্যবাদ। - BMDan
    data=writeback এখনও প্রধান ফাইল সিস্টেমের মধ্যে এটি লেখার আগে মেটাডাটা জার্নাল। যেহেতু আমি এটি বুঝতে পারি, এটি কেবল একটি মাপের মানচিত্র লেখার এবং সেগুলিতে ডেটা লেখার মতো জিনিসগুলির মধ্যে ক্রমান্বয়ে প্রয়োগ করে না। হয়তো আপনি এটি থেকে একটি perf লাভ দেখেছি, যদি, এছাড়াও অন্যান্য আদেশ সীমাবদ্ধতা আছে। অবশ্যই, জার্নাল ছাড়া মাউন্ট এমনকি উচ্চতর কর্মক্ষমতা হতে পারে। (এটি আনলক্ক সম্পূর্ণ হওয়ার আগেই ডিস্কে কিছু করার প্রয়োজন ছাড়াই র্যামে মেটাডেটা পরিবর্তনগুলি ঘটতে পারে)। - Peter Cordes


    এই সমস্যাটির একটি প্রধান কারণ লক্ষ লক্ষ ফাইলের সাথে ext3 কর্মক্ষমতা, এই সমস্যার প্রকৃত মূল কারণটি ভিন্ন।

    যখন ডিরেক্টরিটি তালিকাভুক্ত করা দরকার readdir () ডিরেক্টরিতে বলা হয় যা ফাইলগুলির একটি তালিকা তৈরি করে। readdir একটি পজিটিস কল, কিন্তু এখানে ব্যবহার করা আসল লিনাক্স সিস্টেম কলকে 'getdents' বলা হয়। Entd সঙ্গে একটি বাফার পূরণ করে Getdents তালিকা ডিরেক্টরি এন্ট্রি।

    সমস্যা প্রধানত এই তথ্যটি হ'ল যে readdir () ফাইলগুলি আনতে 32Kb এর একটি নির্দিষ্ট বাফার আকার ব্যবহার করে। যেহেতু একটি ডিরেক্টরি বৃহত্তর এবং বৃহত্তর পায় (ফাইল যুক্ত হওয়ার সাথে আকার বৃদ্ধি পায়) ext3 এন্ট্রি আনতে ধীর এবং ধীরে ধীরে পায় এবং অতিরিক্ত পাঠকের 32 কিলোবাইট বাফার আকার শুধুমাত্র ডিরেক্টরিতে এন্ট্রিগুলির একটি ভগ্নাংশ অন্তর্ভুক্ত করতে যথেষ্ট। এটি readdir ওভার লুপ এবং উপর ওভার ব্যয়বহুল সিস্টেম কল ওভার আহ্বান।

    উদাহরণস্বরূপ, আমি ২6 মিলিয়নেরও বেশি ফাইল দিয়ে তৈরি একটি পরীক্ষামূলক ডিরেক্টরিরিতে "ls -1 | wc-l" চলমান অনেকগুলি পাওয়ারড সিস্টেম কলগুলির বড় স্ট্রাস আউটপুট দেখায়।

    $ strace ls -1 | wc -l
    brk(0x4949000)                          = 0x4949000
    getdents(3, /* 1025 entries */, 32768)  = 32752
    getdents(3, /* 1024 entries */, 32768)  = 32752
    getdents(3, /* 1025 entries */, 32768)  = 32760
    getdents(3, /* 1025 entries */, 32768)  = 32768
    brk(0)                                  = 0x4949000
    brk(0x496a000)                          = 0x496a000
    getdents(3, /* 1024 entries */, 32768)  = 32752
    getdents(3, /* 1026 entries */, 32768)  = 32760
    ...
    

    উপরন্তু এই ডিরেক্টরির মধ্যে ব্যয় সময় উল্লেখযোগ্য ছিল।

    $ time ls -1 | wc -l
    2616044
    
    real    0m20.609s
    user    0m16.241s
    sys 0m3.639s
    

    এইটিকে আরও কার্যকর প্রক্রিয়া করার পদ্ধতিটি বৃহত্তর বাফারের মাধ্যমে ম্যানুয়ালি কলডেন্টগুলিকে কল করা। এই উল্লেখযোগ্যভাবে কর্মক্ষমতা উন্নত।

    এখন, আপনি নিজে নিজে gddents কল করতে অনুমিত নন তাই কোনও ইন্টারফেস এটি স্বাভাবিকভাবে ব্যবহার করার জন্য বিদ্যমান নেই (দেখতে পাওয়ার জন্য ম্যান পৃষ্ঠা দেখুন!), তবে আপনি করতে পারেন ম্যানুয়ালি কল করুন এবং আপনার সিস্টেম কল আমন্ত্রণ উপায় আরো দক্ষ।

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

    /* I can be compiled with the command "gcc -o dentls dentls.c" */
    
    #define _GNU_SOURCE
    
    #include <dirent.h>     /* Defines DT_* constants */
    #include <err.h>
    #include <fcntl.h>
    #include <getopt.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/syscall.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    struct linux_dirent {
            long           d_ino;
            off_t          d_off;
            unsigned short d_reclen;
            char           d_name[256];
            char           d_type;
    };
    
    static int delete = 0;
    char *path = NULL;
    
    static void parse_config(
            int argc,
            char **argv)
    {
        int option_idx = 0;
        static struct option loptions[] = {
          { "delete", no_argument, &delete, 1 },
          { "help", no_argument, NULL, 'h' },
          { 0, 0, 0, 0 }
        };
    
        while (1) {
            int c = getopt_long(argc, argv, "h", loptions, &option_idx);
            if (c < 0)
                break;
    
            switch(c) {
              case 0: {
                  break;
              }
    
              case 'h': {
                  printf("Usage: %s [--delete] DIRECTORY\n"
                         "List/Delete files in DIRECTORY.\n"
                         "Example %s --delete /var/spool/postfix/deferred\n",
                         argv[0], argv[0]);
                  exit(0);                      
                  break;
              }
    
              default:
              break;
            }
        }
    
        if (optind >= argc)
          errx(EXIT_FAILURE, "Must supply a valid directory\n");
    
        path = argv[optind];
    }
    
    int main(
        int argc,
        char** argv)
    {
    
        parse_config(argc, argv);
    
        int totalfiles = 0;
        int dirfd = -1;
        int offset = 0;
        int bufcount = 0;
        void *buffer = NULL;
        char *d_type;
        struct linux_dirent *dent = NULL;
        struct stat dstat;
    
        /* Standard sanity checking stuff */
        if (access(path, R_OK) < 0) 
            err(EXIT_FAILURE, "Could not access directory");
    
        if (lstat(path, &dstat) < 0) 
            err(EXIT_FAILURE, "Unable to lstat path");
    
        if (!S_ISDIR(dstat.st_mode))
            errx(EXIT_FAILURE, "The path %s is not a directory.\n", path);
    
        /* Allocate a buffer of equal size to the directory to store dents */
        if ((buffer = calloc(dstat.st_size*3, 1)) == NULL)
            err(EXIT_FAILURE, "Buffer allocation failure");
    
        /* Open the directory */
        if ((dirfd = open(path, O_RDONLY)) < 0) 
            err(EXIT_FAILURE, "Open error");
    
        /* Switch directories */
        fchdir(dirfd);
    
        if (delete) {
            printf("Deleting files in ");
            for (int i=5; i > 0; i--) {
                printf("%u. . . ", i);
                fflush(stdout);
                sleep(1);
            }
            printf("\n");
        }
    
        while (bufcount = syscall(SYS_getdents, dirfd, buffer, dstat.st_size*3)) {
            offset = 0;
            dent = buffer;
            while (offset < bufcount) {
                /* Don't print thisdir and parent dir */
                if (!((strcmp(".",dent->d_name) == 0) || (strcmp("..",dent->d_name) == 0))) {
                    d_type = (char *)dent + dent->d_reclen-1;
                    /* Only print files */
                    if (*d_type == DT_REG) {
                        printf ("%s\n", dent->d_name);
                        if (delete) {
                            if (unlink(dent->d_name) < 0)
                                warn("Cannot delete file \"%s\"", dent->d_name);
                        }
                        totalfiles++;
                    }
                }
                offset += dent->d_reclen;
                dent = buffer + offset;
            }
        }
        fprintf(stderr, "Total files: %d\n", totalfiles);
        close(dirfd);
        free(buffer);
    
        exit(0);
    }
    

    যদিও এটি অন্তর্নিহিত মৌলিক সমস্যা (অনেক ফাইল, কোনও ফাইল সিস্টেমে যা খারাপভাবে সঞ্চালিত হয়) তেমন লড়াই করে না। এটি অনেকগুলি পোস্ট হওয়ার বিকল্পগুলির চেয়ে অনেক বেশি দ্রুত হতে পারে।

    একটি forethought হিসাবে, এক প্রভাবিত ডিরেক্টরির অপসারণ এবং পরে এটি পুনর্নির্মাণ করা উচিত। ডিরেক্টরিগুলি আকারের মধ্যে কখনও বৃদ্ধি পায় এবং ডিরেক্টরি আকারের কারণে অভ্যন্তরে কয়েকটি ফাইলের সাথেও খারাপভাবে চলতে পারে।

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

    আপনি এখন করতে পারেন dentls --delete /my/path

    নতুন ফলাফল। 1.82 মিলিয়ন ফাইলের সাথে একটি ডিরেক্টরি বন্ধ।

    ## Ideal ls Uncached
    $ time ls -u1 data >/dev/null
    
    real    0m44.948s
    user    0m1.737s
    sys 0m22.000s
    
    ## Ideal ls Cached
    $ time ls -u1 data >/dev/null
    
    real    0m46.012s
    user    0m1.746s
    sys 0m21.805s
    
    
    ### dentls uncached
    $ time ./dentls data >/dev/null
    Total files: 1819292
    
    real    0m1.608s
    user    0m0.059s
    sys 0m0.791s
    
    ## dentls cached
    $ time ./dentls data >/dev/null
    Total files: 1819292
    
    real    0m0.771s
    user    0m0.057s
    sys 0m0.711s
    

    আশ্চর্য ধরনের এই এখনও ভাল কাজ করে!


    73
    2017-11-06 19:06



    দুটি ছোটখাট উদ্বেগ: এক, [256] সম্ভবত হতে হবে [FILENAME_MAX], এবং দুটি, আমার লিনাক্স (2.6.18 == CentOS 5.x) একটি d_type এন্ট্রির মধ্যে dirent (অন্তত gddents (2) অনুযায়ী) অন্তর্ভুক্ত বলে মনে হচ্ছে না। - BMDan
    আপনি btree rebalancing উপর একটি বিট বিস্তৃত দয়া করে এবং কেন মুছে ফেলা যাতে এটি প্রতিরোধ করতে সাহায্য করে? আমি দুর্ভাগ্যবশত কোন উপকার জন্য, এটি জন্য Googling চেষ্টা। - ovgolovin
    কারণ এখন আমরা মনে করি যদি আমরা ক্রমান্বয়ে মুছে ফেলছি, আমরা পুনরায় নিয়ন্ত্রণ করতে বাধ্য করছি, যেমন আমরা একপাশে পাতাগুলি সরাতে এবং অন্যদিকে চলে যাব: en.wikipedia.org/wiki/B-tree#Rebalancing_after_deletion - ovgolovin
    আশা করি আমি এই বিষয়ে আপনাকে বিরক্ত করবো না। কিন্তু এখনও আমি ক্রম ফাইল মুছে ফেলার বিষয়ে একটি প্রশ্ন শুরু stackoverflow.com/q/17955459/862380, যা এমন একটি উত্তর পেতে পারে না যা উদাহরণ দিয়ে সমস্যাটি ব্যাখ্যা করবে, যা সাধারণ প্রোগ্রামারদের জন্য বোঝা যাবে। আপনি সময় আছে এবং তাই মনে করেন, আপনি এটা দেখতে পারে? হয়তো আপনি একটি ভাল ব্যাখ্যা লিখতে পারে। - ovgolovin
    এই কোড একটি আশ্চর্যজনক টুকরা। এটি এমন একমাত্র হাতিয়ার যা আমি সম্ভবত কয়েক বছরের মধ্যে কোনও ডিরেক্টরিতে নির্মিত 11,000,000 (11 কোটি) সেশন ফাইল তালিকাবদ্ধ এবং মুছে ফেলতে সক্ষম হতে পারি। Plesk প্রক্রিয়াটি যেগুলি এখানে অন্য উত্তরগুলির সন্ধান এবং অন্যান্য কৌশলগুলি ব্যবহার করে নিয়ন্ত্রণে রাখতে অনুমিত ছিল, সেটি চালানোর জন্য অক্ষম ছিল, তাই ফাইলগুলি কেবল বজায় রাখা চালিয়েছিল। এটি বাইনারি গাছের জন্য শ্রদ্ধা যা ফাইল সিস্টেমটি সংরক্ষণ করার জন্য ফাইল সিস্টেমটি ব্যবহার করে, যেগুলি সেশনে কাজ করতে সক্ষম হয়েছিল - আপনি একটি ফাইল তৈরি করতে এবং কোন বিলম্ব ছাড়াই এটি পুনরুদ্ধার করতে পারেন। শুধু তালিকা ব্যবহারযোগ্য ছিল। - Jason


    এই ফাইল সিস্টেম থেকে অন্য কোনও ফাইলকে অস্থায়ী স্টোরেজ অবস্থানে ব্যাকআপ করা, পার্টিশনটি পুনঃসেট করা, এবং তারপরে ফাইলগুলি পুনরুদ্ধার করা কি সম্ভব হবে?


    31
    2017-09-23 00:27



    আমি আসলেই এই উত্তরটি পছন্দ করি। একটি বাস্তব ব্যাপার হিসাবে, এই ক্ষেত্রে, না, কিন্তু এটা আমি এক চিন্তা হবে না। বলিহারি! - BMDan
    ঠিক কি আমি খুব চিন্তা ছিল। এই প্রশ্নের জন্য একটি উত্তর 3. আপনি আমাকে জিজ্ঞাসা যদি আদর্শ :) - Joshua


    Ext3- তে ফাইল ফাইল সীমা প্রতি কেবলমাত্র ফাইল সিস্টেম ইনডোড সীমা নেই (আমি মনে করি যদিও উপ-ডিরেক্টরিগুলির সীমাতে একটি সীমা আছে)।

    ফাইলগুলি সরানোর পরেও আপনার সমস্যা হতে পারে।

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


    11
    2017-09-23 05:45



    প্রকৃতপক্ষে, আমি সবকিছু মুছে ফেলার পরে শুধু এই আচরণ লক্ষ্য করেছি। সৌভাগ্যক্রমে, আমরা ইতোমধ্যেই "আগুনের লাইন" থেকে ডিরেক্টরিটিকে এমভিড করেছি, যেমনটি ছিল, তাই আমি কেবল এটির rmdir করতে পারতাম। - BMDan
    যে বলেন, যদি প্রতি ডিরেক্টরি ডিরেক্টরি সীমা নেই, আমি কেন "ext3_dx_add_entry: ডিরেক্টরি সূচী পূর্ণ!" পেয়েছিলাম! যখন যে পার্টিশন পাওয়া এখনও ছিল? এই ডিরেক্টরির মধ্যে কোন subdirectories ছিল। - BMDan
    হুম আমি একটু বেশি গবেষণা করেছি এবং মনে হচ্ছে যে কোনও ডিরেক্টরি আপলোড করতে পারে এমন ব্লকগুলির সংখ্যা সীমাবদ্ধ। ফাইলগুলির সঠিক সংখ্যা কয়েকটি বিষয় যেমন ফাইল নাম দৈর্ঘ্যের উপর নির্ভরশীল। এই gossamer-threads.com/lists/linux/kernel/921942 মনে হচ্ছে যে 4k ব্লকের সাথে আপনি একটি ডিরেক্টরির মধ্যে 8 মিলিয়নেরও বেশি ফাইল থাকতে সক্ষম হবেন। তারা বিশেষ করে দীর্ঘ ফাইল নাম ছিল? - Alex J. Roberts
    প্রতিটি ফাইলের নাম ঠিক 36 অক্ষর দীর্ঘ ছিল। - BMDan
    ভাল যে ধারনা আমার আউট :) - Alex J. Roberts


    আমি এটা benchmarked না, কিন্তু এই লোকটি করেনি:

    rsync -a --delete ./emptyDirectoty/ ./hugeDirectory/
    

    5
    2018-06-04 11:52





    উপরের ব্যবহারকারীদের দ্বারা প্রস্তাবিত ext3 fs এর পরামিতিগুলি পরিবর্তন করার পরেও কেবল আমার জন্য কাজ করে নি। উপভোগ্য উপায় খুব বেশী মেমরি। এই পিএইচপি স্ক্রিপ্ট কৌতুক করেনি - দ্রুত, অসম্পূর্ণ CPU ব্যবহার, উল্লেখযোগ্য মেমরি ব্যবহার:

    <?php 
    $dir = '/directory/in/question';
    $dh = opendir($dir)) { 
    while (($file = readdir($dh)) !== false) { 
        unlink($dir . '/' . $file); 
    } 
    closedir($dh); 
    ?>
    

    আমি এই সমস্যা সম্পর্কে একটি বাগ রিপোর্ট পোস্ট সঙ্গে পোস্ট: http://savannah.gnu.org/bugs/?31961


    4
    2017-12-23 19:54



    এই আমাকে সংরক্ষিত !! - jestro


    আমি সম্প্রতি একটি অনুরূপ সমস্যা সম্মুখীন এবং ring0 এর পেতে অক্ষম data=writeback কাজ করার পরামর্শ (সম্ভবত ফাইলগুলি আমার প্রধান বিভাজনে রয়েছে এমন কারণে)। কাজকর্মের গবেষণা করার সময় আমি এই উপর stumbled:

    tune2fs -O ^has_journal <device>
    

    এই নির্বিশেষে, জার্নালিং সম্পূর্ণ বন্ধ হবে data বিকল্প দিতে mount। আমি এই সাথে মিলিত noatime এবং ভলিউম ছিল dir_index সেট, এবং এটা বেশ ভাল কাজ করলো। ডিলটি আসলেই আমাকে হত্যা করার প্রয়োজন ছাড়া শেষ হয়ে গেছে, আমার সিস্টেমটি প্রতিক্রিয়াশীল ছিল, এবং এটি এখন কোনও সমস্যা ছাড়াই ব্যাক আপ এবং চলমান (জার্নালিংয়ের সাথে)।


    3
    2018-04-23 22:29



    আমি ext3 এর পরিবর্তে ext2 হিসাবে মেটাতে পরামর্শ দিতে যাচ্ছি, মেটাডেটা অপারেটিং জার্নালিং এড়ানোর জন্য। এই একই কাজ করা উচিত। - Peter Cordes


    আপনি নিশ্চিত করুন যে:

    mount -o remount,rw,noatime,nodiratime /mountpoint
    

    যা পাশাপাশি কিছু আপ গতিতে উচিত।


    3
    2017-09-27 02:03



    ভালো কল, কিন্তু এটি ইতোমধ্যেই নাটুকে মাউন্ট করা হয়েছে, যেমন আমি শিরোনামটিতে শিরোনামে উল্লেখ করেছি। এবং nodiratime অকার্যকর হয়; দেখ lwn.net/Articles/245002 । - BMDan
    পিপল এই মন্ত্রকে পুনরাবৃত্তি করুন "নোটাইম, নোডিরাটাইম, নোডাইটিম, নোরেডিংডক্সসটাইম" - poige