FastNetMon

Wednesday, 12 February 2014

Как себя ведет ploop диск в процессе снятия/мержа снапшота?

Итак, состояние до:
[root@ovz12 ~]# ls -la /vz/private/1232/root.hdd/
итого 1,2G
drwx------ 2 root root 4,0K Фев 12 22:36 .drwx------ 5 root root 4,0K Фев 12 22:36 ..-rw-r--r-- 1 root root  790 Фев 12 22:36 DiskDescriptor.xml
-rw------- 1 root root    0 Ноя 24 18:02 DiskDescriptor.xml.lck
-rw------- 1 root root 1,1G Фев  4 20:08 root.hdd
[root@ovz12 ~]# md5sum /vz/private/1232/root.hdd/DiskDescriptor.xml
f0840189b5ca3490eccba32a94e7930b  /vz/private/1232/root.hdd/DiskDescriptor.xml
Создаем снапшот:
[root@ovz12 ~]# vzctl snapshot 1232 --id 0b0d3181-c4e3-4564-aae5-4a1d5df2186a
Creating snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a}
Storing /vz/private/1232/Snapshots.xml.tmp
Setting up checkpoint...
suspend...
get context...
Checkpointing completed successfully
Storing /vz/private/1232/root.hdd/DiskDescriptor.xml.tmp
Creating delta /vz/private/1232/root.hdd/root.hdd.{4c6e204d-e1b0-4bc9-aa22-82537b3b5505} bs=2048 size=12288000 sectors v2
Creating snapshot dev=/dev/ploop41556 img=/vz/private/1232/root.hdd/root.hdd.{4c6e204d-e1b0-4bc9-aa22-82537b3b5505}
ploop snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a} has been successfully created
Setting up checkpoint...
join context..
dump...
Checkpointing completed successfully
Resuming...
Snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a} has been successfully created
После этого меняется размер и содержимое дескриптора (DiskDescriptor.xml):
[root@ovz12 ~]# md5sum /vz/private/1232/root.hdd/DiskDescriptor.xml
f8c5469b4eb192cd90b9ceba7f437a8e  /vz/private/1232/root.hdd/DiskDescriptor.xml

И также мы обнаруживаем файл дельты, который используется для записи изменений:
[root@ovz12 ~]# ls -la /vz/private/1232/root.hdd/
итого 1,2G
drwx------ 2 root root 4,0K Фев 12 22:37 .drwx------ 5 root root 4,0K Фев 12 22:37 ..-rw-r--r-- 1 root root 1,2K Фев 12 22:37 DiskDescriptor.xml
-rw------- 1 root root    0 Ноя 24 18:02 DiskDescriptor.xml.lck
-rw------- 1 root root 1,1G Фев  4 20:08 root.hdd
-rw------- 1 root root 4,0M Фев 12 22:37 root.hdd.{4c6e204d-e1b0-4bc9-aa22-82537b3b5505}

Теперь проводим обратный мерж данных:
[root@ovz12 ~]# vzctl snapshot-delete 1232 --id 0b0d3181-c4e3-4564-aae5-4a1d5df2186a
Deleting snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a}
Storing /vz/private/1232/Snapshots.xml.tmp
Opening delta /vz/private/1232/root.hdd/root.hdd
Merging top delta
Storing /vz/private/1232/root.hdd/DiskDescriptor.xml
Removing /vz/private/1232/root.hdd/root.hdd.{4c6e204d-e1b0-4bc9-aa22-82537b3b5505}
ploop snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a} has been successfully merged
Snapshot {0b0d3181-c4e3-4564-aae5-4a1d5df2186a} has been successfully deleted
В результате дескриптор придет в такое же состояние как был ранее (ключевая сумма не изменится), но пропадет файл дельты, так как будет интегрирован в оснвоной диск:
[root@ovz12 ~]# ls -la /vz/private/1232/root.hdd/
итого 1,2G
drwx------ 2 root root 4,0K Фев 12 22:37 .drwx------ 5 root root 4,0K Фев 12 22:37 ..-rw-r--r-- 1 root root  790 Фев 12 22:37 DiskDescriptor.xml
-rw------- 1 root root    0 Ноя 24 18:02 DiskDescriptor.xml.lck
-rw------- 1 root root 1,1G Фев  4 20:08 root.hdd
[root@ovz12 ~]# md5sum /vz/private/1232/root.hdd/DiskDescriptor.xml
f0840189b5ca3490eccba32a94e7930b  /vz/private/1232/root.hdd/DiskDescriptor.xml

Tuesday, 11 February 2014

Удобный просмотр OpenVZ UBC метрик

Как всем известно, cat /proc/user_beacounters отображает данные в страницах и чтобы их перевести в мегабайты нужны умножать на 4 килобайта, что ужасно неинтуитивно и сложно.

Поэтому рекомендую суперскрипт:
wget https://fastvps.googlecode.com/svn/trunk/scripts/vzubc bash vzubc

Быстрый анализ отказов UBC на OpenVZ


В итоге будет выдан список с именами параметров UBC, по которым были отказы:
 cat /proc/user_beancounters | awk '{if (NF == 6 && $6 != 0) print $1}' |sort | uniq -c
Примерно так:
      4 numproc
   

Wednesday, 5 February 2014

Чудесная утилита для контроля cgroup

Вот: https://github.com/peo3/cgroup-utils

Устанавливать так:
yum install -y python-pip python-devel
pip install cgroup-utils

Ее выдача просто чудесна:
[  CPUACCT  ]  [     BLKIO     ]  [        MEMORY       ]                                                                                      
 USR    SYS      READ    WRITE     TOTAL    RSS     SWAP     # NAME                                                                            
234.7%  51.3%                                              210 /
196.3%  34.3%                                              161 php
 25.3%  30.0%                                                1 mysql

И это на системе лишь с частью  активированных сгрупп.

Настройка cgroup на Debian 7

По мотивам статьи: http://www.stableit.ru/2012/10/cgroup-centos-6.html

В отличие от CentOS у Debian 7 Wheezy фактически нет нормального мейнтенера подсистемы cgroups, поэтому обойтись установкой пары пакетов и правкой 1-2х конфигов не получится.

apt-get install -y cgroup-bin libcgroup1

Копируем примеры конфигов:

cp /usr/share/doc/cgroup-bin/examples/cgconfig.conf /etc/cgconfig.conf
cp /usr/share/doc/cgroup-bin/examples/cgconfig.sysconfig /etc/default/cgconfig
zcat /usr/share/doc/cgroup-bin/examples/cgconfig.gz > /etc/init.d/cgconfig
chmod +x /etc/init.d/cgconfig 

Создаем спец-папку (без нее поймаем ошибку "touch: cannot touch /var/lock/subsys/cgconfig: No such file or directory [FAIL] Failed to touch /var/lock/subsys/cgconfig ... failed!"):
mkdir -p /var/lock/subsys

Теперь добавляем cgroup для тестов, пусть это будет cpuacct, так как она не приводит к деградациям и ее можно использовать безвредно и на боевом ПО.

Добавляем в конфиг: /etc/cgconfig.conf следующие строки:
mount {
    cpuacct = /mnt/cgroups/cpuacct;
}
group wwwdata {
  cpuacct {
  }
}


Теперь попробуем стартануть его:
 /etc/init.d/cgconfig restart

Убеждаемся, что cgroup была корректно смонтирована:
cat /proc/mounts |grep cgroup
cgroup /mnt/cgroups/cpuacct cgroup rw,relatime,cpuacct 0 0

А сама папка выглядит примерно так:
ls -al /mnt/cgroups/cpuacct/
total 4.0K
drwxr-xr-x. 3 root root    0 Feb  5 14:04 .drwxr-xr-x. 3 root root 4.0K Feb  5 14:04 ..-rw-r--r--. 1 root root    0 Feb  5 14:04 cgroup.clone_children
--w--w--w-. 1 root root    0 Feb  5 14:04 cgroup.event_control
-rw-r--r--. 1 root root    0 Feb  5 14:04 cgroup.procs
-r--r--r--. 1 root root    0 Feb  5 14:04 cpuacct.stat
-rw-r--r--. 1 root root    0 Feb  5 14:04 cpuacct.usage
-r--r--r--. 1 root root    0 Feb  5 14:04 cpuacct.usage_percpu
-rw-r--r--. 1 root root    0 Feb  5 14:04 notify_on_release
-rw-r--r--. 1 root root    0 Feb  5 14:04 release_agent
-rw-r--r--. 1 root root    0 Feb  5 14:04 tasks
drwxr-xr-x. 2 root root    0 Feb  5 14:04 wwwdata

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

Снова копируем конфиги:
cp /usr/share/doc/cgroup-bin/examples/cgrules.conf  /etc/cgrules.conf
cp /usr/share/doc/cgroup-bin/examples/cgred   /etc/init.d/cgred
cp /usr/share/doc/cgroup-bin/examples/cgred.conf /etc/default/cgred.conf
chmod +x  /etc/init.d/cgred

Далее правим баги мейнтейнеров Debian:
sed -i 's/sysconfig/default/' /etc/init.d/cgconfig

Потом добавялем туда (/etc/cgrules.conf) одну строчку в самый низ:
@www-data    cpuacct wwwdata/

Далее отключаем создание дефалт группы (в которую система будет помещать все процессы кроме тех, которые помещены в иные группы):

vim /etc/default/cgconfig
CREATE_DEFAULT=no

Таким образом мы настраиваем помещение всех процессов пользователя www-data в группу с именем wwwdata.

После этого несколько раз (потому что что-то в скриптах не то и с первого раза у него не выходит размонтировать cgroup) дергаем команду:
/etc/init.d/cgconfig stop

И потом запускаем:
/etc/init.d/cgconfig start

После этого настраиваем демона cgred, который, собственно, должен распихивать процессы по cgroup:
/etc/init.d/cgred start

Но нас постигнет ужасное разочарование - init скрипт тупо взят из RedHat без должной доработки под особенности Debian (впрочем, в  /etc/init.d/cgconfig примерное тоже самое - там вместо /etc/default используется путь /etc/sysconfig):

/etc/init.d/cgred: line 43: /etc/rc.d/init.d/functions: No such file or directory
Starting CGroup Rules Engine Daemon: /etc/init.d/cgred: line 85: daemon: command not found

Чтобы исправить это открываем /etc/init.d/cgred и комментируем 43ю строку с кодом: "/etc/rc.d/init.d/functions".

Потом ищем строку "daemon --check $servicename --pidfile $pidfile $CGRED_BIN $OPTIONS" и заменяем на:

start-stop-daemon --start --quiet --pidfile $pidfile --exec $CGRED_BIN -- $OPTIONS  

Далее правим:
sed -i 's/sysconfig/default/' /etc/init.d/cgred

Еще нужно исправить группу, от имени которой будет работать демон:

vim /etc/default/cgred.conf

и заменяем SOCKET_GROUP="cgred" на SOCKET_GROUP=""

Далее нам нужно создать папку для нашей cgroup:

mkdir /mnt/cgroups/cpuacct/wwwdata
Итак, запускаем демона:
/etc/init.d/cgred start

После этого нужно инициировать перезапуск процессов, которые нам интересно поместить в cgroup, в моем случае это nginx работающий от имени пользователя www-data:
/etc/init.d/nginx reload

Все, теперь убеждаемся, что процессы попали в нужную cgroup:
cat /mnt/cgroups/cpuacct/wwwdata/tasks
28623
28624
28625
28626

Monday, 3 February 2014

Сборка util-linux 2.23 на CentOS 6

Мануал нерабочий!!!!

Зачем? :) Очень просто - хочется новых утилит - nsenter (вход в определенный Linux Kernel Namespace), unshare (создание нового Namespace). Обращаю внимание, что собираем мы именно 2.23ю версию, хотя актуальная версия 2.24, но ее не удастся собрать потому что в CentOS 6 нет системного вызова setns и сборка nsenter будет отменена с ошибкой: "WARNING: setns syscall not found; do not build nsenter "
yum install -y ncurses-devel pam-devel
cd /usr/src
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.23.tar.gz
tar -xf util-linux-2.23.tar.gz
cd util-linux-2.23
После этого идем на 19755ю строку файла configure и под текстом "WARNING: setns syscall not found; do not build nsenter" правим build_nsenter=no на build_nsenter=yes.
./configure --prefix=/opt/util-linux-2-23
make
make install
Таким образом, нам нужен системный вызов setns, который используется на 288й строке sys-utils/nsenter.c и которого нет в RHEL 6.5 ядре (OpenVZ 2.6.32-042stab084.17).

Sunday, 2 February 2014

Windows Storage Spaces - новое слово в хранении данных

В Windows 2012 появилась очень крутая фича - Storage Spaces. Суть ее для линуксоида проще передать такими терминами как LVM на стероидах или менеджер томов. Что-то похожее есть как часть функционала в ZFS и Btrfs. Это возможность создавать логические блочные диски из пула дисков.

Чем же Storage Spaces круты?

Например, тем, что умеют три уровня избыточности:
1) Нет избыточности
2) Зеркалирование 2х уровневое (выдерживает отказ одного диска, требует по меньшей мере два диска) и 3х уровневое (выдерживает отказ 2х дисков, но требует от 5 дисков)
3) Хранение данных с кодами избыточности (parity). Также бывает двух видов - выдерживающее отказ любого одного диска (требует по меньшей мере 3 диска) и выдерживающее отказ любых двух дисков (требует по меньшей мере 7 дисков).

Похоже на RAID-1, RAID-5 и RAID-6, но на порядки круче! Почему? Потому что, например, в случае зеркала данные не зеркалируются тупо с диска на диск, а этот процесс очень интеллектуален и выполняется на уровне отдельных блоков выделенного блочного устройства. Иными словами, можно собрать зеркало из 3х дисков по 1тб и это зеркало будет примерно на 1.4Тб. То есть, блочное устройство построенное поверх Storage Spaces распределило блоки так, чтобы выдержать отказ любого диска. Этот подход дает потрясающую гибкость и неподражаемую отказоустойчивость сочетающуюся со скоростью работы!

Как дополнительную фичу стоит отметить поддержку уровне (tiers), когда можно добавить SSD диски и система САМА будет переносить данные, к которым обращаются чаще всего на более быстрый накопитель. Это своего рода аналог MaxIQ 2.0.

Если среди читающих есть разработчики под ядро Linux - отличный способ сделать себе имя - реализовать подобное в открытом коде!

Данный пост является откровением после геройского изобретения велосипеда в посте  про BLOCK-RAID.

Подробности по Windows Storage Spaces: здесь.