|
Начало Сетевая часть HTTP Proxy Squid
Не хватает файловых дескрипторов Это бывает, когда появляется сообщение Too many open files. Возможно
из-за операционной системы с низким числом файловых дескрипторов. Этот
предел обычно можно задать в ядре или при помощи других средств. Существует
два пути исчерпать лимит файловых дескрипторов: первый, это лимит на каждый
процесс, второй - на общее число дескрипторов на все процессы.
Для Linux, есть патч filehandle.patch.linux
от Michael O'Reilly .
Для Solaris, добавьте следующее в файл /etc/system:
set rlim_fd_max = 4096
set rlim_fd_cur = 1024
Также следует задать #define SQUID_FD_SETSIZE в include/config.h
в то же значение, что и rlim_fd_max. Не следует задавать меньше
4096.
Solaris select(2) позволяет задать только 1024 дескриптора,
если надо больше отредактируйте src/Makefile и разрешите $(USE_POLL_OPT).
Потом пересоберите squid.
Для FreeBSD (от Torsten Sturm ):
-
Как узнать максимальное значение файловых дескрипторов?
-
По команде sysctl -a значение kern.maxfilesperproc.
-
Как их увеличить?
-
sysctl -w kern.maxfiles=XXXX
sysctl -w kern.maxfilesperproc=XXXX
Внимание: Увеличивая значения, учитывайте соотношение
maxfiles > maxfilesperproc.
-
Какой верхний предел?
-
Я не думаю, что есть формальное ограничение внутри ядра. Ведь структуры
под данные выделяются динамически. На практике же, могут возникать непонятные
явления (например, ядро будет тратить слишком много времени на поиск в
таблицах).
Для большинства BSD-систем (SunOS, 4.4BSD, OpenBSD, FreeBSD, NetBSD, BSD/OS,
386BSD, Ultrix) можно решить задачу "в лоб" (требуется пересборка ядра):
-
Как узнать максимальное значение файловых дескрипторов?
-
По команде pstat -T значение files, обычно отображаемое
как отношение current/maximum.
-
Как увеличить это значение?
-
Первый метод - увеличить значение переменной maxusers в конфигурации
ядра и пересобрать его. Это очень быстрый и простой метод, но приводит
к увеличению ряда других переменных, менять которые Вам может и не надо.
-
А существует более точный способ?
-
Найти файл param.c в исходниках ядра и изменить соотношение между
maxusers и максимальным числом открытых файлов по нижеприведенным
выражениям.
Вот несколько примеров:
-
SunOS
-
Измените значение nfile в /usr/kvm/sys/conf.common/param.c
меняя значения в этом выражении:
int nfile = 16 * (NPROC + 16 + MAXUSERS) / 10 + 64;
Где NPROC определяется как:
#define NPROC (10 + 16 * MAXUSERS)
-
FreeBSD (начиная с ядра 2.1.6)
-
Очень похоже на SunOS, отредактируйте /usr/src/sys/conf/param.c
вычислив соотношение между переменными maxusers, maxfiles
и maxfilesperproc:
int maxfiles = NPROC*2;
int maxfilesperproc = NPROC*2;
Где NPROC задан как:
#define NPROC (20 + 16 * MAXUSERS)
Ограничение числа дескрипторов на процесс также может быть задано в
конфигурации ядра этой директивой:
options OPEN_MAX=128
-
BSD/OS (начиная с ядра 2.1)
-
Поправьте /usr/src/sys/conf/param.c и задайте maxfiles
в соответствии с:
int maxfiles = 3 * (NPROC + MAXUSERS) + 80;
Где NPROC задан как:
#define NPROC (20 + 16 * MAXUSERS)
Также следует задать значение OPEN_MAX, чтобы изменить ограничение
числа дескрипторов на процесс.
Замечание: После пересборки ядра необходимо откомпилировать заново
Squid. Конфигурационный скрипт Squid'а определяет сколько файловых дескрипторов
доступно, так что надо запустить скрипт заново. Например:
cd squid-1.1.x
make realclean
./configure --prefix=/usr/local/squid
make
Создано: Gleb Smirnoff
|