Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Вперед Назад Содержание

22. DISKD

22.1 Что такое DISKD?

DISKD относится к некоторым доп. возможностям Squid-2.4 для улучшения выполнения операций чтения/записи на диск. Основаная идея - каждая cache_dir имеет собственный обслуживающий дочерний процесс diskd. Процесс diskd выполняет все дисковые операции ввода/вывода (open, close, read, write, unlink) для cache_dir. Очереди сообщений используются для отправки запросов и ответов между Squid и процесами diskd. Распределенная память используется для хранения частей данных, которые будут прочитаны и записаны.

22.2 Это работает лучше ?

Да. Мы тестировали Squid-2.4 с DISKD на Second IRCache Bake-Off. Результаты также описаны здесь. На bakeoff мы получили 160 запросов/сек с diskd. Без diskd мы получили бы около 40 запросов/сек.

22.3 Как мне использовать это?

Вам необходисо запустить Squid версии 2.4 или более поздней. Ваша ОС должна поддерживать очереди сообщений и распределение памяти.

Чтобы отконфигурить Squid для работы с DISKD, используйте опцию --enable-storeio:

% ./configure --enable-storeio=diskd,ufs

22.4 FATAL: Unknown cache_dir type 'diskd'

Вы не указали diskd в списке модулей storeio modules как описано выше. Вам необходимо запустить configure и перекомпилировать Squid.

22.5 If I use DISKD, do I have to wipe out my current cache?

Нет. Diskd использует туже схему хранения что и стандартная "UFS". Он только изменяет выполнение операций ввода/вывода.

22.6 Как мне настроить очереди сообщений?

Большинство ОС Unix поддерживают очередь сообщений по умолчанию. Один из путей проверить - это посмотреть, есть ли у вас команда ipcs.

Вам возможно понадобится увеличить параметры очереди сообщений для Squid. Очередь сообщений обычно имеет следующие параметры:

MSGMNB

Макс. количество байт на очередь сообщений.

MSGMNI

Макс. количество идентификаторов очереди сообщений (system wide).

MSGSEG

Макс. количество сегментов сообщений на очередь.

MSGSSZ

Размер сегмента сообщения.

MSGTQL

Макс. количество сообщений (system wide).

MSGMAX

Макс. размер целого сообщения. На некоторых системах вам возможно понадобится увелечить этот лимит. На других системах вы возможно не сможете изменить его.

Сообщения между Squid и diskd имеют длину в 32 байта для 32-разрядных CPU и 40 байт для 64-разрядных. Поэтому MSGSSZ должно быть равно 32 или более. Вы можете присвоить большое значение, только будте осторожны.

Мы будем иметь две очереди для каждой cache_dir -- одну на каждое направление. Т.е. MSGMNI должно быть в 2 раза больше кол-ва cache_dir's.

Мной обнаружено, что 75 сообщений на очередь есть предел нормального функционирования. Если каждое сообщение diskd состоит только из одного сегмента (зависит от зачения MSGSSZ), то MSGSEG должно быть больше 75.

MSGMNB и MSGTQL отвечают за количество сообщений, находящихся в очереди в одно время. Сообщения Diskd не могут быть больше 40 байт, но позволятеся безопасно использовать 64 байта. MSGMNB должно быть не меньше 64*75. Я рекомендую округлять до ближайшего большего из двух или использовать 8192.

MSGTQL должно быть не менее чем 75 раз больше количества cache_dir, которое вы имете.

FreeBSD

В вашем ядре должна быть опция

options         SYSVMSG

Вы можете установить параметы ядра как указано ниже. Но это только пример. Убедитесь, что значения подходят для вашей системы:

options         MSGMNB=8192     # max # of bytes in a queue
options         MSGMNI=40       # number of message queue identifiers
options         MSGSEG=512      # number of message segments per queue
options         MSGSSZ=64       # size of a message segment
options         MSGTQL=2048     # max messages in system

Digital Unix

Очередь сообщений поддерживается ядром по умолчанию. Установите следующие опции:

options         MSGMNB="8192"     # max # bytes on queue
options         MSGMNI="40"       # # of message queue identifiers
options         MSGMAX="2048"     # max message size
options         MSGTQL="2048"     # # of system message headers

от Brenden Phillips

Если у вас более новая версия (DU64), то вы можете использовать вместо этого sysconfig. Чтобы посмотреть текущие установки IPC, запустите

# sysconfig -q ipc
Чтобы поменять их, создайте файл ipc.stanza с таким содержимым:
ipc:
        msg-max = 2048
        msg-mni = 40
        msg-tql = 2048
        msg-mnb = 8192
после чего сделайте
# sysconfigdb -a -f ipc.stanza 
Необходимо перегрузиться, чтобы изменения возымели эффект.

Linux

При моем ограниченном взляде на Linux, я не вижу другого пути изменить параметры очереди сообщений кроме как поправить заголовочный файл и пересобрать ядро. В моей системе этот файл называется /usr/src/linux/include/linux/msg.h.

Stefan Köpsell сообщает, что если включена поддержка sysctl в вашем ядре, то вы можете поменять следующие значения:

  • kernel.msgmnb
  • kernel.msgmni
  • kernel.msgmax

Solaris

Обратитесь к Demangling Message Queues от Sunworld Magazine.

Не думаю, что указаная выше статья действительно расскажет вам как установить необходимые параметры. Дополните /etc/system такими строками:

set msgsys:msginfo_msgmax=2048
set msgsys:msginfo_msgmnb=8192
set msgsys:msginfo_msgmni=40
set msgsys:msginfo_msgssz=64
set msgsys:msginfo_msgtql=2048

Конечно, необходимо перегрузиться после того как отредактирован /etc/system, перед тем как изменения вступят в силу.

22.7 Как мне настроить распределенную память?

Распередленная память использует набор параметров подобных очереди сообщений. DISKD использует по одной области распределенной памяти для каждой cache_dir. Каждая область распределенной памяти имеет размер около 800 килобайт. Возможно вам придется изменить параметы распределенной памяти для вашей системы:

SHMSEG

Макс. кол-во сегментов распеределенной памяти на процесс.

SHMMNI

Макс. кол-во сегментов распределенной памяти для системы.

SHMMAX

Наибольший допустимый размер сегмента распределенной памяти.

SHMALL

Общее кол-во распереденной памяти, которое может быть использовано.

Для Squid и DISKD, SHMMNI и SHMMNI должны быть больше или равны количеству cache_dir, которое вы имеете. SHMMAX должен быть не меньше 800 килобайт. SHMALL должно быть не меньше SHMMAX 800 килобайт умноженных на кол-во cache_dir.

FreeBSD

В вашем ядре должна быть опция

options         SYSVSHM

Вы можете установить параметы ядра как указано ниже. Но это только пример. Убедитесь, что значения подходят для вашей системы:

options         SHMSEG=16       # max shared mem id's per process
options         SHMMNI=32       # max shared mem id's per system
options         SHMMAX=2097152  # max shared memory segment size (bytes)
options         SHMALL=4096     # max amount of shared memory (pages)

Digital Unix

Очередь сообщений поддерживается ядром по умолчанию. Установите следующие опции:

options         SHMSEG="16"       # max shared mem id's per process
options         SHMMNI="32"       # max shared mem id's per system
options         SHMMAX="2097152"  # max shared memory segment size (bytes)
options         SHMALL=4096       # max amount of shared memory (pages)

от Brenden Phillips

Если у вас более новая версия (DU64), то вы можете использовать вместо этого sysconfig. Чтобы посмотреть текущие установки IPC, запустите

# sysconfig -q ipc
Чтобы поменять их, создайте файл ipc.stanza с таким содержимым:
ipc:
        shm-seg = 16
        shm-mni = 32
        shm-max = 2097152
        shm-all = 4096
потом запустите
# sysconfigdb -a -f ipc.stanza 
Необходимо перегрузиться, чтобы изменения возымели эффект.

Linux

При моем ограниченном взляде на Linux, я не вижу другого пути изменить параметры очереди сообщений кроме как поправить заголовочный файл и пересобрать ядро. В моей системе этот файл называется /usr/src/linux/include/asm-i386/shmparam.h

Выглядит неплохо, вы можете изменить значение SHMMAX записав его в файл /proc/sys/kernel/shmmax.

Stefan Köpsell сообщает, что если ваше ядро скомпилировано с поддержкой sysctl, то вы можете изменить следующие значения:

  • kernel.shmall
  • kernel.shmmni
  • kernel.shmmax

Solaris

Обратитесь к Shared memory uncovered от Sunworld Magazine.

Чтобы установить значения, поместите в файл /etc/system следующие строки:

set shmsys:shminfo_shmmax=2097152
set shmsys:shminfo_shmmni=32
set shmsys:shminfo_shmseg=16

22.8 Иногда распределенная память и очереди сообщений не освобождаются, когда Squid завершает работу.

Да, иногда возникает такая проблемка. Выглядит как будто операционная система запутывается и не всегда освобождает ресурсы распередленной памячти и очереди сообщений, когда поцесс завершает работу, особенно если они ненормально завершаются. Чтобы исправить ситуацию, вы можете вручную освобождать ресурсы командой ipcs. Добавьте следующую команду в ваш RunCache или squid_start скрипт:

ipcs | grep '^[mq]' | awk '{printf "ipcrm -%s %s\n", $1, $2}' | /bin/sh

22.9 Что за параметры Q1 и Q2?

В исходном коде это называется magic1 и magic2. Эти числа отвечают за количество необработанных запросов в очереди сообщений. Они указываются в строке cache_dir после директорий L1 и L2 :

cache_dir diskd /cache1 1024 16 256 Q1=72 Q2=64

Если не обработано более чем Q1 сообщений, то Squid принудительно не станет открывать файлы для чтения и записи. Это механизм снижения нагрузки. Если ваш кеш действительно очень-очень занят и процессы diskd не могут поддерживать высокую производительность, то Squid будет пропускать их обслуживание пока нагузка снова не спадет.

Если не обработано более чем Q2 сообщений, то главный процесс Squid ``блокируется'' ненадолго, пока процесс diskd обслуживает некоторые сообщения и посылает некоторые ответы.

Q1 должно быть больше чем Q2, если вы хотите, чтобы Squid достигал состояния ``блокирования'' прежде, чем он получит ``отказ в открытии файла''.

Разумные значения для Q1 и Q2 - 72 and 64 соответсвенно.


Вперед Назад Содержание