LinuxForum.Fans
Тема

Max opened files error: не удаётся устранить

Автор: Shtirlitc 8 сообщений 2919 просмотров
#112663

Доброго времени суток уважаемые форумчане.
Есть приложение на яве, через N времени после запуска приложения, оно отказывается принимать запросы на соединения от новых пользователей с ошибкой:

[ERROR] 2011-01-02 13:47:33 - Error while accepting connection: +java.io.IOException: Too many open files
java.io.IOException: Too many open files

Сначала думал на ulimit, проверил, ограничение на макс. число открытых файлох стояло 1024. Выставил 819200 открытых файлов:

text
ulimit -n 819200

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

text
sysctl -w fs.file-max=819200

Ошибка продолжает сыпаться. Подскажите в чем ещё может быть причина и как исправить?

Вот ещё информация:

text
# lsof | wc -l
2259
text
 cat /proc/net/sockstat
sockets: used 1055
TCP: inuse 12 orphan 3 tw 17 alloc 1056 mem 1157
UDP: inuse 0 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
text
ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 819200
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
text
 cat /proc/sys/fs/file-nr
1440    0       819200
#112701

Во всяком случае, максимальное число открытых файлов устанавливается не ulimit.
Это /proc/sys/fs/file-max, посмотрите, чему оно равно.
Если оно мало, а у меня оно 202458, то надо увеличить не только его,
см. "man proc", а в нём file-max.
Скорее уж это настройка java.

Пётр.

#112753
Peter написал:
Во всяком случае, максимальное число открытых файлов устанавливается не ulimit.
Это /proc/sys/fs/file-max, посмотрите, чему оно равно.
Если оно мало, а у меня оно 202458, то надо увеличить не только его,
см. "man proc", а в нём file-max.
Скорее уж это настройка java.

Пётр.

Спасибо, Пётр.

Проблема решилась после рестарта сервера. Добавил
fs.file-max=819200 в sysctl.conf("на лету" почему-то не поменялось)
и ulimit -n 819200 в автозагрузку.
3 часа полёт нормальный :)

#113047

После нескольких часов работы сервера ulimit -n опять "скинулся" до 1024 файлов, и опять посыпались ошибки.
Кто-нибудь знает как задать этот лимит "жёстко", так чтобы он не скидывался?

#113118

У меня ulimit в системе вообще нет.
Возможно, здесь надо увеличить максимальное допустимое число открытых
файлов на один процесс. Этого можно добиться, если перекомпилировать ядро,
установив в нём NR_OPEN или INR_OPEN какое надо, у меня в Debian используется
INR_OPEN и оно равно именно 1024. include/linux/fs.h, include/linux/limits.h, либо
запуская каждый раз при старте системы программу, в которой требуемое
значение устанавливается вызовом setrlimit с RLIMIT_NOFILE.
Сам я этого никогда не делал.

Пётр.

#113212

Добавил в /etc/security/limits.conf:

* soft nofile 819200
* hard nofile 819200

Ждём-с.

#113247
Shtirlitc написал:
Ждём-с.

может есть смысл исправить приложение, которое открывает настолько много файлов? ИМХО 1024 более чем достаточно.

(правда у меня 49529. (slackware-13.1))

#113474
drBatty написал:
[quote=Shtirlitc]Ждём-с.

может есть смысл исправить приложение, которое открывает настолько много файлов? ИМХО 1024 более чем достаточно.

(правда у меня 49529. (slackware-13.1))[/quote]
Приложение многопользовательское, при открытии каждого нового коннекта система для этого коннекта открывает сокет. Этот сокет в т.ч. подпадает под ulimint -n , если не ошибаюсь. Поэтому исправить не вариант, к сожалению.
По поводу всех вышеперечисленных способов:
решил костылём - при каждом запуске приложения увеличиваем ulimit -n. Некрасиво, но работает. Где задать этот лимит один раз и навсегда так и не нашёл.

# lsof | wc -l
2259

# cat /proc/net/sockstat
sockets: used 1055
TCP: inuse 12 orphan 3 tw 17 alloc 1056 mem 1157
Войдите или зарегистрируйтесь, чтобы ответить.