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

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

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

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

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

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

как узнать, поддерживает ли ядро 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

версии пакетов, с поддержкой SMP

% dpkg -l 'avreg*'
ii  avreg-common  5.4.2  common files for AVReg surveillance system
ii  avregd        5.4.2  video/audio capture/streaming/record server for AVReg surveillance sys
ii  avreg-site    5.4.2  web-site for AVReg surveillance system
ii  avreg-unlink  5.4.1  media storage cleaner for AVReg surveillance system
ii  avreg-mon     5.4.2  local cameras viewer for for AVReg surveillance system

Реализованный в 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 - бессмысленно 
    ...
}
...

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

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

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

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

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

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

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

Создаём 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». Причём, «devlist» указываем в глобальной секции, так как он потенциально интересен и другим приложениям, например, веб-интерфейсу avreg-site.

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

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

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

devlist = 1-4

avregd {
    cpu = 0
}

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

# профиль «cpu1-cams5-8»
devlist = 5-8
avregd {
    cpu = 1
}

В плане конфигурирования через конф.файлы - всё.

Запуск.

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

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

% sudo /etc/init.d/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 killall avregd

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

% sudo /etc/init.d/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 /etc/init.d/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`

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

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

Мониторинг.

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

% /etc/init.d/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]

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

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

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

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

Например,

% sudo /etc/init.d/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 - имя устройства для трансляции видео (локальный просмотр), контролируется;
    • wc_port - номер порта http-сервера с которого обеспечивается трансляция видео на сетевых клиентов, не контролируется,
      Apr 6 18:28:57 host19 avregd-sklad: listen_socket(8081,0) -> bind() failed: Address already in use
      Apr 6 18:28:57 host19 avregd-sklad: cam[1]: could`t start Multipart JPEG(webcam) stream server on port 8081: Address already in use
      

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

manual/applications/smp.txt · Последние изменения: 2009-06-08 support