Видеонаблюдение под Linux

Конфигурация AVReg для распределения нагрузки по нескольким процессорам многопроцессорных систем или ядрам многоядерных процессоров (SMP).

Для чего нужно:

  • «завести» на сервер больше камер;
  • увеличить скорость записи/просмотра в кадрах в сек (прим.: если позволяют устройства видеоввода);
  • разгрузить перегруженный (%CPU > 60%) видеосервер.

Необходимые условия:

  1. аппаратная часть:
    1. многопроцессорную платформу или многоядерный процессор;
    2. включить/разрешить соответствующую опцию BIOS (по разному может называться);
  2. программная часть:
    1. ядро linux, собранное с поддержкой SMP (включено по умолчанию или доступно в репозиториях большинства современных дистрибутивов Linux);

как узнать, поддерживает ли ядро SMP

% uname -a
Linux host19 2.6.22-4-686-bigmem #1 SMP Tue Feb 12 19:21:05 UTC 2008 i686 GNU/Linux

% cat /proc/cpuinfo | egrep '^(processor|model name|cpu MHz)'
processor       : 0
model name      : Intel(R) Core(TM)2 Quad CPU           @ 2.40GHz
cpu MHz         : 2397.669
processor       : 1
model name      : Intel(R) Core(TM)2 Quad CPU           @ 2.40GHz
cpu MHz         : 2397.669
processor       : 2
model name      : Intel(R) Core(TM)2 Quad CPU           @ 2.40GHz
cpu MHz         : 2397.669
processor       : 3
model name      : Intel(R) Core(TM)2 Quad CPU           @ 2.40GHz
cpu MHz         : 2397.669

Реализованный в AVReg способ распределения нагрузки на разные процессоры/ядра (далее cpu) называется «на уровне процессов» (другой возможный способ - «на уровне потоков»).

Он заключается в запуске на одном сервере нескольких независимых копий процесса avregd, каждый из которых настройками в дополнительных конфигурационных файлах - профилях:

  1. «привязывается» к определённому cpu;
  2. «обслуживает» свою группу камер.

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

Основные достоинства данного способа вытекают из независимости процессов avregd друг от друга, что позволяет иметь/делать нижеследующие вещи:

  1. критический сбой одного процесса (читай группы камер) никак не влияет на работу других;
  2. независимое управление (start/stop/restart/reload) процессов (групп камер).

Настройки.

Напомним, что все основные настройки всех приложений AVReg сосредоточены в единственном конфигурационном файле: «/etc/avreg/avreg.conf» В нём есть глобальная секция (в самом начале) с общими параметрами для всех приложений и секции приложений - частные параметры приложений.

пример синтаксиса avreg.conf:

# глобально указанный параметр
storage-dir = '/var/spool/avreg'
...
avregd {
    ...
    storage-dir = '/home/vasya/my-xxx-video'
    # переопределение storage-dir для приложения демона avregd
    ...
}
...

Помимо основного и единственного конфигурационного файла 'avreg.conf', для всех приложений AVReg существует возможность определения дополнительных конфигурационных файлов - профилей.

Профили размещаются в каталоге «/etc/avreg/profiles».

Имя файла профиля должно соответствовать следующим правилам:

  1. первая буква должна быть из диапазона [A-Za-z0-9];
  2. следующие буквы - [A-Za-z0-9-:];
  3. длина имени - не более 55 знаков, рекомендуем не более 10.

Совет: легко выключать профиль без удаления файла, добавив в начало его имени неразрешённый знак, например: «_» или «~».

Для реализации нашей задачи (см. заголовок) нам понадобится создать несколько профилей, наиболее вероятно - по количеству cpu.

Итак, предположим, что сервер имеет 2-х ядерный CPU (например, Core2 Duo) и обеспечивает захват, запись и мониторинг с 8-ми однотипных камер (сетевых или аналоговых, в данном контексте - не важно).

В каталоге «/etc/avreg/profiles» Создаём 2 текстовых файла - профиля:

  1. cpu0-cams1-4
  2. cpu1-cams5-8

Прим.: названия выбраны для наглядности, более правильно называть профили в соответствии с группами камер, которые он «обслуживает», например: office, sklad13, road66, …

% ls -l /etc/avreg/profiles/[A-Za-z0-9][A-Za-z0-9-_:]*
-rw-r--r-- 1 root root 39 2008-01-28 19:06 /etc/avreg/profiles/cpu0-cams1-4
-rw-r--r-- 1 root root 39 2008-01-28 19:06 /etc/avreg/profiles/cpu1-cams5-8

Так как база данных и корневой каталог медиа-архива предполагаются общими (в отличие от avreg-multi-user), нам необходимо изменить лишь настройки демона avregd, а, конкретно, параметры «devlist», «cpu» и «http-port». Причём, «devlist» указываем в глобальной секции, так как это необходимо знать другим приложениям, например, веб-интерфейсу avreg-site.

Вот, что у нас получилось:

% cat /etc/avreg/profiles/cpu0-cams1-4

# профиль «cpu0-cams1-4»

devlist = 1-4

avregd {
   cpu = 0
   http-port = 874
}

avreg-site {
   avregd-httpd = 'http://$_SERVER[SERVER_NAME]:874'
}

% cat /etc/avreg/profiles/cpu1-cams5-8

# профиль «cpu1-cams5-8»

devlist = 5-8

avregd {
   cpu = 1
   http-port = 876
}

avreg-site {
   avregd-httpd = 'http://$_SERVER[SERVER_NAME]:876'
}

Запуск.

При загрузке и остановке системы посредством init-скриптов запуска, все доступные профили запускаются/останавливаются автоматически. Порядок запуска/остановки определяется символьной сортировки названий профилей, например:

% ls -1 /etc/avreg/profiles
cpu0-cams1-4
cpu1-cams5-8

% sudo service avreg start
Starting AVReg surveillance system server: avregd-cpu0-cams1-4[13623] started; avregd-cpu1-cams5-8[13600] started; .

% sudo /etc/init.d/avreg stop
Stopping AVReg surveillance system server: avregd-cpu0-cams1-4[13623] started; avregd-cpu1-cams5-8 stopped; .

Однако, каждым профилем можно управлять независимо:

% sudo service avreg restart cpu1-cams5-8
Stopping AVReg surveillance system server:  avregd-cpu1-cams5-8 stopped; .
Starting AVReg surveillance system server:  avregd-cpu1-cams5-8[13232] started; .

% sudo service avreg stop cpu1-cams5-8
Stopping AVReg surveillance system server:  avregd-cpu1-cams5-8 stopped; .

% sudo kill `cat /var/run/avregd-cpu1-cams5-8.pid`

С веб-интерфейса доступно управление только по отдельности.

 запуск/останов с веб-интерфейса

Мониторинг.

проверяем статус процессов

% service avreg status
WARNING: You are not the superuser root. You are assured that correctly do?
Status of AVReg surveillance system server: avregd-cpu1-cams5-8[12521] start 19:20; avregd-cpu0-cams1-4[12345] start 19:20;

То же с веб-интерфейса: см. скрин-шот ниже.  статус процессов avregd в веб-интерфейсе

расположение pid-файлов

% ls /var/run/avreg/
avregd-cpu0-cams1-4.pid  avregd-cpu1-cams5-8.pid

утилитой PS

% ps u -C avregd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
avreg    12345  0.1  0.1  29436  5216 ?        SNsl 19:20   0:00 avregd-cpu0-cams1-4 devs=[1-4]
avreg    12521  0.2  0.1  30148  5960 ?        SNsl 19:20   0:01 avregd-cpu1-cams5-8 devs=[5-8]

утилитой TOP - смотрим привязку и загрузку CPU

% top -bn1c1 -u avreg
top - 19:27:30 up  8:15,  1 user,  load average: 0.30, 0.15, 0.13
Tasks: 212 total,   1 running, 211 sleeping,   0 stopped,   0 zombie
Cpu0  :  2.1%us,  0.8%sy,  0.0%ni, 94.6%id,  2.2%wa,  0.2%hi,  0.1%si,  0.0%st
Cpu1  : 29.5%us,  5.3%sy,  0.0%ni, 65.1%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  4.5%us,  0.8%sy,  0.0%ni, 94.6%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  2.4%us,  0.4%sy,  0.0%ni, 97.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4084136k total,  2196356k used,  1887780k free,   679964k buffers
Swap:  8000352k total,        0k used,  8000352k free,   986912k cached

  PID USER      PR  NI P  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
12345 avreg     25  10 0 29436 5216 1500 S    0  0.1   0:00.50 avregd-cpu0-cams1-4 devs=[1-4]
12521 avreg     25  10 1 30148 5960 1520 S    0  0.1   0:01.12 avregd-cpu1-cams5-8 devs=[5-8]

конфигурация top для просмотра процессов с привязкой к CPU

 
% cat ~/.toprc
...
Def     fieldscur=AEHIJOQTWKNMbcdfgplrsuvyzX
...

Неразделяемые ресурсы

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

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

Например, если несколько профилей пересекаются по номерам камер:

% sudo service avreg start
Starting AVReg surveillance system server:  avregd-cpu0-cams1[9916] started;
ERROR: cam[01] locked another proc avregd-cpu0-cams1[9916], lock file `/var/lock/avreg/DB:avreg5_db..cam01'
avregd-5.1.2 error starup. See syslog for detail.
avregd-cpu1-cams2 failed;  failed!

Смотрим системный журнал:

% sudo tail -n 50 /var/log/daemon.log 
...
Apr  5 18:08:21 host19 avregd-cpu1-cams2: cam[01] locked another proc avregd-cpu0-cams1[9916], lock file `/var/lock/avreg/DB:avreg5_db..cam01'
# вольный перевод: cam[1] заблокирована другим процессом avregd-cpu0-cams1[9916], лок-файл `/var/lock/avreg/DB:avreg5_db..cam01'
...
Apr  5 18:08:21 host19 avregd-cpu1-cams2: CLEANUP(0): videoserv terminated

Перечислим такие «уникальные» для всей системы ресурсы:

  • номер камеры - группы камер в профилях (параметр devlist) не должны пересекаться, контролируется;
  • захват:
    • videodev - номер устройства видеозахвата, контролируется
    • InetCam_IP/InetCam_http_port - адрес и порт сетевой камеры, не контролируется;
  • запись на диск:
    • storage-dir - каталог с медиа-архивом (в конфигурационном файле или профиле), правило: каждому профилю с отдельной базой данных данных свой каталог, контролируется;
  • наблюдение:
    • v4l_pipe - имя устройства для трансляции видео (локальный просмотр), контролируется;
    • http-port - номер порта http-сервера (указывается в avreg.conf или профилях), с которого обеспечивается трансляция видео по сети.

Ссылки по теме.

manual/applications/smp.txt · Последние изменения: 2011-02-28