Инструкция: ускоряем tempdb переносом в ram диск

Бэкап баз 1С на postgresql

Без регулярного автоматического бэкапа баз 1С невозможно себе представить эксплуатацию. Так что этим вопросом надо заняться в первую очередь после настройки сервера и добавления баз. Посмотрим, какие базы postgresql у нас существуют:

# sudo -u postgres psql -U postgres -l

Я создал две тестовые базы: buh30 и zup31. Их и будем бэкапить. Я для этого предлагаю использовать обычный pg_dump, а затем дамп сразу же сжимать архиватором pigz. Его отличительная особенность в том, что он умеет жать всеми ядрами процессора, а не только одним, как, к примеру, gzip. Более подробно про pigz я рассказывал в заметке.

В самом простом случае бэкап базы данных выглядит следующим образом:

# sudo -u postgres /usr/bin/pg_dump -U postgres buh30 | pigz > /mnt/backup/buh30.sql.gz

Если посмотреть на dump, то в случае успешного создания, в начале дампа будет строка:

-- PostgreSQL database dump

а в конце:

-- PostgreSQL database dump complete

В будущем эта информация нам понадобится для мониторинга создания бэкапов и получения уведомления, если дамп не завершился корректно.

Для того, чтобы бэкапить автоматически все базы сразу я предлагаю использовать простой скрипт.

#!/bin/bash

BASES=("buh30" "zup31")
#BASES=`sudo -u postgres /usr/bin/psql -U postgres -l | grep "_buh\|_zup" | awk '{print $1}'`
DATA=`date +"%Y-%m-%d_%H-%M"`
LOGS=/var/lib/pgpro/service_logs
BACKUPDIR=/var/lib/pgpro/backup

for i in ${BASES};
    do
    echo "`date +"%Y-%m-%d_%H-%M-%S"` Start backup $i" >> $LOGS/$DATA.log
    sudo -u postgres /usr/bin/pg_dump -U postgres $i | pigz > $BACKUPDIR/$DATA-$i.sql.gz
    echo "`date +"%Y-%m-%d_%H-%M-%S"` End backup $i" >> $LOGS/$DATA.log
    done

В скрипте предложены 2 варианта указания списка баз для бэкапа:

  1. Последовательное перечисление.
  2. Бэкап всех баз, что имеют в своем названии _zup или _buh.

Я обычно ставлю некоторые метки в именах баз, чтобы потом было проще формировать списки для бэкапа. Например, все тестовые базы можно помечать в имени _test — company_buh30_test и потом исключать из списка бэкапа все базы с дополнением _test в названии. Либо просто все рабочие базы сразу именовать с приставкой _buh или _zup и по этому признаку их выводить в список.

Для работы скрипта в таком виде, не забудьте создать каталоги:

# mkdir -p /var/lib/pgpro/service_logs
# mkdir -p /var/lib/pgpro/backup

И еще важно учесть, что так как в скрипте мы запускаем команды от системного пользователя postgres, необходимо, чтобы у него был доступ к скрипту, когда добавите его в планировщик. На выходе у вас получится примерно такой список бэкапов баз 1С из postgresql

На выходе у вас получится примерно такой список бэкапов баз 1С из postgresql.

В дальнейшем мы их будем забирать отсюда и удалять.

Что я могу сделать, чтобы избежать этой проблемы?

Как только файл стал раздутым, кажется, что самый простой способ вернуть базу данных в рабочее состояние — это удалить файл, выполнив следующие шаги:

  1. Остановить базу данных

  2. Когда БД остановлена, каталог pg_stat_tmp пуст и файл написано. Мы переименовали этот файл в ,

  3. Запустите базу данных. Он создает новый набор файлов pgstat. После подтверждения правильной работы сервера вы можете удалить старый файл, который вы переименовали.

Это процесс, который мы использовали, когда один из наших серверов страдал от этой проблемы.

Излишне говорить, что будьте очень осторожны при ручном манипулировании любыми файлами в каталоге Postgresql Data.

После этого вы можете захотеть проконтролировать сервер, чтобы увидеть, не станет ли он снова раздутым. Если это так, вот некоторые дополнительные идеи для рассмотрения:

  • Как упомянуто выше, я видел некоторые ссылки на этот файл, становящийся раздутым, если autovacuum не работает достаточно агрессивно. Вы можете настроить параметры автовакуума

  • Отключение любого из опции, описанные в разделе 18.9.1 руководства, которые не требуются, могут помочь

  • Можно разместить каталог в файловой системе tmpfs (или любой другой эквивалентной файловой системе на основе ОЗУ, доступной в windows). Это должно устранить необходимость ввода-вывода в качестве проблемы для этих файлов.

Рекомендации:

  • Сборщик статистики Postgres, показывающий высокий дисковый ввод-вывод
  • Слишком много операций ввода-вывода, сгенерированных процессом сбора статистики postgres
  • сборщик статистики внезапно вызывает много IO

Опыт оптимизации и контроля производительности в БД с 3000 пользователей Промо

Данная статья написана по материалам доклада, прочитанного на Конференции Инфостарта IE 2014 29-31 октября 2014 года.

Меня зовут Сергей, являюсь руководителем отдела оптимизации и производительности систем в компании «Деловые линии».
Цель этого доклада – поделиться информацией о нашем опыте работы с большой базой на платформе 1С, с чем пришлось столкнуться, как удалось обеспечить работоспособность.
Уверен, что вам будет интересно, так как подобной информацией мало кто делится, да и про само существование таких систем их владельцы стараются не рассказывать, максимум про это «краем глаза» упоминают участвовавшие в проекте вендоры.
**update от 04.03.2016 по вопросам из комментариев

Основные операции с БД

Чтобы выполнять базовые действия в СУБД, нужно знать язык запросов к базе данных SQL.

Создание базы данных

Для создания базы данных используется команда:

create database

В приведенном ниже примере создается база данных с именем proglib_db.

Рисунок 3 — Создание базы данных с именем proglib_db

Если забыть точку с запятой в конце запроса, знак «=» в приглашении postgres заменяется на «-». Это зачастую указывает на то, что необходимо завершить (дописать) запрос.

Рисунок 4 — вывод ошибки при создании базы данных

На рисунке 4 видно сообщение об ошибке из-за того, что в нашем случае база уже создана.

Создание нового юзера

Для создания пользователя существует команда:

create user

В приведенном ниже примере создается пользователь с именем author.

Рисунок 5 — Создание пользователя с именем author

При создании пользователя отобразится сообщение CREATE ROLE. Каждый пользователь имеет свои права (доступ к базам, редактирование, создание БД / пользователей и т. д.). Вы могли заметить, что столбец Attributes для пользователя author пуст. Это означает, что пользователь author не имеет прав администратора. Он может только читать данные и не может создать другого пользователя или базу.

Можно установить пароль для существующего пользователя.

С этой задачей справится команда :

postgres=#\password author

Чтобы задать пароль при создании пользователя, можно использовать следующую команду:

postgres=#create user author with login password 'qwerty';

Удаление базы или пользователя

Для этой операции используется команда : она умеет удалять как пользователя, так и БД.

drop database <database_name>
drop user <user_name>

Данную команду нужно использовать очень осторожно, иначе удаленные данные будут потеряны, а восстановить их можно только из бэкапа (если он был).

Если вы укажете psql postgres (без имени пользователя), то postgreSQL пустит вас под стандартным суперюзером (postgres). Чтобы войти в базу данных под определенным пользователем, можно использовать следующую команду:

psql  

Войдем в базу proglib_db под пользователем author. Выполним команду , чтобы выйти из текущей БД, а затем выполните следующую команду:

Рисунок 6 — Вход в базу данных proglib_db

почему я получаю ошибки «отказано в разрешении» в Windows?

после изучения исходного кода postgresql я думаю, что может быть условие гонки при доступе к файл, который может произойти в любое время, но усугубляется размером файла.

режим работы по умолчанию в Windows заключается в том, что невозможно переименовать или удалить файл, пока он открыт другим процессом. Это отличается от Linux (или Unix), где файл может быть переименован или удален, в то время как другие процессы обращаются к нему.

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

естественно, когда файл становится очень большим, то количество времени, необходимое для его чтения, становится более значительным, поэтому вероятность процесса сборщика статистики, пытающегося переименовать, пока бэкэнд все еще открыт, увеличивается.

однако, поскольку файл часто переписывается, влияние этих ошибок относительно мягкое. Он просто означает, что это конкретное обновление терпит неудачу, что приводит к тому, что бэкэнды получают немного устаревшую статистику. Следующее обновление, вероятно, будет успешным.

обратите внимание, что Windows предлагает режим открытия файлов, который позволяет удалять или переименовывать файлы во время их открытия другим процессом, однако, насколько я могу судить, этот режим не используется Postgresql. Я не мог найти никакого отчета об ошибке на этом-кажется, это должно быть сообщено

таким образом, эти ошибки являются побочным эффектом основной проблемы, которая является чрезмерным размером .

Ярлыки

11.1

11.1.1 trial

11.10

12.04

14.04

16.04

17.04

17.10

18.04

1С + postgresql под windows

1С:Отчетность

1С:Предприятие 7.7

1c

20.04

32 бит

3proxy

9.6.2

автономный сервер

админ

администрирование

анализ сервера

архивирование

безопсность

березка

веб доступ

время

второй кластер

выгнать пользователей

госзакупки

диагностика

диагностика postgresql

документация

Дорошкевич

журнал регистрации

Завершение работы пользователей

зависимости postgresql

запуск postgresql

зафиксировать postgresql

ибп

интересно

камин

книги

Конфигурация сервера

КриптоПро

лицензии

лицензия

логи

локальная сеть

минисервер 1с

Моё рабочее

мой сервер

настройка дампов

непрерывное архивирование

обновление 1с

обновление ядра

обновление postgresql

ограничение 1Гб

ОКБ

Олег Харин

ОПО

оптимизация

ошибка

пароли

переименовать хост

перенос win lin

печать

Поиск пакетов

Потоковая репликация

программная лицензия

размер базы

размер таблиц

РИБ

сборка postgresql

сервер хранилища

сессии

скачать дистрибутивы

скрипт

скрипт wal

справочник

спутник

спящие сеансы

сравнение cpu

ссылки

статический ip

тест

тестирование

Тестирование и исправление конфигурации

тестовый сервер

технологический журнал

тюнинг postgresql

удаление 1с

удаление postgresql

управление серверами

установка 1с

установка 2 сервера 1с

файловый режим

фиас

флешка

фрагментация памяти

холодный backup

Шпаргалка PostgreSQL

штрих-коды

энергосбережение

acme.sh

aksusbd

Aladdin Monitor

alt linux

alternative downloads

amcheck

ammyy admin

apache2

apc

apparmor

apport

Asterisk

astra

astra linux

astra lxc

astra lxd

atop

audio

autologon

autovacuum

B360M

B365M

backup

Bash-скрипты

bridge-utils

bug

cache_hit_ratio

cadaver

canon

centos

Certbot

Certificate

checkdb

chromium

chromium-gost

cloak

clonezilla

cpu

cpufreqd

cron

crontab

cryptcp

Crypto-Pro

cryptopro

CryptSync

cups-pdf

curl

cwRsync

Cygwin

cygwin-rsyncd

dante

db2

debian

debian 10

desktop

disk

Dns Leak Test

DO

docker

docker-compose

DokuWiki

dump

elastix

etersoft

excel

fail2ban

Failover

fedora

files

FileZilla

fio

firefox

fragster

freenx

ftp

ghostscript

GIMP

git

gitlab

gnome

gnome-tweak-tool

gost

governor

gpg

GPT to MBR

haproxy

hasp

hasp & lxc

hdd

hold

host

hostname

hostnamectl

Hyper-Threading

i7

i7-7700

icmp

intel

intel graphics 630

Intel Kaby Lake

ip

iperf

IPSec

iptables

journalctl

juju

Junction

kerberos

kvm

L2TP

Let’s Encrypt

linux

live-cd

LMNoIpServer

Load Average

log

LPD

LVM

lxc

lxc in lxd

lxd

lxd & virtualbox

lxd 1c

lxd backup

lxd haproxy

lxd nextcloud

lxd resource control

lxd vps

lxd-p2c

macvlan

Mandos

mariadb

mc

MediaWiki

mining

mint

MobaXterm

mp3

mssql

multipath

mysql

MZ1LB960HAJQ-00007

net.netfilter.nf_conntrack_max

nethasp

nethasp.ini

network

NetworkManager

nextcloud

Nginx

NoMachine

ntp

numactl

numlock

nut

NVMe

nvOC

ondemand

openconnect

OpenSSH

OpenSSL

openvpn

ops

orel. orel docer

pdf

performance

pg_basebackup

pg_catalog.pg_statistic

pg_controldata

pg_dump

pg_dump в каталог

pg_probackup

pg_probackup одна база

pg_probackup upgrade

pg_repack

pg_resetxlog

pgadmin4

pgBackRest

pgbench

PGConf

PgTune

phpvirtualbox

Playonlinux

plink

posfix

postfix

postgrespro

postgrespro-std-11

postgresql

PostgreSQL Configurator

postgresql port

postgresql ssl

postgresql win

postgresql.conf

proxmox

pulseaudio

pure-ftpd

python

QtdSyn

RAID

ramdisk

ramfs

rancher

ras

rclone

reverse-proxy

rphost

rsync

Rufus

samba

Samsung SSD

sandisk

Sar

screen

server

Shadowsocks

smartctl

smartmontools

smbclient

snap

snapshot

spice

squid

ssd

ssh

ssh к флешке

ssh по сертификату

ssl

stats_temp_directory

strongSwan

stubby

stunnel

Supermicro

swap

swappiness

sysctl

sysctl.conf

systemd

tap

TCmalloc

teamviewer

telegram

temp_tablespaces

terminal server

test

test Тестовый сервер

test ssd

test2

test3

timedatectl

timezona

tint2

tmpfs

TRIM

ubuntu

ubuntu 18.04

ubuntu 20.04

ufo

ufw

unity

UNIX sockets

ureadahead

usb

v2ray-plugin

vacuum

vacuumdb

vbox

vino

virsh

virt

virt-manager

virt-viewer

virtualbox

vnc

vsftpd

wal

wd my cloud

web

webdav

wget

windows

windows server

windows vs linux

wine

WinSetupFromUSB

WireGuard

wordpress

x11vnc

xming

xrdp

xubuntu

xubuntu-desktop

xvfb

yandex-disk

youtube

youtube-dl

zabbix

zfs

zram

Исходные данные. Задача

Допустим, мы разрабатываем базу данных в PostgreSQL, при этом мы используем обычный клиентский компьютер под управлением операционной системы Windows 10, где собственно локально и установлен PostgreSQL.

В качестве инструмента разработки мы используем стандартное графическое приложение pgAdmin 4.

В итоге базу данных мы разработали, протестировали ее, внесли в нее необходимые данные, заполнили справочники, в общем, база данных готова.

Теперь у нас возникла необходимость перенести эту базу данных на реальный сервер, который и будет выступать в качестве сервера баз данных. И так как мы используем PostgreSQL, в качестве такого сервера баз данных обычно выступает сервер под управлением операционной системы Linux.

Таким образом, нам необходимо перенести базу данных PostgreSQL, разработанную в Windows, в базу данных PostgreSQL на Linux. В моем случае в качестве операционной системы Linux будет выступать дистрибутив Debian.

Создание дампа базы данных PostgreSQL в pgAdmin 4

Весь процесс переноса базы данных PostgreSQL достаточно простой, суть в следующем.

Нам необходимо создать копию нашей базы данных (дамп), затем создать пустую базу на нужном нам сервере и восстановить все данные, используя созданный ранее дамп.

Все это можно сделать с нашего клиентского компьютера, используя pgAdmin 4, если, конечно же, целевой сервер нам доступен, если недоступен, то придётся каким-то другим образом переносить дамп базы данных на нужный сервер и, используя стандартные консольные утилиты, восстановить базу данных из дампа.

Кстати, стоит отметить, что pgAdmin 4 для экспорта/импорта баз данных использует как раз эти стандартные консольные утилиты, в частности pg_dump, pg_dumpall и pg_restore, которые по умолчанию входят в состав PostgreSQL.

pg_dump – утилита для экспорта баз данных PostgreSQL
pg_dumpall – утилита для экспорта кластера баз данных PostgreSQL (всех данных на сервере)
pg_restore – утилита восстановления баз данных PostgreSQL из файла архива

Таким образом, благодаря pgAdmin 4 нам не нужно писать и выполнять команды в командной строке, за нас все это делает pgAdmin 4, мы всего лишь будем пользоваться мышкой, настраивая все параметры в графическом интерфейсе.

Создать дамп базы данных PostgreSQL можно в нескольких форматах, в частности:

Специальный (Custom) – это пользовательский формат, который использует сжатие. Данный формат по умолчанию предлагается в pgAdmin 4 и рекомендован для средних и больших баз данных. Обычно архивные файлы в таком формате создают с расширением backup, однако можно использовать и другое расширение.

Tar (tar) – база данных выгружается в формат tar. Данный формат не поддерживает сжатие.

Простой (plain) – в данном случае база данных выгружается в обычный текстовый SQL-скрипт, в котором все объекты базы данных и непосредственно сами данные будут в виде соответствующих SQL инструкций. Данный скрипт можно легко отредактировать в любом текстовом редакторе и выполнить, используя Query Tool, как обычные SQL запросы. Данный формат рекомендован для небольших баз данных, а также для тех случаев, когда требуется внести изменения в дамп базы данных перед восстановлением.

Каталог (directory) – этот формат файла создает каталог, в котором для каждой таблицы и большого объекта будут созданы отдельные файлы, а также файл оглавления в машиночитаемом формате, понятном для утилиты pg_restore. Этот формат по умолчанию использует сжатие, а также поддерживает работу в несколько потоков.

В данном материале мы рассмотрим создание дампа в специальном формате, а также в формате обычного SQL скрипта, дело в том, что процесс восстановления базы данных из этих форматов в pgAdmin 4 немного отличается.

Создание дампа базы данных в сжатом формате

Чтобы создать дамп базы данных PostgreSQL в pgAdmin 4, необходимо в обозревателе выбрать нужную базу данных, я выбираю базу данных shop, далее необходимо вызвать контекстное меню правой кнопкой мыши и нажать на пункт «Резервная копия».

Затем всего лишь нужно указать имя архивного файла и путь к каталогу, где его сохранить, для этого можно использовать кнопку с тремя точками.

Формат «Специальный», как было отмечено ранее, предлагается по умолчанию, поэтому выбирать его не требуется.

Как я уже отмечал, обычно архив в таком формате создают с расширением backup, я так и поступаю, т.е. архив назову shop.backup и сохраню его в каталоге D:\PostgreSQL_Backup\.

В случае необходимости задать определенный уровень сжатия можно с помощью параметра «Коэффициент сжатия», поддерживаются значения от 0 до 9, где 0 – вообще не использовать сжатие, а 9 самый высокий уровень сжатия, по умолчанию используется умеренное сжатие.

В нашем случае база данных небольшая, поэтому мы можем оставить все по умолчанию.

Больше никаких настроек в нашем случае делать нет необходимости, и мы можем нажать на кнопку «Резервная копия», чтобы запустить процесс создания дампа базы данных.

Когда появится сообщение «Успешно завершено», значит, процесс создания дампа базы данных PostgreSQL завершен успешно, в противном случае Вы будете получать сообщения о неуспешном завершении.

Создание дампа базы данных в простом формате SQL

В данном случае нам необходимо сделать практически все то же самое, только нужно выбрать формат «Простой» и дополнительно включить пару параметров, чтобы добавление данных осуществлялось с помощью обычных инструкций INSERT, а не с помощью команды COPY, которая используется по умолчанию.

Для этого переходим на вкладку «Параметры выгрузки» и включаем два параметра «Использовать команды INSERT» иINSERT с указанием столбцов», хотя данный параметр можно и не указывать.

Установка 1С:Предприятие 8.3 на Debian 10

Начнем нашу настройку с установки сервера 1С. Для этого нам надо установить дополнительные пакеты в систему, которые находятся в разделах системного репозитория contrib и non-free. Их нужно добавить в конфиг репозиториев Debian. Для этого редактируем файл /etc/apt/sources.list и приводим его примерно к следующему виду:

deb http://mirror.yandex.ru/debian buster main contrib non-free
deb-src http://mirror.yandex.ru/debian buster main contrib non-free

deb http://mirror.yandex.ru/debian buster-updates main contrib non-free
deb-src http://mirror.yandex.ru/debian buster-updates main contrib non-free

deb http://security.debian.org/ buster/updates main contrib non-free
deb-src http://security.debian.org/ buster/updates main contrib non-free

Сами адреса репозиториев у вас могут быть другие. Выполняем обновление списка пакетов:

# apt update

Теперь устанавливаем нужные для работы 1С в linux пакеты. Начнем со шрифтов mscorefonts.

# apt install ttf-mscorefonts-installer

Установка будет идти достаточно долго, так как скачивается целая куча дополнительных пакетов и файлов.

Добавляем еще несколько необходимых пакетов:

# apt install imagemagick unixodbc sudo curl

Следующий важный этап подготовки к установке сервера 1С — настройка локали. Для этого выполняем команду в терминале:

# dpkg-reconfigure locales

Нам нужно выбрать ru_RU.UTF-8 UTF-8. Так же убедитесь на всякий случай, что en_US.UTF-8 тоже выбрана. В дефолте так и должно быть, но я сталкивался с ситуациями, когда эту локаль тоже приходилось добавлять.

По умолчанию выбираем ее же — ru_RU. После того, как вы разлогинитесь из системы и зайдёте снова, у вас в консоли будет русский язык. Немного непривычно с ним работать, но придется потерпеть это неудобство.

Теперь нам необходимо скачать deb пакеты сервера с портала 1С. Для этого логинимся под действующей учетной записью на https://releases.1c.ru и скачиваем файл Cервер 1С:Предприятия (64-bit) для DEB-based Linux-систем.

Имя файла будет deb64_8_3_19_1150.tar.gz. Его нужно передать на Debian сервер. Я обычно winscp для этого использую. Распаковываем архив в отдельную директорию.

# mkdir 1c-server
# mv deb64_8_3_19_1150.tar.gz 1c-server/
# cd 1c-server/
# tar xzvf deb64_8_3_19_1150.tar.gz 
# rm deb64_8_3_19_1150.tar.gz

Вы получите список распакованных пакетов для сервера 1С.

# ls -lh
итого 470M
-rwxrwxrwx 1 1001 1001 29M июн 2 03:27 1c-enterprise-8.3.19.1150-common_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 8,9M июн 2 03:27 1c-enterprise-8.3.19.1150-common-nls_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 31K июн 2 03:27 1c-enterprise-8.3.19.1150-crs_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 323M июн 2 03:27 1c-enterprise-8.3.19.1150-server_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 110M июн 2 03:27 1c-enterprise-8.3.19.1150-server-nls_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 311K июн 2 03:27 1c-enterprise-8.3.19.1150-ws_8.3.19-1150_amd64.deb
-rwxrwxrwx 1 1001 1001 22K июн 2 03:27 1c-enterprise-8.3.19.1150-ws-nls_8.3.19-1150_amd64.deb
drwxr-xr-x 3 root root 4,0K июн 7 23:01 license-tools

Если вы в 1С используете только русский или английский язык, то пакеты с добавлением в имени nls вам не нужны. А все остальное устанавливаем.

# dpkg -i 1c-enterprise-8.3.19.1150-common_8.3.19-1150_amd64.deb 1c-enterprise-8.3.19.1150-server_8.3.19-1150_amd64.deb 1c-enterprise-8.3.19.1150-ws_8.3.19-1150_amd64.deb

Не забудьте изменить версию платформы в имени файла на свою.

Запускаем Сервер 1С на Debian:

# systemctl start srv1cv83

Если получили ошибку: «Failed to enable unit: Unit file srv1cv83.service does not exist.», значит при установке пакета не был добавлен init скрипт для запуска сервера. Сделаем это вручную, создав символьную ссылку:

# ln -s /opt/1cv8/x86_64/8.3.19.1150/srv1cv83 /etc/init.d/srv1cv83
# systemctl daemon-reload

После этого запускаем сервер 1С еще раз той же командой выше. Ошибки теперь быть не должно.

Проверим, все ли службы запустились:

# netstat -tulnp | grep "rphost\|ragent\|rmngr"

Всё на месте. Если у вас включен Firewall на сервере, не забудьте открыть указанные порты. Данная настройка не относится к тематики статьи, так что я ее опускаю.

На этом установка самого Сервера 1С закончена. Переходим к установке и настройке базы PostgreSQL для него.

На помощь внезапно приходят большие страницы

Множество процессорных микро-архитектур обычно используют страницы размером 4KiB, но также могут использовать и страницы большего размера, например широко распространенный вариант это 2MiB.

В зависимости от операционной системы, конфигурации и типа приложений, такие большие страницы могут использоваться и самой операционной системой и приложениями. Для больших подробностей можно в качестве примера взять статью из Debian wiki об использовании больших страниц.

Если повторить вышеописанный эксперимент с huge_pages=on, можно увидеть гораздо более приятные глазу результаты. Для начала, взглянем на «новый процесс»:

Теперь, новый процесс использует всего около 7MiB. Такое уменьшение вызвано тем что таблицы управления страницами (page table) теперь требуют меньше места, из-за того что используются большие страницы, для управления тем же объемом памяти нужно в 512 раз меньше элементов чем раньше (4KiB * 512 = 2MiB).

Теперь давайте посмотрим что произойдет при доступе к большим объемам данных в памяти:

В отличие от самого первого эксперимента, эти процессы используют всего 12MiB и 9MiB соответственно, в то время как в прошлый раз использовалось 3GiB и 2.7GiB.

Разница довольно очевидна.

Это следствие того, как в Linux реализован учёт использования больших страниц, а не потому, что мы использовали на порядки меньше памяти: используемые большие страницы не отображаются как часть значения RSS в выводе ps и top.

Для чего используются файлы global.stat / global.tmp?

Postgresql содержит функциональные возможности для сбора статистики и информации о состоянии своей работы. Функция описана в разделе 27.2 данного руководства.

Эта информация сопоставляется , Он доступен для других процессов postgresql через файл. При первом запуске запроса, который обращается к этим данным в транзакции, сервер, к которому вы подключены, будет читать файл и кешировать результат, используя его до конца транзакции.

Для поддержания этого файла в актуальном состоянии процесс сбора статистики периодически перезаписывает его с обновленной информацией. Обычно это происходит несколько раз в секунду. Процесс выглядит следующим образом:

  1. Создайте новый файл global.tmp
  2. Запишите данные в этот файл
  3. Переименуйте global.tmp в global.stat, перезаписав предыдущий global.stat

а также файлы записываются в каталог, настроенный параметром конфигурации stats_temp_directory. Обычно это установлено на ,

При выключении файл статистики записывается в файл и файлы в директории tmp выше удалены. Этот файл затем читается и удаляется при повторном запуске базы данных.

Увеличиваем точность

Однако даже если считать использование памяти без учета разделяемой памяти, это всё еще является переоценкой реального использования памяти. Тут есть две причины:

Первое, на самом деле учет RssFile в использовании памяти не играет роли — по факту это всего лишь исполняемый файл и используемые им разделяемые библиотеки (Postgres не использует mmap() для каких-либо файлов). Все эти файлы являются общими для всех процессов в системе и практически не дают накладных расходов для постгресовых процессов.

Второе, RssAnon также переоценивает использование памяти. Смысл тут в том что ps показывает всю память процесса целиком, при том что большая часть этой памяти в случае создания нового процесса делится между пользовательским соединением и памятью родительского процесса postgres (так же известен как postmaster). Это следует из того что Linux не копирует всю память целиком когда создает новый процесс (при выполнении операции fork()), вместо этого используется механизм Copy-on-Write для копирования в новый процесс, набора только измененных страниц.

Таким образом, пока нет хорошего способа аккуратно и точно измерить использование памяти отдельно взятого нового процесса. Но все не так плохо, начиная с версии 4.14 ядро предоставляет еще одну статистику (коммит с описанием) процесса в /proc/$pid/smaps_rollup файле. Pss показывает «принадлежащую процессу пропорциональную долю отображения» среди всех отображений этого процесса (детали можно найти в документации поиском по smaps_rollups и Pss которые сами по себе не имеют прямых ссылок). Для сегмента памяти используемого совместно между несколькими процессами, доля будет представлять собой отношение размера этого сегмента на количество процессов которые используют этот сегмент.

Pss_Anon включает в себя анонимную память используемую процессом, Pss_File включает память используемую под разделяемые библиотеки задействование процессом, и Pss_Shmem (если не используются большие страницы) показывает использование общей памяти разделенное на все процессы которые обращались к соответствующим страницам.

Но у пропорциональных значений есть небольшой недостаток, это использование делителя который зависит от числа подключений к серверу. Здесь я использовал pgbench (scale 1000, -S -M prepared -c 1024) чтобы создать большое число подключений:

И с использованием huge_pages=on:

К сожалению Pss значения учитывают только те ресурсы, что видны приложению. Например, размер таблицы страниц не учитывается. Размер таблицы страниц можно увидеть в уже упоминавшемся `/proc/$pid/status`.

Я не уверен, но насколько я знаю, VmPTE (размер таблицы страниц) полностью приватный для каждого процесса, но остальное большинство Vm* значений, включая стек VmStk являются общими через copy-on-write.

Учитывая всё это, накладные расходы с учетом таблицы страниц и с huge_pages=off:

и с huge_pages=on:

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

Почему процессор сборщика статистики создает такую ​​большую нагрузку ввода / вывода?

Как правило, объем данных, записываемых в global.stats, относительно скромен, и запись его не генерирует такой большой трафик ввода-вывода. Однако при некоторых обстоятельствах это кажется очень раздутым. Когда это происходит, объем создаваемой нагрузки может стать чрезмерным, поскольку весь файл перезаписывается чаще, чем раз в секунду.

У меня был один опыт, когда он вырос в 10 или более раз по сравнению с другими подобными серверами. У этой машины было необычайно большое количество баз данных (по крайней мере, для нашего приложения — 30-40 баз данных, но ничего похожего на 6000, как вы говорите, у вас есть). Возможно, что наличие большого количества баз данных усугубляет это.

В некоторых из приведенных ниже ссылок говорится о шаблоне создания / удаления большого количества таблиц, вызывающих раздувание в этих файлах, и о том, что, возможно, автоочистка работает недостаточно агрессивно, чтобы удалить связанный с этим раздув. Вы можете рассмотреть ваши настройки autovac.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: