Видеонаблюдение через интернет в веб-браузере

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

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

  • увеличить производельность системы ( больше камер или увеличить скорость записи или снизить загрузку на процессор b т.п.)
  • обеспечить просмотр более 6 камер последними версиями браузеров на основе Webkit (Google Chrome, Safari) и Gecko (Mozilla Firefox и клоны);

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

  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. «обслуживает» свою группу камер.
  2. опционально может быть «привязыван» к определённому cpu (если определён соотв. параметр, иначе - планировщик ядра linux самостоятельно решит этот вопрос);

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

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

Настройки.

Помимо основного и единственного конфигурационного файла '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. cams_01-04
  2. cams_05-08

Прим.: названия выбраны для наглядности, более правильно называть профили в соответствии с группами камер, которые он «обслуживает», например: 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/cams_01-04
-rw-r--r-- 1 root root 39 2008-01-28 19:06 /etc/avreg/profiles/cams_05-08

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

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

% cat /etc/avreg/profiles/cams_01-04

# профиль «cams_01-04»

devlist = 1-4

avregd {
   http-port = 874
}

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

% cat /etc/avreg/profiles/cams_05-08

# профиль «cams_05-08»

devlist = 5-8

avregd {
   http-port = 876
}

avreg-site {
   avregd-httpd = 'http://$_SERVER[SERVER_NAME]:876'
}
Перед созданием и/или изменением конфигов профилей обязательно остановите программу avreg:
# service avreg stop

А в случае использования systemd в качестве системного init, после изменения необходимо выполнить:

# systemctl daemon-reload 

Запуск.

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

% ls -1 /etc/avreg/profiles
cams_01-04
cams_05-08

% sudo service avreg start
Starting AVReg surveillance system server: avregd-cams_01-04[13623] started; avregd-cams_05-08[13600] started; .

% sudo /etc/init.d/avreg stop
Stopping AVReg surveillance system server: avregd-cams_01-04[13623] started; avregd-cams_05-08 stopped; .

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

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

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

% sudo kill `cat /var/run/avregd-cams_05-08.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-cams_05-08[12521] start 19:20; avregd-cams_01-04[12345] start 19:20;

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

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

% ls /var/run/avreg/
avregd-cams_01-04.pid  avregd-cams_05-08.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-cams_01-04 devs=[1-4]
avreg    12521  0.2  0.1  30148  5960 ?        SNsl 19:20   0:01 avregd-cams_05-08 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-cams_01-04 devs=[1-4]
12521 avreg     25  10 1 30148 5960 1520 S    0  0.1   0:01.12 avregd-cams_05-08 devs=[5-8]

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

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

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

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

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

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

% sudo service avreg start
Starting AVReg surveillance system server:  avregd-cams1[9916] started;
ERROR: cam[01] locked another proc avregd-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-cams2: cam[01] locked another proc avregd-cams1[9916], lock file `/var/lock/avreg/DB:avreg5_db..cam01'
# вольный перевод: cam[1] заблокирована другим процессом avregd-cams1[9916], лок-файл `/var/lock/avreg/DB:avreg5_db..cam01'
...
Apr  5 18:08:21 host19 avregd-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 · Последние изменения: 2015-10-08