Презентация: http://www.slideshare.net/pavel_odintsov/containers-in-real-world видео будет скорее всего здесь: http://tech.yandex.ru/events/yagosti/msk-feb-2014/
Saturday, 15 February 2014
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
Monday, 10 February 2014
Поддерживается ли SVG современными браузерами?
Да да да!
По данным вики:
По данным вики:
All major modern web browsers—including Mozilla Firefox, Internet Explorer 9 and 10, Google Chrome, Opera, and Safari—have at least some degree of support for SVG and can render the markup directly.
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х конфигов не получится.
Копируем примеры конфигов:
Чтобы исправить это открываем /etc/init.d/cgred и комментируем 43ю строку с кодом: "/etc/rc.d/init.d/functions".
Потом ищем строку "daemon --check $servicename --pidfile $pidfile $CGRED_BIN $OPTIONS" и заменяем на:
Далее правим:
Еще нужно исправить группу, от имени которой будет работать демон:
Далее нам нужно создать папку для нашей cgroup:
Все, теперь убеждаемся, что процессы попали в нужную cgroup:
В отличие от 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 "
Зачем? :) Очень просто - хочется новых утилит - 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После этого идем на 19755ю строку файла configure и под текстом "WARNING: setns syscall not found; do not build nsenter" правим build_nsenter=no на build_nsenter=yes.
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
./configure --prefix=/opt/util-linux-2-23Таким образом, нам нужен системный вызов setns, который используется на 288й строке sys-utils/nsenter.c и которого нет в RHEL 6.5 ядре (OpenVZ 2.6.32-042stab084.17).
make
make install
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: здесь.
Чем же 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: здесь.
Subscribe to:
Posts
(
Atom
)