Apakah ada batas atas jumlah proses zombie yang bisa Anda miliki?

17

Saya dulu bekerja dengan sistem HP-UX dan admin lama mengatakan kepada saya ada batas atas jumlah proses zombie yang dapat Anda miliki di sistem, saya percaya 1024.

  • Apakah ini fakta yang sulit? Saya pikir Anda bisa memiliki sejumlah zombie sama seperti jika Anda dapat memiliki sejumlah proses ...?
  • Apakah nilainya berbeda dari distro ke distro?
  • Apa yang terjadi jika kita mencapai batas atas dan mencoba membuat zombie lain?
Amatir Profesional
sumber
1
Menurut artikel blog ini satu-satunya batasan di Linux adalah jumlah PID, yang hanya mempengaruhi zombie secara kebetulan.
bahamat
2
Kedua jawaban di bawah ini disebutkan ulimit -u. Saya bingung untuk sementara waktu karena man ulimitmemberi saya rutin C tanpa menyebutkan -u. Ulimit yang disebutkan sebenarnya adalah alat bash bawaan dan dijelaskan dalam halaman manual bash.
Emanuel Berg

Jawaban:

11

Saya tidak memiliki HP-UX yang tersedia untuk saya, dan saya tidak pernah menjadi penggemar HP-UX yang besar.

Tampaknya di Linux, batas per proses atau mungkin per pengguna pada berapa banyak proses anak ada. Anda dapat melihatnya dengan limitZsh built-in (tampaknya analog dengan ulimit -ubash):

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

Itu ada di laptop Arch linux.

Saya menulis sebuah program kecil untuk menguji batas itu:

#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;
}

Secara mengejutkan sulit untuk "mengumpulkan" semua zombie dengan memanggil wait(2)waktu yang cukup. Juga, jumlah sinyal SIGCHLD yang diterima tidak pernah sama dengan jumlah proses anak bercabang: Saya percaya kernel linux kadang-kadang mengirimkan 1 SIGCHLD untuk sejumlah proses anak yang sudah keluar.

Bagaimanapun, pada laptop Arch linux saya, saya mendapatkan proses anak 16088 bercabang, dan itu harus menjadi jumlah zombie, karena program tidak melakukan wait(2)panggilan sistem dalam penangan sinyal.

Di server Slackware 12 saya, saya mendapatkan 6076 proses anak, yang sangat cocok dengan nilai maxproc 6079. ID pengguna saya memiliki 2 proses lain yang berjalan, sshddan Zsh. Seiring dengan contoh pertama, non-zombie dari program di atas yang membuat 6079.

The fork(2)system call gagal dengan "Resource sementara tidak tersedia" kesalahan. Saya tidak melihat bukti lain dari sumber daya apa yang tidak tersedia. Saya mendapatkan angka yang agak berbeda jika saya menjalankan program saya secara bersamaan dalam 2 xterms berbeda, tetapi mereka menambahkan ke nomor yang sama seperti jika saya menjalankannya dalam satu xterm. Saya menganggap itu entri tabel proses, atau swap atau sumber daya seluruh sistem, dan bukan hanya batas yang sewenang-wenang.

Saya tidak punya hal lain yang berjalan untuk mencobanya sekarang.

Bruce Ediger
sumber
4

Saya tidak tahu apa batas HP-UX itu. Namun saya dapat memberitahu Anda bahwa implementasi logis adalah memiliki tabel proses dengan ukuran maksimum. Jumlah total entri tabel proses secara teoritis dibatasi oleh rentang ID proses, tetapi sebagian besar implementasi memiliki batas ukuran untuk tabel yang menghasilkan maksimum jauh lebih kecil. Sebagian besar varian unix memiliki batas per pengguna pada jumlah proses juga; Anda dapat melihat batasnya dengan menjalankan ulimit -ubash.

Saya tidak berharap sistem unix memiliki batasan terpisah pada zombie, bukan pada jumlah ID proses (yang mencakup proses aktual dan juga zombie). Jadi ketika sebuah proses mati dan menjadi zombie, itu tidak mempengaruhi batas: sumber daya (entri dalam tabel proses) dialokasikan ketika suatu proses bercabang dan dibebaskan ketika proses itu menuai.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya pikir Anda bisa memiliki sejumlah zombie sama seperti jika Anda dapat memiliki sejumlah proses ...?

Proses zombie akhirnya merupakan proses - dalam keadaan khusus - maka proses zombie terbatas pada ketersediaan dan ukuran tabel proses, seperti untuk proses reguler .

Apakah nilainya berbeda dari distro ke distro?

Tentunya banyak parameter lainnya. Anda tidak boleh menyampaikan pada ukuran tertentu, atau jika itu cukup besar untuk menampung banyak proses zombie. Jika Anda mendapatkan terlalu banyak zombie solusinya bukan meja besar, karena akhirnya akan menjadi penuh. Proses zombie tidak buruk dengan sendirinya, tetapi memiliki terlalu banyak proses zombie yang terakumulasi merupakan indikasi program "berperilaku buruk" yang memungkinkan proses zombie tersebut.

Apa yang terjadi jika kita mencapai batas atas dan mencoba membuat zombie lain?

Setelah tabel proses penuh -dari proses reguler dan zombie-, tidak ada proses -rutin baru yang dapat dibuat, bahkan jika sistem memiliki cukup sumber daya-memori, prosesor, dll-. Satu-satunya sumber daya yang kurang hanyalah satu entri dalam tabel proses. Sudah menjalankan program - bahkan "berperilaku baik" - akan mulai gagal ketika mereka perlu membuat sub-proses. Program-program baru tidak dapat dimulai, dan bahkan menjalankan perintah tunggal akan gagal.

Laurence R. Ugalde
sumber
Even running single commands would fail.-> itu dampak besar.
Shiplu Mokaddim