Максимальное количество файловых дескрипторов

Я наконец-то нашел, как решить эту проблему.

Вам нужно отредактировать /usr/portage/profiles/base/use.stable.mask и закомментировать следующие строки:

python_targets_python3_5
python_single_target_python3_5

И вот:

sudo emerge --ask dev-python/google-api-python-client

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] dev-python/six-1.10.0  PYTHON_TARGETS="python3_5*" 
[ebuild   R    ] dev-python/setuptools-20.6.7  PYTHON_TARGETS="python3_5*" 
[ebuild   R    ] dev-python/certifi-2015.11.20  PYTHON_TARGETS="python3_5*" 
[ebuild     U ~] dev-python/pyasn1-0.1.9 [0.1.8] PYTHON_TARGETS="python3_5%*" 
[ebuild  N    ~] dev-python/httplib2-0.9.2-r1  PYTHON_TARGETS="python2_7 python3_4 python3_5 -pypy -pypy3" 
[ebuild   R    ] dev-python/pbr-1.10.0  PYTHON_TARGETS="python3_5*" 
[ebuild  N     ] dev-python/simplejson-3.8.1  PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)" 
[ebuild  N     ] dev-python/uritemplate-0.6  PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)" 
[ebuild  N    ~] dev-python/pyasn1-modules-0.0.8  PYTHON_TARGETS="python2_7 python3_4 python3_5 -pypy -pypy3" 
[ebuild  N     ] dev-python/linecache2-1.0.0  USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)" 
[ebuild  N     ] dev-python/traceback2-1.4.0  PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)" 
[ebuild  N     ] dev-python/rsa-3.2.3-r1  USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy)" 
[ebuild  N     ] dev-python/oauth2client-2.0.1  USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy)" 
[ebuild  N     ] dev-python/google-api-python-client-1.5.0  USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 (-pypy)" 

UPDATE: Эти изменения будут перезаписаны обновлениями системы, поэтому вам нужно обновить /etc/portage/profile/use.stable.mask следующими строками:

-python_targets_python3_5
-python_single_target_python3_5

Спасибо jansegre с Reddit.

2
30.06.2017, 01:57
2 ответа

Корпус

while true ; do cat > $(( $RANDOM * $RANDOM )).file & done;Вы, вероятно, достигнете предела максимального процесса, если не root. Если это так, используйте один процесс perl для открытия файлов. Вы можете понизить maxfiles с помощью sysctl, хотя я не знаю эту переменную с руки -.

1
27.01.2020, 22:03

Это сделает это (примерно за 40 секунд в моей системе):

#!/bin/bash
[ "$BASHPID" = "$$" ] || { echo "Must run in a new process group"; exit 1; }>&2
cnt0() { cnt0=$#; }
cnt1() { cnt1=$#; }

tmpd=
trap 'rm -rf "$tmpd"; exit 1' INT HUP QUIT EXIT
tmpd=$(mktemp -d)
mkfifo "$tmpd/fifo"
exec 4<>"$tmpd/fifo"
rm -rf "$tmpd"
trap - INT HUP QUIT EXIT


open_all()
{ 
    cnt0 /proc/self/fd/*; 
    while exec {fd}</dev/null; do :; done; 
    cnt1 /proc/self/fd/*;
    nopened=$((cnt1-cnt0));
    echo $nopened >&4;
    cat /proc/sys/fs/file-nr
    if ((nopened)); then
        sleep 10000000
    fi
}

( open_all )&
while :; do
    if read nopened <&4 && ((nopened)); then
        ( open_all )&
        continue
    fi
    break
done
kill -TERM -$$

Он работает, открывая /dev/nullв подоболочке столько раз, сколько возможно (он должен работать примерно 1000 -4000 раз в зависимости от вашегоulimit -n). Если хотя бы один файловый дескриптор был открыт, родитель уведомляется через конвейер, а подоболочка приостанавливается с помощью sleep. Родительский процесс отвечает на успешное выделение fd -в дочернем процессе, продолжая процесс в другой подоболочке до тех пор, пока одна из подоболочек не выйдет из строя.

/proc/sys/fs/file-nrвызывается catна каждой итерации, чтобы вы знали, как продолжается процесс.

В конце процесса вы должны получить что-то вроде:

...
778192  0       786806
779248  0       786806
780272  0       786806
781264  0       786806
782256  0       786806
783280  0       786806
784304  0       786806
785328  0       786806
786352  0       786806
./open_all: line 35: cannot redirect standard input from /dev/null: Too many open files in system
./open_all: line 18: fd: Too many open files in system
Terminated

Одна интересная вещь, которую я узнал из этого, заключается в том, что дублированные файловые дескрипторы (из dup или fork )не учитываются при достижении предела (порождение процесса из родительского процесса с большим количеством файловых дескрипторов не увеличивает количество ).

2
27.01.2020, 22:03

Теги

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