невозможно создать новый собственный поток или ресурс, временно недоступный после 10 000 потоков

Puede hacer esto en Linux. Digamos que hay un guións:

#!/bin/bash
i=0
echo my pid: "$$"
while true; do
    echo "$i"; ((i++)); sleep 1; 
done

Ejecútalo:

$./s
my pid: 8815
0
1
2

Y así sigue... Ahora necesita gdbpara adjuntar al proceso.

gdb -p 8815

Ahora estás en gdb. Aquí haz esto:

p close(1)

Esto ha cerrado el descriptor de archivo STDOUT. Ahora abre uno nuevo:

p creat("/tmp/8815.out", 0600)

En otra terminal ya puedes configurar el proceso de lectura:

tail -f /tmp/8815.out

Todavía no llega nada, ya que debe desconectarse de gdben la otra terminal. Ya sea Ctl + D , o:

q
Quit anyway? (y or n) 

Confirme con yy Introduzca . Y ahora deberías ver (donde tailse está ejecutando )algo como esto:

173
174
175

Si prefiere usar un archivo o tubería ya existente, hágalo engdb:

p open("/path/to/your/output", 1)

Esto ilustra la redirección de STDOUT. Es similar con STDERR, solo que tiene el número 2.


Usé estas dos respuestas:

4
21.06.2019, 15:42
2 ответа

Проблема заключалась в ограничениях systemd cgroup ...

Я проверил "/sys/fs/cgroup/pids/user.slice/user -$UID.slice/pids.max", и там было 10,813. Подняли до 15000 и темы выделили.

Таким образом, Systemd также использует cgroup для ограничения ресурсов и потоков...

этот пост был путем к истине!

https://askubuntu.com/questions/845380/bash-fork-retry-resource-temporarily-unavailable/883677#883677

3
27.01.2020, 20:59

Хотя полезно знать, каковы ограничения ресурсов в данной системе, одного этого недостаточно, чтобы определить основную причину ошибки при попытке создать так много собственных потоков. е Что еще более... интересно, ошибка, которую вы получаете от pthread_create(), говорит вам только о том, что вы превысили пределы ресурсов. Ценная часть информации, которую он не сообщает вам, заключается в том, какие ресурсы (с )были превышены:

EAGAIN - Insufficient resources to create another thread, or a system-imposed limit on the number of threads was encountered. The latter case may occur in two ways: the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number of process for a real user ID, was reached; or the kernel's system-wide limit on the number of threads, /proc/sys/kernel/threads-max, was reached. source: https://linux.die.net/man/3/pthread_create

К сожалению, это означает, что вам придется выполнять утомительную ручную отладку, чтобы -указать, какие ограничения ресурсов вызывают вашу проблему.

Боковое примечание:Java Threadреализованы с собственными потоками операционной системы, которые в Linux представляют собой потоки POSIX (pthreads ). То же самое с C, отсюда и схожие симптомы.

Альтернатива

Альтернативой, которая может подойти вам и лучше использовать ваше время, является использование легких -нитей (ака. зеленые нитки ). В отличие от упреждающей потоковой модели собственных потоков (, например. pthreads ), в которых ядро ​​Linux отвечает за переключение между потоками, легкие -потоки являются кооперативными , что означает, что легкие -потоки должны уступать основному потоку через равные промежутки времени. чтобы сохранить ощущение нескольких потоков выполнения.

Хотя на первый взгляд эта модель может показаться неполноценной, большое преимущество легких -потоков заключается в том, что обычно вы можете иметь ~100 000 потоков с минимальным воздействием на доступные ресурсы. Очевидно, что если вы, скажем, откроете файл в каждом из этих легких -потоков, вы вернетесь к тому, с чего начали, но я рекомендую покопаться в легких -потоках, чтобы увидеть, является ли это жизнеспособным решением для ты.

0
27.01.2020, 20:59

Теги

Похожие вопросы