С помощью команды vmtune можно изменить параметры VMM, управляющие работой подсистем памяти. Часть из них позволяют изменить значения по умолчанию для LVM и файловых систем. Другие параметры относятся к дисковому вводу-выводу. Они описаны в следующих разделах.
Для того чтобы узнать, установлена ли в системе команда vmtune, вызовите следующую команду:
# lslpp -lI bos.adt.samples
Исполняемый файл команды vmtune расположен в каталоге /usr/samples/kernel. Команду vmtune разрешено вызывать только пользователю root. Изменения, внесенные с помощью этой команды, действуют до следующей загрузки системы. Для внесения изменений на постоянной основе добавьте соответствующую запись в файл /etc/inittab. Например:
vmtune:2:wait:/usr/samples/kernel/vmtune -P 50
Примечание: Команда vmtune расположена в каталоге samples, так как она в значительной мере зависит от реализации VMM. Команда vmtune может применяться только с приложением VMM, относящимся к тому же выпуску операционной системы, что и команда. Запуск команды vmtune в системе с приложением VMM, относящимся к другому выпуску, может привести к сбою в работе операционной системы. Кроме того, в разных выпусках операционной системы команда vmtune выполняет различные функции. Перед изменением параметров системы с помощью команды vmtune ознакомьтесь с соответствующей информацией о настройке.
Функция упреждающего чтения VMM, описанная в разделе Упреждающее чтение с последовательным доступом к данным, позволяет повысить производительность программ, применяющих последовательный способ доступа при работе с большими файлами.
Только в редких случаях производительность можно повысить путем настройки функции упреждающего чтения или ее выключения. Тем не менее, для анализа производительности необходимо знать принципы взаимодействия этой функции с приложениями и ее влияние на другие параметры дискового ввода-вывода. Ниже приведен типичный пример.
Рис. 8-3. Пример упреждающего чтения с последовательным доступом к данным. На этом рисунке показана группа блоков, изображающих сегменты страниц файла. Сегменты содержат страницы 0, 1-3, 4-7, 8-15 и 16-23. Принцип работы алгоритма упреждающего чтения описан ниже.
В данном случае значение minpgahead равно 2, а значение maxpgahead равно 8 (значения по умолчанию). Программа последовательно обрабатывает файл. На рисунке показаны только те ссылки (от A до F), которые имеют отношение к операции упреждающего чтения. Она разбивается на следующие этапы:
Если программа прекращает последовательную обработку файла и обращается не к следующей по порядку странице, процесс последовательного упреждающего чтения прекращается. Если VMM обнаружит, что программа вернулась к последовательному чтению страниц, то функция упреждающего чтения будет снова включена, и в первый раз будет считано minpgahead страниц.
Значения minpgahead и maxpgahead можно изменить с помощью опций -r и -R команды vmtune. При этом следует помнить следующее:
Алгоритм отложенной записи асинхронно выгружает измененные страницы из оперативной памяти на диск после достижения порогового значения, не дожидаясь запуска демона syncd. За счет этого уменьшается число страниц в памяти, ожидающих выгрузки, снижается общая нагрузка на систему и уменьшается фрагментация диска. Существует два вида отложенной записи: для случая последовательного и произвольного доступа.
По умолчанию файл делится на разделы размером 16 Кб, содержащие по 4 страницы. Такие разделы называются кластерами. Если были изменены все 4 страницы из кластера, то при изменении страницы в другом кластере планируется выгрузка исходного кластера на диск. Если функция отложенной записи не применяется, то страницы остаются в памяти до вызова демона syncd, что приводит к резкому увеличению нагрузки на диск и фрагментации файла.
Вы можете изменить число кластеров, применяемых VMM в качестве порогового значения. Значение по умолчанию равно единице. Для того чтобы отложенная запись выполнялась позднее, увеличьте значение numclust с помощью команды vmtune -c.
Некоторые приложения выполняют большое число операций ввода-вывода с произвольным доступом к данным. Такой способ доступа несовместим с алгоритмом отложенной записи, поэтому все измененные страницы остаются в памяти до вызова демона syncd. Если в оперативной памяти находится много страниц, измененных приложением, то при вызове функции sync() демоном syncd на диск будет одновременно выгружено большое число страниц.
В алгоритме отложенной записи предусмотрена возможность задать ограничение для числа измененных страниц файла в памяти, при достижении которого планируется выгрузка измененных страниц на диск.
Это пороговое значение можно изменить с помощью опции -W команды vmtune. При этом будет изменено значение параметра maxrandwrt. Значение по умолчанию равно 0, то есть при произвольном доступе к данным функция отложенной записи выключена. Если этому параметру будет присвоено значение 128, то все измененные страницы файла, начиная со 129, будут выгружаться на диск. Первая группа страниц будут выгружена после вызова sync().
Если при записи данных в файл JFS применялся произвольный способ доступа, то эти данные будут выгружены из памяти при выполнении одного из следующих условий:
Если в памяти накопится слишком много страниц до того, как будет выполнено одно из перечисленных выше условий, то при вызове демона syncd i-узел блокируется до тех пор, пока на диск не будут выгружены все измененные страницы файла. Все нити, обращающиеся к файлу во время выгрузки страниц, будут блокированы, так как они не смогут заблокировать i-узел файла. Демон syncd выгрузит все измененные страницы файла. Если в системе с большим объемом оперативной памяти накопится много измененных страниц, то при запуске демона syncd резко возрастет число операций ввода-вывода.
В AIX версии 4.3.2 была добавлена опция sync_release_ilock. Команда vmtune с опцией -s позволяет разрешить освобождение блокировки i-узла во время выгрузки измененных страниц файла (1 означает, что i-узел должен освобождаться при выгрузке измененных страниц, 0 означает, что i-узел будет заблокирован все время). Эта опция позволяет уменьшить время ответа при обращении к файлу во время работы функции sync().
Для того чтобы уменьшить негативный эффект, связанный с блокировкой i-узла, увеличьте частоту, с которой демон syncd вызывает функцию sync. Для этого измените параметр демона syncd в файле /sbin/rc.boot. Для того чтобы внесенное изменение вступило в силу, перезагрузите систему. Для того чтобы изменить это значение в работающей системе, убейте процесс демона syncd и перезапустите его, указав новый интервал запуска функции.
Кроме того, вы можете изменить параметры функции отложенной записи, применяемой при произвольном доступе, с помощью команды vmtune (за дополнительной информацией обратитесь к разделу Алгоритм отложенной записи VMM).
С помощью команды vmtune можно настроить следующие параметры дискового ввода-вывода:
Если к файловой системе одновременно поступает большое число обращений, либо из файловой системы последовательно считываются или записываются большие объемы данных, то операции ввода-вывода в этой файловой системе могут выполняться медленно из-за нехватки структур bufstruct. Число структур bufstruct, создаваемых для каждой файловой системы, (параметр numfsbufs) можно изменить с помощью команды vmtune -b. Новое значение вступает в силу только при монтировании файловой системы. Следовательно, для применения нового значения нужно размонтировать и снова смонтировать файловую систему. По умолчанию значение параметра numfsbufs равно 93.
Если приложение записывает большие объемы данных сразу на диск, минуя файловую систему, то операции ввода-вывода могут выполняться медленно из-за задержек, возникающих на уровне LVM. Это особенно характерно для случае чтения или записи большого объема данных при работе с диском с высокой производительностью. При возникновении задержек на уровне LVM рекомендуется увеличить значение параметра lvm_bufcnt с помощью команды vmtune -u. Это значение задает число буферов uphysio. Изменение вступает в силу немедленно. По умолчанию число буферов uphysio равно 9. Поскольку LVM считывает и записывает данные блоками по 128 Кб, и значение lvm_bufcnt по умолчанию равно 9, то за одну операцию может быть записано 9*128 Кб данных. При записи данных большего объема рекомендуется увеличить значение параметра lvm_bufcnt.
Параметр hd_pbuf_cnt (-B) задает число структур pbuf, доступных драйверу устройства LVM. Структуры pbuf - это буферы в закрепленной памяти, применяемые для хранения запросов на ввод-вывод, еще не обработанных приложением LVM.
В AIX версии 4 последовательные запросы на ввод-вывод объединяются. Это означает, что для каждого последовательного запроса на ввод-вывод применяется один буфер pbuf, независимо от числа страниц, указанных в этом запросе. Такую причину снижения производительности обнаружить достаточно сложно. В случае ввода-вывода с произвольным доступом к данным страницы выгружаются на диск случайным образом (при условии, что не запущен демон syncd).
Для того чтобы узнать, достаточно ли в системе структур pbuf, просмотрите значение переменной LVM hd_pendkblked. Для просмотра этого значения можно воспользоваться следующим сценарием:
#!/bin/ksh # разрешено запускать только пользователю root # указывает, сколько раз с момента загрузки системы в LVM возникали задержки из-за нехватки pbuf addr=`echo "knlist hd_pendqblked" | /usr/sbin/crash 2>/dev/null |tail -1| cut -f2 -d:` value=`echo "od $addr 1 D" | /usr/sbin/crash 2>/dev/null | tail -1| cut -f2 -d:` echo "Число задержек LVM из-за нехватки pbuf: $value" exit 0
В AIX 4.3.3 и выше значение параметра hd_pendqblked можно узнать с помощью команды vmtune -a (за дополнительной информацией обратитесь к разделу fsbufwaitcnt и psbufwaitcnt).
Примечание: Не присваивайте параметру hd_pbuf_cnt большое значение, так как его можно уменьшить только путем повторной загрузки системы.
Задает число страниц, которые будут удалены из памяти одним блоком при удалении файла. Изменять значение этого параметра имеет смысл только для приложений, выполняющихся в режиме реального времени. Уменьшение значения pd_npages позволяет сократить время ответа в таких приложениях за счет того, что до возобновления работы нити или процесса система успеет удалить меньшее число страниц. По умолчанию значение этого параметра равно максимальному размеру файла, поделенному на размер страницы (4096). Если максимальный размер файла составляет 2 Гб, то значение pd_npages по умолчанию равно 524288. Для изменения этого значения предназначена опция -N.
Если параметр v_pinshm равен 1 (-S 1), и при вызове функции shmget() был задан флаг SHM_PIN, то страницы в общем сегменте памяти будут закреплены. Значение по умолчанию равно 0. Эта опция предусмотрена в операционной системе версии 4.3.3 и выше.
В приложении может быть предусмотрен параметр, указывающий, нужно ли задавать флаг SHM_PIN (например, в Oracle 8.1.5 и выше для этого предусмотрен параметр lock_sga). Не рекомендуется закреплять большое число страниц, поскольку это может привести к запуску алгоритма замены страниц. Однако закрепление страниц позволяет повысить эффективность выполнения асинхронных операций ввода-вывода при работе с общими сегментами памяти (для закрепления буфера в памяти расширение ядра для поддержки асинхронного ввода-вывода не требуется).
В AIX 4.3.3 появилось два новых счетчика, которые увеличиваются при отсутствии свободной структуры bufstruct и при помещении нити в список ожидающих нитей VMM. Значения счетчиков fsbufwaitcnt и psbufwaitcnt можно просмотреть с помощью команды crash и с помощью команды vmtune с опцией -a. Ниже приведен пример вывода команды:
# vmtune -a hd_pendqblked = 305 psbufwaitcnt = 0 fsbufwaitcnt = 337