Рассмотрим ситуацию, с которой часто сталкиваются системные администраторы при развертывании сервера 1С на базе Linux и PostgreSQL в виртуальной среде Hyper-V. Даже при выделении достаточного объема оперативной памяти производительность системы (например, по тесту Гилева) может оказаться катастрофически низкой. Проанализируем основные причины такого поведения и разберем по шагам, как оптимизировать систему для получения приемлемой скорости работы.
Разберем архитектурную особенность взаимодействия сервера 1С и СУБД. Платформа 1С крайне требовательна к тактовой частоте процессора (желательно от 3.0 ГГц и выше). Если используется низкочастотный процессор (например, 1.1 ГГц), производительность будет упираться в физические ограничения.
Взаимодействие 1С и PostgreSQL строится по принципу "пинг-понга": такт тратится на интерпретацию байт-кода и формирование запроса в 1С, затем запрос передается в SQL. PostgreSQL начинает выполнять запрос, а ядро 1С в это время простаивает. После возврата данных ситуация меняется. При этом PostgreSQL при работе с 1С не умеет распараллеливать выполнение одного тяжелого запроса на несколько ядер. Вся нагрузка ложится на одно ядро. Если система не настроена на максимальную производительность, ядра процессора постоянно сбрасывают и повышают частоту (состояния C-State). Пока ядро "разгоняется" с 0.5 ГГц до номинальной частоты, задача уже передается другому сервису. В итоге система работает на минимальных частотах.
Для исправления этой ситуации выполним следующие настройки:
GOVERNOR="performance", чтобы предотвратить снижение частоты при кратковременных простоях.Проанализируем влияние гипервизора. Hyper-V может существенно снижать производительность гостевых Linux-систем, если виртуальная машина настроена неоптимально.
Подготовим операционную систему Linux к интенсивной работе с данными:
noop или none.vm.overcommit_memory. Это убережет PostgreSQL от принудительного завершения процессом OOM Killer в моменты пиковых нагрузок.Посмотрим на настройки самой СУБД. При использовании медленных SATA-дисков (например, 7200 оборотов) дисковая подсистема становится узким местом. Помимо расчета базовых параметров через утилиты (такие как pgtune), обратим внимание на следующие настройки:
work_mem) PostgreSQL начинает сбрасывать промежуточные данные сложных сортировок во временные файлы на жесткий диск, что вызывает колоссальные тормоза. Значение work_mem необходимо увеличить.fsync и full_page_writes. Также снижение накладных расходов даст отключение online_analyze.Платформа 1С очень интенсивно использует временные таблицы. Перенос временных файлов в оперативную память (RAM-диск) способен дать многократный прирост скорости на слабых дисковых подсистемах.
Рекомендуется перенести на RAM-диск:
stats_temp_directory).temp_tablespaces).snccntx*).Рассмотрим пример скрипта для автоматического создания RAM-дисков под каталоги сессионных данных сервера 1С (без претензий на идеальность, но работающий как простое решение для повышения производительности):
echo $action | /bin/grep -q start ] && {
[ -z $SRV1CV8_USER ] && SRV1CV8_USER=usr1cv8
SRV1CV8_GROUP=`id -gn $SRV1CV8_USER`
[ -z $SRV1CV8_GROUP ] && SRV1CV8_GROUP=grp1cv8
if [ -z $SRV1CV8_DATA ]; then
datadir=`getent passwd $SRV1CV8_USER | /bin/sed 's/.\+:\(\/.\+\):.*/\1/g'`/.1cv8/1C/1cv8
else
datadir=$SRV1CV8_DATA
fi
/usr/bin/install -o $SRV1CV8_USER -g $SRV1CV8_GROUP -d "${datadir}" > /dev/null 2>&1
echo ${datadir} > /tmp/SRV1CV8_DATA
/usr/bin/find "${datadir}" -type d -name "snccntx*" | while read x; do
/usr/bin/install -o $SRV1CV8_USER -g $SRV1CV8_GROUP -d "$x"
/bin/mount | /bin/grep -q "${x}" || /bin/mount -t tmpfs -o noatime,nodiratime,uid=$SRV1CV8_USER,gid=$SRV1CV8_GROUP tmpfs "${x}"
/bin/mount > /tmp/SRV1CV8_DATA
done
} > /dev/null 2>&1
Применив описанные выше шаги (фиксацию высокой частоты процессора, настройку электропитания хоста и перенос временных файлов на RAM-диск), можно увеличить производительность даже на откровенно слабых серверах в несколько раз, обеспечив комфортную работу небольшого количества пользователей.