আপনার কাছে থাকা জম্বি প্রক্রিয়াগুলির সংখ্যার কোনও উচ্চতর সীমা রয়েছে?


17

আমি এইচপি-ইউএক্স সিস্টেমের সাথে কাজ করতাম এবং পুরানো প্রশাসক আমাকে বলেছিলেন যে সিস্টেমে আপনি যে পরিমাণে জম্বি প্রক্রিয়া করতে পারেন তার সংখ্যার উপরের সীমা রয়েছে, আমি বিশ্বাস করি 1024।

  • এটি কি কঠিন সত্য সিলিং? আমি মনে করি আপনার কাছে এমন অনেকগুলি জম্বি থাকতে পারে ঠিক যেমন আপনার কোনও সংখ্যা প্রক্রিয়া থাকতে পারে ...?
  • এটি কি ডিস্ট্রো থেকে ডিস্ট্রোতে আলাদা মূল্য?
  • যদি আমরা উপরের সীমাটিতে আঘাত করি এবং অন্য একটি জম্বি তৈরি করার চেষ্টা করি তবে কী ঘটে?

1
এই ব্লগ আর্টিকেল অনুসারে লিনাক্সের একমাত্র সীমা হল পিআইডি সংখ্যা, যা ঘটনাক্রমে জম্বিগুলিকেই প্রভাবিত করে।
বাহামাত

2
নীচে উভয় উত্তর উল্লেখ ulimit -u। আমার কিছু man ulimitউল্লেখ না করে একটি সি রুটিন পেয়ে আমি কিছুক্ষণের জন্য বিভ্রান্ত হয়ে পড়েছিলাম -u। উল্লিখিত উলিমিতটি আসলে একটি অন্তর্নির্মিত বাশ সরঞ্জাম এবং এটি ব্যাশ ম্যানপেজে বর্ণিত হয়েছে।
ইমানুয়েল বার্গ

উত্তর:


11

আমার কাছে এইচপি-ইউএক্স উপলব্ধ নেই এবং আমি কখনও বড় এইচপি-ইউএক্স ফ্যান হতে পারি না।

এটি উপস্থিত হয় যে লিনাক্সে, প্রতি-প্রক্রিয়া বা কতগুলি শিশু প্রক্রিয়া বিদ্যমান তার প্রতি ব্যবহারকারী-সীমা হতে পারে। আপনি এটি limitঅন্তর্নির্মিত Zsh দিয়ে দেখতে পাচ্ছেন (মনে হচ্ছে এটি ব্যাশের সাথে সাদৃশ্যপূর্ণ ulimit -u):

1002 % limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       8MB
coredumpsize    0kB
memoryuse       unlimited
maxproc         16136
  ...

এটি একটি আর্চ লিনাক্স ল্যাপটপে রয়েছে।

এই সীমাটি পরীক্ষা করতে আমি একটি ছোট প্রোগ্রাম লিখেছি:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

volatile int sigchld_cnt = 0;

voida
sigchld_hdlr(int signo)
{
        ++sigchld_cnt;
}

int
main(int ac, char **av)
{
        int looping = 1;
        int child_cnt = 0;
        int status;

        signal(SIGCHLD, sigchld_hdlr);

        printf("Parent PID %d\n", getpid());

        while (looping)
        {
                switch (fork())
                {
                case 0:
                        _exit(0);
                        break;
                case -1:
                        fprintf(stderr, "Problem with fork(), %d children: %s\n",
                                child_cnt, strerror(errno));
                        looping = 0;
                        break;
                default:
                        ++child_cnt;
                        break;
                }
        }

        fprintf(stderr, "Sleeping, forked %d child processes\n", child_cnt);
        fprintf(stderr, "Received %d sigchild\n", sigchld_cnt);
        sleep(10);

        looping = 1;
        do {
                int x = wait(&status);

                if (x != -1)
                        --child_cnt;
                else if (errno != EINTR) {
                        fprintf(stderr, "wait() problem %d children left: \%s\n",
                                child_cnt, strerror(errno));
                        looping = 0;
                }
        } while (looping);

        printf("%d children left, %d SIGCHLD\n", child_cnt, sigchld_cnt);

        return 0;
}

wait(2)পর্যাপ্ত সময় কল করে সমস্ত জম্বি "সংগ্রহ" করা আশ্চর্যজনকভাবে কঠিন ছিল । এছাড়াও, প্রাপ্ত সিআইসিএইচএলডি সংকেতগুলির সংখ্যা কখনই শিশুদের প্রক্রিয়াজাতের সংখ্যার মতো হয় না: আমি বিশ্বাস করি যে লিনাক্স কার্নেলটি কখনও কখনও প্রচুর উত্সাহিত শিশু প্রসেসের জন্য 1 এসএইচসিএলডি প্রেরণ করে।

যাইহোক, আমার আর্চ লিনাক্স ল্যাপটপে, আমি 16088 শিশু প্রসেসগুলি কাঁটাচামচ করে পেয়েছি এবং এটি জম্বি সংখ্যা হতে হবে, কারণ প্রোগ্রামটি wait(2)সিগন্যাল হ্যান্ডলারে সিস্টেম কল করে না ।

আমার স্ল্যাকওয়ার 12 সার্ভারে, আমি 6076 শিশু প্রক্রিয়াগুলি পাই যা মানটির সাথে ঘনিষ্ঠভাবে মেলে maxproc 6079। আমার ব্যবহারকারীর আইডিতে আরও 2 টি প্রক্রিয়া চলছে sshdএবং জেডএস। উপরের প্রোগ্রামটির প্রথমটি, নন-জম্বি উদাহরণ সহ যা 6079 করে।

fork(2)সিস্টেম কল একটি "রিসোর্স সাময়িকভাবে অনুপলব্ধ" ত্রুটি সহ ব্যর্থ। কী সংস্থান অনুপলব্ধ রয়েছে তার অন্য কোনও প্রমাণ আমি দেখতে পাচ্ছি না। আমি যদি আমার প্রোগ্রামটি 2 টি ভিন্ন এক্সটারমে একযোগে চালিত করি তবে কিছুটা আলাদা নম্বর পাই তবে তারা একই সংখ্যায় যুক্ত হয় যেন আমি এটি এক xterm তে চালাই। আমি ধরে নিলাম এটি সারণী এন্ট্রিগুলি, বা অদলবদল বা কিছু সিস্টেম-বিস্তৃত উত্স প্রক্রিয়া করে, এবং কেবল একটি স্বেচ্ছাসেবী সীমা নয়।

এই মুহূর্তে এটি চেষ্টা করার জন্য আমার আর কিছু চালাচ্ছে না।


4

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

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


2

আমি মনে করি আপনার কাছে এমন অনেকগুলি জম্বি থাকতে পারে ঠিক যেমন আপনার কোনও সংখ্যা প্রক্রিয়া থাকতে পারে ...?

একটি জম্বি প্রক্রিয়াটি শেষ পর্যন্ত একটি প্রক্রিয়া - একটি বিশেষ রাজ্যের মধ্যে- তবে জম্বি প্রক্রিয়াগুলি নিয়মিত প্রক্রিয়া হিসাবে প্রসেস টেবিলের প্রাপ্যতা এবং আকারের মধ্যে সীমাবদ্ধ থাকে ।

এটি কি ডিস্ট্রো থেকে ডিস্ট্রোতে আলাদা মূল্য?

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

যদি আমরা উপরের সীমাটিতে আঘাত করি এবং অন্য একটি জম্বি তৈরি করার চেষ্টা করি তবে কী ঘটে?

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


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