Ustawianie maksymalnej liczby uruchomionych procesów

-1

Mam program, który tworzy N procesów, gdzie N jest argumentem wejściowym podanym w linii poleceń. Próbowałem zwiększyć tę wartość i uzyskać fork: Resource temporarily unavailable.

Nawet przy ustawianiu odpowiednich parametrów otrzymałem takie same wyniki na tej samej wartości N.

kern.maxproc
kern.maxprocperuid 

Być może istnieją inne miejsca, do których muszę się odwołać, aby wykonać więcej procesów w mojej stacji.

Wydaje się fork zwraca errno = 23 co znaczy :

#define ENFILE      23      /* Too many open files in system */

Próbowałem również zwiększyć następujące wartości, ale nie pomogło (choć wątpię, czy jest to istotne, ponieważ moje procesy są proste i nie mają dostępu do żadnego pliku)

maxflies
maxfilesperproc

Ponowne uruchomienie komputera, aby nowa konfiguracja była skuteczna, nie pomoże w tym przypadku, ponieważ zmodyfikowane parametry powracają do wartości domyślnej.

Kod źródłowy mojego programu:

void DoWorkInChild() {
    sleep(10);
}

int main (int argc, char *argv[]) {
    pid_t pids[100000];
    int i;
    int n = atoi(argv[1]);
    printf("I'm grandParent %d n = %d \n", getpid(), n);
    /* Start children. */
    for (i = 0; i < n; ++i) {
            if ((pids[i] = fork()) < 0) {
                    printf("errno = %x \n", errno);
                    perror("fork");
                    abort();
            } else if (pids[i] == 0) {
                    DoWorkInChild();
                    exit(0);
            } else {
                    printf("I'm process %d \n", pids[i]);
            }
    }

    /* Wait for children to exit. */
    int status;
    pid_t pid;
    while (n > 0) {
            pid = wait(&status);
            printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
            --n;          
    }
}
Zohar81
źródło
Jak duża jest wartość N? Widziałeś Mac OS X Podpowiedź: Rozwiązanie dla limitów procesowych systemu Mac OS X. ? Czy jesteś twórcą programu tworzącego procesy?
Graham Miln
@ GrahamMiln, próbowałem użyć N = 500, a mam już ~ 320 uruchomionych procesów. gdy ustawisz maxprocperuid = 1024 i maxproc = 2048, powinien działać tak, jak jestem jedynym aktywnym użytkownikiem. Ustawiam również plik /etc/sysctl.conf, ale to nie pomogło (chociaż po restarcie konfiguracja pozostaje).
Zohar81
Dobrze widzieć, że znalazłeś rozwiązanie. Jeśli okaże się, że procesy powodują miażdżenie, rozważ użycie Grand Central Dispatch ustawić w kolejce swoje zadania. GCD uruchomi wtedy tyle, ile masz dostępnych rdzeni - a może nawet być szybszy niż ich uruchomienie na raz.
Graham Miln

Odpowiedzi:

0

Na szczęście znalazłem następujący skrypt, który powinien zostać uruchomiony przed testami porównawczymi xnu.

#!/bin/sh

echo Raising process limits
echo limit maxproc 1000 2000 >> /etc/launchd.conf

echo Done.

Teraz działa, ale nadal nie widać żadnych zmian w / etc / sysctl ... Zastanawiam się, jaka konfiguracja zmieniła się w końcu ...

Zohar81
źródło
1
/etc/launchd.conf został zignorowany od 10.10, kiedy launchd został przeprojektowany, więc nie powinien działać, jeśli nie jesteś w wersji 10.9 lub wcześniejszej.
nisetama