Изучаем Linux. Настройка Ubuntu Server 18.04 для работы PostgreSQL

Публикация № 1250752

Администрирование - Системное администрирование - Linux

Ubuntu server linux postgre postgreSQL 1c настройка ядро память диски диск

После того, как в прошлой публикации меня закидали помидорами за использование Windows+PostgreSQL, решил установить Ubuntu Server 18.04 на тестовую машину и пощупать загадочный для меня мир Линукса. В процессе изучения решил написать все нюансы, что насобирал, для следующих целей: 1) Шпаргалка для себя, чтобы, когда понадобится, опять не собирать информацию по разным источникам. 2) Получить новую порцию помидоров и осознать, что сделал неверно, дабы не переносить это на боевой сервер, если соберусь.

Оглавление.

  • Процессор

  1.  Энергопотребление
  2.  Прочие параметры
  • Память

  1.  HugePages
  2.  Файл подкачки
  3.  Прочие параметры
  • Диски

  1. TRIM
  2. fstab
  3. bitmap при SOFT RAID

 

Процессор

 

.Настраиваем энергопотребление на максимальную производительность.

   Когда я поставил серверную Ubuntu, я и подумать не мог, что мой процессор будет работать в режиме максимальной экономии. Но это так. Для просмотра текущего состояния выполняем команду.

 
 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

У меня вышло powersave. На самом деле у вас может быть ondemand. Тут вся фишка в том какие режимы может поддерживать ваш процессор. На моей тестовой системе процессор держит только powersave(энергосбережение) и performance(макс производительность).

Отключаем демон, который управляет частотой процессора.

systemctl disable ondemand

Перезагружаем систему и проверяем. Должно быть performance.

 Проверяем текущие частоты каждого ядра

grep MHz /proc/cpuinfo

У меня так

 
А было 
 
cpu MHz        : 799.941
cpu MHz        : 1608.222
cpu MHz        : 900.019
cpu MHz        : 800.078
 

.Прочие настройки процессора

В файле /etc/sysctl.conf прописываем

kernel.sched_migration_cost_ns = 5000000 увеличиваем время выполнения операций на 1 ядре, чтобы долгие запросы не мигрировали с одного ядра в другое. 

kernel.sched_autogroup_enabled=0    подробнее тут

 

В терминале выполняем

lscpu

Если напротив строки NUMA node цифра 1, ничего не делаем, если больше, тогда отключаем NUMA

vm.zone_reclaim_mode = 0
kernel.numa_balancing=0

 

Память

 

.HugePages

  По умолчанию размер страниц памяти установлен 4 КБ. Можем установить в 2 МБ и 1 ГБ(1 ГБ не везде, подробнее будет ниже). На хабре есть статья тестирования производительности в зависимости от настроек HugePages. Меня привлек следующий раздел статьи

 

   Если я правильно понял, то когда размер базы превышает выделенный Postgre shared_buffers и количество пользователей до 30, то размер страниц в 2 МБ самое то. Например достаточно близкая к реалиям 1с ситуация: сервер с 16 ГБ оперативной памятью, shared_buffers= 4ГБ, размер базы 7 ГБ, пользователей 10.

 
Проверяем текущие настройки
grep Huge /proc/meminfo

Увидим примерно следующее

 

 
 Проверяем сколько страниц нам необходимо выделить, только меняем путь к файлу pid экземпляра postgresql.

получаем 

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

 
Устанавливаем настройки в файле /etc/sysctl.conf

vm.nr_hugepages=(количество страниц)

После перезагрузки заново проверим выделение памяти. У меня так:

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

 

Размер страниц 1 ГБ

Если у вас на сервере под 256 ГБ оперативной памяти можно установить данный размер

Проверяем поддерживает ли ваш процессор данную опцию

if grep pdpe1gb /proc/cpuinfo >/dev/null 2>&1; then echo "1GB supported."; fi

 Если поддерживает, редактируем файл /etc/default/grub. В строке GRUB_CMDLINE_LINUX добавляем 

 default_hugepagesz=1GB hugepagesz=1G

выполняем

grub-mkconfig -o /boot/grub/grub.cfg

  Перезагружаем систему и выполняем пункты описанные ранее для выделения нужного количества больших страниц нашей БД.

 

Резервируем HugaPages за PostgreSQL

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

Выполняем

id postgres

Из того, что увидим, нас интересует gid=1001(postgres) 

В файле /etc/sysctl.conf прописываем

vm.hugetlb_shm_group = 1001

Теперь большие страницы памяти будут выделяться только для PostgreSQL.

 

.Файл подкачки

Уменьшаем агрессивность использования swap. 

Устанавливаем настройку в файле /etc/sysctl.conf

vm.swappiness=1

  По умолчанию в Ubuntu Server =60, совсем в 0 убирать не стоит, если памяти не хватит, операционка может убить процесс postgre для ее высвобождения.

 

.Прочие параметры памяти в файле /etc/sysctl.conf

vm.dirty_background_bytes          =25% от скорости записи диска в байтах. Объем данных сбрасываемых из оперативки на диск фоновым процессом

vm.dirty_bytes                              =100-200% от скорости записи диска в байтах. Объем данных сбрасываемых из оперативки на диск выполняемым запросом.

Если у вас железный RAID с кэшем или SSD с кэшем, то vm.dirty_bytes=размер кэша 

 

Что у нас в теории: по умолчанию в ubuntu эти механизмы настроены на 10 и 20% от оперативной памяти, но если у нас 64 ГБ оперативки, то разом на диск может приехать 6 ГБ данных. На практике же у нас в самой PostgreSQL есть настраиваемые параметры сброса данных из оперативной памяти на диск. Как настройки postgre и операционной системы между собой работают не знаю. 

vm.overcommit_memory              =2    подробнее тут

vm.min_free_kbytes                     =307200 увеличиваем свободную память до 300 МБ, которая не будет занята файловым кэшем. Если памяти много, то лучше 1ГБ, чтобы фрагментация памяти происходила раньше. По умолчанию 66 МБ.
 

 

Диски

 

.TRIM для ssd

 После установки системы Ubuntu раз в неделю посылает команду TRIM ssd дискам, можно перенастроить под свои нужды.

Для начала проверим видит ли ваша система, что это именно ssd диск и команда TRIM туда посылается.

Вариант 1

hdparm -I /dev/sdc3 | grep TRIM

вместо sdc3 ваш раздел.

Вариант 2

lsblk --discard

Выделенное разделы на SSD, с нулем HDD.

Теперь проверим как часто в данный момент срабатывает отправка команды

systemctl list-timers fstrim.timer

  Тут мы увидим время последнего выполнения и время следующего запуска команды. У меня система уже настроена на выполнения каждый час, в чистом дистрибутиве настроено выполнение раз в неделю.

Редактируем файл /lib/systemd/system/fstrim.timer

В строке OnCalendar= прописываем расписание выполнения команды

Например:

OnCalendar=hourly -каждый час в 00 минут

OnCalendar=* 4 ***  -раз в день в 4 утра

OnCalendar=* 9-20 ***  -каждый час с 9 утра до 8 вечера.   

Применяем настройки

systemctl daemon-reload

 

  Можно указать параметр discard при монтировании системы в файле /ets/fstab, но пишут, что скорость работы диска снизится.

 

.Параметры монтирования дисков

Меняем параметры в файле /etc/fstab c

 ext4 defaults 0 0

на 

 ext4 defaults,noatime,nodiratime 0 0


если диск SSD и хотите TRIM при каждом изменении файловой системе, то:

 ext4 defaults,noatime,nodiratime,discard 0 0

На самом деле параметров много, еще разбираюсь. Если в комментариях подскажут полезные для работы PostgreSQL буду благодарен.

 

.Перенос bitmap  файл софтового RAID на другой диск

Далее цитата из интернета:

Linux-овый софтрейд поддерживает замечательную фичу: bitmap. Там отмечаются измененные блоки на диске, и если у вас почему-то отвалился один диск из массива, а потом вы его обратно добавили – полная перестройка массива не нужна. Чертовски полезно. Хранить можно на самом рейде – internal, а можно в отдельном файле – но тут есть ограничения (на тип ФС например). Я сделал internal bitmap. И зря. Internal bitmap тормозит безбожно т.к. постоянно дергается головка веников при записи.

Я монтировал RAID при установке системы и  bitmap  файл был смонитирован на этих же дисках. 

Отключаем текущие настройки

mdadm --grow --bitmap=none /dev/md127

Где md127 это наш RAID

Устанавливаем новые настройки

mdadm -G /dev/md127 -b /var/md127_intent

Где md127 наш RAID, md127_intent где будет расположен наш bitmap файл. У меня раздел /var находится на ssd диске.

 

Заключение

После всех изменений pgbench с настройками  "pgbench -c 8 -j 4 -T 600 -v"стал показывать прирост почти на 40% по сравнению с чистой Ubuntu. Размер тестовой базы 7 ГБ.

Если формат статей будет интересен, есть возможность рассказать варианте настройке SSH для работы с сервером. Текущий рабочий инструмент сейчас выглядит так. По центру рабочий терминал. Снизу всплывающая вкладка с файловым менеджером, справа три всплывающие вкладки для мониторинга системы. При необходимости их можно закрепить. 

 

 

 

 

 

Архивирование делаю при помощи pg_probackup, с небольшой цветовой надстройкой, чтобы удобнее было мониторить бекапы.

 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. awk 716 16.06.20 14:06 Сейчас в теме
Молодец. Круто. Одна из лучших статей, которую я читал на Инфостарте, за последнее время.
13jaguar; starik-2005; user779117; +3 Ответить
2. D_astana 96 16.06.20 17:28 Сейчас в теме
Забыл добавить в статью. С 11 версии postgreSQL большие страницы по 2МБ, начали поддерживаться и в windows. Так же mssql сервер можно запустить с этой опцией. Но, что-то нигде тестов сравнения до и после включения опции, я не нашел.
3. capitan 1683 16.06.20 22:25 Сейчас в теме
Да. Круто. Это уже боевая система или тестовая ?
4. D_astana 96 16.06.20 22:47 Сейчас в теме
(3)тестовая. Еще обкатываю, еще изучаю.
5. capitan 1683 17.06.20 09:19 Сейчас в теме
(4)Ок. Повешу свои уши на крючок внимания )
6. SerVer1C 259 18.06.20 10:04 Сейчас в теме
Не светите патчерами на скринах ))
8. D_astana 96 18.06.20 12:12 Сейчас в теме
7. viptextil1 17 18.06.20 10:42 Сейчас в теме
Настраивать производительность на максимум имеет смысл при круглосуточной нагрузке сервера близкой к 100 %. В остальных случаях это резко увеличит энергопоребление при незначительном увеличении производительности.
9. D_astana 96 18.06.20 12:15 Сейчас в теме
(7)думаете не значительно? Просто если бы у процессора моего был режим ondemand я бы оставил, а так между мин и макс даже не знаю. Спасибо, подумаю
10. starik-2005 2180 18.06.20 14:34 Сейчас в теме
(9) В действительности режим экономии энергии и режим высокой производительности, который доступен процессорами Intel, отличается в части производительности в некоторых сценариях в несколько раз. А вот режим по-требованию, который для процессоров AMD устанавливается по-умолчанию, при смене на режим высокой производительности для клиент-сервера почти не дает прибавки.

А по поводу энергопотребления, то от нагрузки зависит. Есть нагрузка - есть энергопотребление, нет нагрузки - нет энергопотребления (ядро крутит пустой цикл из wait'ов - Idle).

В ОС семейства Windows процесс «бездействие» используется для понижения энергопотребления процессора. Конкретный способ понижения энергопотребления зависит от возможностей аппаратного обеспечения и прошивки. Например, на процессорах архитектуры x86 процесс «бездействие» в цикле выполняет инструкцию HLT. Во время выполнения этой инструкции процессор отключает некоторые внутренние компоненты и начинает ожидать наступления аппаратного прерывания (англ. hardware IRQ). При наличии поддержки какой-либо технологии энергосбережения (например, Intel SpeedStep) процессор также может переключиться в режим пониженного энергопотребления.
В других ОСах - та же тема. Понижение частоты в режиме энергосбережения достигает 800 MHz для Intel, в реживе высокой производительности - до стоковой частоты. Но сама по себе команда HLT переводит ядро в режим ожидания аппаратного прерывания, которое переключает ядро на выполнение конкретного потока. Чем реже это происходит, тем ниже опускается частота в простое при поверсэйв, при жтом при начале выполнения кода процессор не сразу разгоняется, а постепенно, что приводит к тому, что проц работает большую часть времени на рваной нагрузке с частотой ниже стока, чем и объясняется серьезный слив такого режима в части производительности для 1С, которая постоянно обращается к либо внешнему хранилищу, и ожидая на i/o теряет частоту, либо к серверу СУБД, и ожидая ответа от него сбавляет частоту еще сильнее...

В режиме по=требованию частота динамически регулируется нагрузкой, возрастая до буста при возможности за миллисекунды (в АМД динамическая подстройка частоты производится если не ошибаюсь аж миллион раз в секунду, при этом ондеманд от поверсейв отличается поддержкой частот вверх или вниз от стока, но реакция почти мгновенная на изменение нагрузки - стресс-тест на линухе на R5 3600 в течение 100 сек у меня на воздухе обычном за 1300р нагрел проц до 44оС, при этом на А320-м чипе частота держалась вблизи 4-4,1ГГц, после окончания нагрузки температура упала до 36оС за минуту, частоты при этом держались 3,6 "сток" - 4,0, но температура падала, поэтому и энергопотребление падало, на поверсэйв температура 35оС - не сильно ниже).
13jaguar; awk; D_astana; +3 Ответить
11. D_astana 96 18.06.20 15:14 Сейчас в теме
(10)спасибо. Познавательно.
12. D_astana 96 18.06.20 15:22 Сейчас в теме
(10)А вот интересно, режимы мин и макс, какая разница в пересчете на рубли за месяц будет? Например i7-8700. Стоит ли вообще обсуждать производительность и экономию для фирмы? Мы же не о дата центрах речь ведем.
13. starik-2005 2180 18.06.20 15:32 Сейчас в теме
(12) Подняли с коллегой вопрос этот как раз - у него I9-9900K с водяным охлаждением в перформанс 24/7 работает, но, конечно, почти ничего не выполняет - он его как сервер удаленной разработки использует вместо тормозных рабочих ксеонов. Ну и у него еще I7-7700K в таком же режиме. За месяц света нагорело 30 Квт, компы не выключались, на них 1С-сервер и MS SQL, но работают они только днем по всей видимости. Ну и посудомойки и стриралки никто не отменял.

У меня без компа один теплый пол и полотенцесушитель электрический в апреле-мае выдал счет за электричество на 2к каждый месяц. Так что я в 10 раз больше плачу, а из компов у меня только ноут на I5 и монитор 2к 24" (на этой квартире).
14. nomad_irk 48 18.06.20 15:35 Сейчас в теме
(13)Чего-то маловато 30кВт за месяц. Живет один? Как часто посудомойки/стиралки используются? Холодильника вообще нет?
15. starik-2005 2180 18.06.20 15:37 Сейчас в теме
(14) Я не в курсе. Видимо нет, ибо у меня один холодильник 370Квт по паспорту в год, что в районе 30Квт в месяц. Может ему холодильник и не нужен.
16. D_astana 96 18.06.20 15:52 Сейчас в теме
(13)надо будет свой тестовый стенд подключить к ибп с замером потребления. И в двух режимах энергопотребления погонять pgbench пару часов.
17. starik-2005 2180 18.06.20 23:41 Сейчас в теме
(16) вряд ли будет разница в pgbench, а вот в простое разницу было бы интересно отследить, ибо если прав товарищ в (7), то она будет резко выше (но я сомневаюсь, ибо без задач система будет HLT крутить вместо процессов вне зависимости от режима энергосбережения).
Оставьте свое сообщение

См. также

Линукс как основной многофункциональный сервер небольшой компании. Наш опыт

Администрирование СУБД Linux Бесплатно (free)

Однажды, в порыве повышения лицензионности используемого софта, мы решили поставить на наш старенький сервер опен сорс линукс. Был совсем небольшой опыт работы на локальных машинах под линуксом (успешный). Продвинутого опыта работы с линуксом не было. Но в сети довольно много позитивного опыта развертки такой архитектуры, и мы решились. Данная статья точно НЕ является мануалом по установке линукс, но уверен, будет неплохим дополнением.

08.06.2020    3430    ogroup    22    

Готовый сервер 1С с Linux Centos 7 и PostgreSQL 10 на борту

Linux 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

Сейчас все больше и больше возникает вопросов по развертке и настройке 1С на базе Linux и PostgreSQL, так как работать в файловой базе уже почти нереально из-за сложности типовых конфигураций и развитости платформы, а покупать платное ПО довольно дорого, особенно для небольших организаций.

03.04.2020    2385    aleksxx    19    

Разворачиваем узлы CI через Vagrant, строим сеть из виртуальных машин. Цикл "Многопоточный CI для 1С c Packer, Vagrant и Jenkins", часть 3

DevOps CI/CD Linux Бесплатно (free)

Разворачиваем инфраструктуру для CI из образов виртуальных машин.

04.03.2020    4210    Vladimir Litvinenko    14    

Собираем образ виртуальной машины с PostgreSQL и платформой 1С. Цикл "Многопоточный CI для 1С c Packer, Vagrant и Jenkins", часть 2

DevOps CI/CD Linux Бесплатно (free)

Автоматизируем установку и конфигурирование Linux, PostgreSQL, 1C, Apache, Java с возможностью выбора версий дистрибутивов. Упаковываем результат в образ виртуальной машины.

28.02.2020    7286    Vladimir Litvinenko    11    

Рабочее место программиста на Linux. Серия лабораторных работ. Работа 1

Linux v8 Бесплатно (free)

В этой лабораторной работе мы сконфигурируем рабочее место программиста на платформе 1С:Предприятие 8. Воспользуемся подсистемой WSL и установим Linux в ОС Windows. Сервер 1С:Предприятие и сервер базы данных установим в Linux. Остальные компоненты установим в Windows.

17.02.2020    8040    infosoft-v    40    

Настройка SoftEther VPN Client на Linux Debian/Ubuntu/Mint (связка Linux-Windows)

Администрирование СУБД Windows Linux Россия Бесплатно (free)

На сервере установлен и настроен VPN через программное обеспечение SoftEter VPN Server, настроены клиенты с доступом по сертификату, встала задача настроить доступ клиента из Linux и подключиться по RDP (VNC) в Windows к серверу VPN.

04.02.2020    3516    ClickUp    5    

Собственный виртуальный сервер для 1С на Linux Ubuntu

Администрирование данных 1С Linux v8 Бесплатно (free)

Статья для тех, кто хочет научиться разворачивать 1С на linux, и для тех, кто хочет получить недорогой виртуальный сервер для собственных нужд.

24.05.2015    18490    spezc    44    

Публикация базы 1С на веб-сервере Apache на сервере Linux

Администрирование данных 1С WEB Apache Linux v8 1cv8.cf Бесплатно (free)

В отличие от других подобных публикаций здесь будет описано как опубликовать базу (располагающуюся на сервере windows) на веб-сервере apache (расположенном на соседнем сервере под linux).

20.09.2014    144965    spezc    70