Skip to content

Latest commit

 

History

History
190 lines (151 loc) · 8.51 KB

cgroupv2.md

File metadata and controls

190 lines (151 loc) · 8.51 KB

Проблема стабильности работы distributed configuration store (DCS)

Проблема может заключаться в:

  • работе Linux
  • работе контроллера IO
  • работе диска

Поскольку, в общем случае, мало что можно сделать с контроллером и диском, то обратим внимание на работу Linux.


etcd

https://etcd.io/docs/v3.5/op-guide/hardware/#disks
A slow disk will increase etcd request latency and potentially hurt cluster stability.

https://etcd.io/docs/v3.5/tuning/#disk
best effort, highest priority
$ sudo ionice -c2 -n0 -p $(pgrep -a etcd | awk '{ print $1 }')

https://habr.com/ru/company/oleg-bunin/blog/489206/
Проблема 1. СУБД и DCS на одном кластере


zookeeper

Анализ лога zookeeper:
image
Вывод утилиты ioping (замеряет latency диска каждую секунду) работавшей параллельно:
image


В cgroup v1 контроллер io не регулирует буферизованный ввод-вывод.


cgroup v2

https://docs.kernel.org/admin-guide/cgroup-v2.html
cgroup is a mechanism to organize processes hierarchically and distribute system resources along the hierarchy in a controlled and configurable manner.

По умолчанию cgroup v2 работает в ALT Linux 10, Ubuntu 22.04 LTS

ALT Linux 10

# ls -la /sys/fs/cgroup/critical.slice/ | grep 'io\.'
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.bfq.weight
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.latency
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.low
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.max
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.pressure
-r--r--r--  1 root     root     0 Dec 11 09:33 io.stat
-rw-r--r--  1 root     root     0 Dec 11 09:33 io.weight

Ubuntu 22.04 LTS

# ls -la /sys/fs/cgroup/critical.slice/ | grep 'io\.'
-rw-r--r--  1 root     root     0 Dec 12 11:27 io.max
-rw-r--r--  1 root     root     0 Dec 12 11:27 io.pressure
-rw-r--r--  1 root     root     0 Dec 12 11:27 io.prio.class
-r--r--r--  1 root     root     0 Dec 12 11:26 io.stat
-rw-r--r--  1 root     root     0 Dec 12 11:26 io.weight

By Design. (Указанные ниже настройки тестовые!!! Требуется доработка.)

Настройки осуществляются по
https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

sed -i '/^\[Service\]/a Delegate=cpu memory io' /lib/systemd/system/etcd.service
sed -i '/^\[Service\]/a Slice=critical.slice' /lib/systemd/system/etcd.service

sed -i '/^\[Service\]/a Delegate=cpu memory io' /lib/systemd/system/patroni.service
sed -i '/^\[Service\]/a Slice=pgcluster.slice' /lib/systemd/system/patroni.service

sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgagent.service
sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgbouncer.service
sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgpool.service

mkdir -p /etc/systemd/system/patroni.service.d
echo '[Service]' > /etc/systemd/system/patroni.service.d/cpu.conf
echo 'CPUQuota=80%' >> /etc/systemd/system/patroni.service.d/cpu.conf

# postgres+patroni должны оставить cpu для etcd, pgagent, pgbouncer, pgpool
# вот как бы ещё оставить cpu для самого patroni. чтобы postgres съедал не всё

df -hT | grep -v 'squashfs\|tmpfs\|overlay'
Filesystem                             Type      Size  Used Avail Use% Mounted on
/dev/sda1                              ext4       32G  2.9G   27G  10% /
/dev/mapper/postgresql_wal_vg-pg_wal   ext4      5.9G  369M  5.2G   7% /pg_wal
/dev/mapper/dcs_vg-dcs                 ext4      3.9G  124M  3.6G   4% /dcs
/dev/mapper/postgresql_data_vg-pg_data xfs       8.0G  129M  7.9G   2% /pg_data

mkdir -p /etc/systemd/system/etcd.service.d
echo '[Service]' > /etc/systemd/system/etcd.service.d/cpu.conf
echo 'IODeviceLatencyTargetSec=/dev/mapper/dcs_vg-dcs 50ms' >> /etc/systemd/system/etcd.service.d/cpu.conf

# непонятно, будет ли это работать так, как предполагается
# возможно, это зависит от железа
# возможно, придётся подбирать IOReadBandwidthMax, IOWriteBandwidthMax для postgresql

systemctl daemon-reload
systemctl restart etcd.service 
systemctl restart patroni
patronictl list
patronictl switchover

lsblk 
NAME                           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                              8:0    0   32G  0 disk 
└─sda1                           8:1    0   32G  0 part /
sdb                              8:16   0    8G  0 disk 
└─sdb1                           8:17   0    8G  0 part 
  └─postgresql_data_vg-pg_data 253:1    0    8G  0 lvm  /pg_data
sdc                              8:32   0    6G  0 disk 
└─sdc1                           8:33   0    6G  0 part 
  └─postgresql_wal_vg-pg_wal   253:0    0    6G  0 lvm  /pg_wal
sdd                              8:48   0    4G  0 disk 
└─sdd1                           8:49   0    4G  0 part 
  └─dcs_vg-dcs                 253:2    0    4G  0 lvm  /dcs
sr0                             11:0    1  3.7G  0 rom  

cgget -r io.latency /critical.slice/etcd.service
/critical.slice/etcd.service:
io.latency: 8:48 target=50000

cgget -r cpu.max /pgcluster.slice/patroni.service
/pgcluster.slice/patroni.service:
cpu.max: 80000 100000

systemd-cgls --full --no-pager | grep -v color | grep 'slice\|service\|postgres'
-.slice
├─pgcluster.slice 
│ └─patroni.service …
│   ├─ 7655 /usr/bin/postgres -D /var/lib/pgsql/data --config-file=/var/lib/pgsql/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5434 --cluster_name=alt-cls --wal_level=replica --hot_standby=on --max_connections=100 --max_wal_senders=10 --max_prepared_transactions=0 --max_locks_per_transaction=64 --track_commit_timestamp=off --max_replication_slots=10 --max_worker_processes=8 --wal_log_hints=on
│   ├─ 7656 postgres: alt-cls: logger
│   ├─ 7658 postgres: alt-cls: checkpointer
│   ├─ 7659 postgres: alt-cls: background writer
│   ├─ 7660 postgres: alt-cls: stats collector
│   ├─ 7667 postgres: alt-cls: clsadmin postgres 127.0.0.1(56510) idle
│   ├─ 7692 postgres: alt-cls: walsender clsreplica 172.27.172.147(55702) streaming 0/1E047BD8
│   ├─ 7703 postgres: alt-cls: walwriter
│   ├─ 7704 postgres: alt-cls: autovacuum launcher
│   ├─ 7705 postgres: alt-cls: archiver last was 00000014000000000000001E.partial
│   ├─ 7706 postgres: alt-cls: logical replication launcher
│   ├─ 7726 postgres: alt-cls: pgagent pgedb 127.0.0.1(56544) idle
│   └─ 7782 postgres: alt-cls: walsender clsreplica 172.27.172.148(49720) streaming 0/1E047BD8
├─critical.slice 
│ └─etcd.service …
├─user.slice 
│ ├─pgpool.service 
│ ├─user-0.slice 
│ │ └─user@0.service …
│ ├─pgagent.service 
│ └─pgbouncer.service 
└─system.slice 
  ├─systemd-udevd.service 
  ├─chronyd.service 
  ├─systemd-journald.service 
  ├─sshd.service 
  ├─crond.service 
  ├─nslcd.service 
  ├─systemd-userdbd.service 
  ├─rpcbind.service 
  ├─nscd.service 
  ├─postfix.service 
  ├─alteratord.service 
  ├─dbus.service 
  ├─system-getty.slice 
  │ └─getty@tty1.service 
  └─systemd-logind.service 

Почитать
https://habr.com/ru/company/redhatrussia/blog/423051/
https://habr.com/ru/company/redhatrussia/blog/424367/
https://habr.com/ru/company/redhatrussia/blog/425803/
https://habr.com/ru/company/redhatrussia/blog/427413/
https://habr.com/ru/company/redhatrussia/blog/429064/
https://habr.com/ru/company/redhatrussia/blog/430748/


Замечание

Установка и использование ioping

apt-get install moreutils ioping
# dnf config-manager --set-enabled powertools
# dnf -y install moreutils ioping

timeout 60 ioping /dev/sda1 | ts '[%FT%T%z]' | tee /var/log/ioping.log
  • запускает на 60 секунд ioping с логированием в файл