Библиотека сайта 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
Если у вас более новая версия (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)
Если у вас более новая версия (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 соответсвенно.
Вперед Назад Содержание