aboutsummaryrefslogtreecommitdiffstats
path: root/systemenvironments.tex
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2015-06-06 12:39:34 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2015-06-06 14:58:37 +0200
commitb7d66edf8d0ccafa9a0b1a901d118a4fb53a0879 (patch)
tree9fc387e922b566681bc7357fa5ead336ccd0cc2d /systemenvironments.tex
parentc8e0edd058bb19d0cf372f451908f165265577d3 (diff)
downloadmmbtools-doc-b7d66edf8d0ccafa9a0b1a901d118a4fb53a0879.tar.gz
mmbtools-doc-b7d66edf8d0ccafa9a0b1a901d118a4fb53a0879.tar.bz2
mmbtools-doc-b7d66edf8d0ccafa9a0b1a901d118a4fb53a0879.zip
Add section on production environment
Diffstat (limited to 'systemenvironments.tex')
-rw-r--r--systemenvironments.tex167
1 files changed, 167 insertions, 0 deletions
diff --git a/systemenvironments.tex b/systemenvironments.tex
new file mode 100644
index 0000000..d9cf5ff
--- /dev/null
+++ b/systemenvironments.tex
@@ -0,0 +1,167 @@
+\section{System Environment}
+
+In this section, we are going to discuss system requirements for a continuous
+operation of the tools. This environment differs in some regards to the one used
+for experiments and laboratory tests, given that monitoring, self-recovery in
+case of errors and resistance to failure are much more important in a 24/7
+operation. We will be using the term \emph{production environment} to refer to
+such a usage.
+
+\subsection{Launching the tools}
+
+Services running in a production environment are usually administered remotely,
+and have to be able to run without requiring a user to be connected all the
+time. Traditionally, such services are implemented as daemons in UNIX
+terminology, and are started and stopped using the init system of the
+distribution.
+The ODR-mmbTools cannot daemonise themselves, and require another approach.
+
+\paragraph{Screen multiplexer}
+An easy approach is to use a screen multiplexer, like \emph{GNU Screen} or
+\emph{tmux} that can be used to launch a session from which the user can detach
+and reattach. See the relevant manpages for more information.
+
+A screen multiplexer alone does permit the tools to run without a user
+connected, but does not automatically restart failed processes, and does not
+send any warning emails in case of a fault. The
+dab-scripts\footnote{The dab-scripts are available on the Opendigitalradio
+github.}, already mentioned in \ref{usingexistingwebstreams}, can be a helpful
+addition in that case. They can monitor that the processes are still running,
+and if necessary restart them.
+
+\paragraph{supervisord}
+The execution of the tools can also be supervised by a dedicated tool instead of
+using the scripts. \texttt{supervisor}\footnote{\url{http://supervisord.org}} is
+(its name will not surprise you) exactly such a tool.
+
+Once installed, it reads the configuration in \texttt{/etc/supervisor.conf} and
+launches the processes it has to monitor. Each process to monitor is described
+by a file. The following example assumes the tools run as user \texttt{odr}, and
+the multiplex configuration is in
+\texttt{/home/odr/config.mux}, and launches ODR-DabMux.
+The logs of ODR-DabMux is written to the log specified files.
+
+\begin{lstlisting}
+[program:ODR-DabMux]
+command=odr-dabmux config.mux
+directory=/home/odr
+user=odr
+autostart=true
+autorestart=true
+stdout_logfile=/home/odr/logs/mux.out.log
+stderr_logfile=/home/odr/logs/mux.err.log
+\end{lstlisting}
+
+Once this configuration has been added to the supervisor configuration, the
+settings have to be reread using:
+\begin{lstlisting}
+supervisorctl reread
+\end{lstlisting}
+
+In order for supervisor to start managing and running this process, it has to be added:
+\begin{lstlisting}
+supervisorctl add ODR-DabMux
+\end{lstlisting}
+
+Setting up more processes can be simply achieved by customising this
+configuration template for the other tools. Examples are available in the
+\texttt{mmbtools-aux} repository, under the \texttt{supervisor} folder, and have
+to be customised to the paths used in your setup.
+
+supervisor also includes a small web-server that can display the state of the
+managed processes. It is enabled with the \verb+[inet_http_server]+ setting in
+the configuration file.
+
+\subsection{Logging}
+Essential for a production environment is traceability of events, which is
+achieved using logging of important messages.
+
+ODR-DabMux and ODR-DabMod both support logging to standard error, to a file and
+to the system logger \texttt{syslog}. Logging to syslog is the most flexible
+solution, because the log information can be forwarded over the network to a
+centralised logging server, and can be filtered according to the priority of
+each message. Both tools log to the LOCAL0 facility, which can be redirected to
+a file, in order to group ODR-mmbTools-related messages together.
+
+%\sidenote{Describe rsyslog configuration}
+
+In order to avoid that the log files grow over time to unreasonable sizes,
+\texttt{logrotate} should be setup to rotate the files automatically.
+%\sidenote{Describe logrotate configuration}
+
+
+\subsection{Timing}
+The ODR-mmbTools require a correct system time to function properly. This is
+especially important when running a SFN, but cannot be neglected for a proper
+production operation even with a single transmitter.
+
+The system needs to run a NTP client that synchronises the system time over the
+network. Correct synchronisation can be checked using the \texttt{lpeers}
+command of the \texttt{ntpq} tool. The magnitude of the offset, indicated in
+milliseconds, should be below 10.
+
+The performance of the NTP synchronisation should also be monitored permanently
+during operation.
+
+
+\subsection{Monitoring using munin}
+
+The Munin\footnote{\url{http://munin-monitoring.org/}} monitoring tool can
+create graphs for essential system health parameters, and can also send emails
+in case a specific value exceeds its allowed bounds. This helps the operator in
+assessing the system status and the well-functioning of the services.
+
+In addition to basic system measurements like CPU, RAM and disk usage, NTP
+synchronisation, disk and network performance and many other information, there
+are also custom data sources for ODR-DabMux.
+
+These data sources include ZMQ input buffer monitoring (buffer level, underruns
+and overruns) and input audio level (peak for both channels). This data source
+can be installed by copying \verb+doc/stats_dabmux_multi.py+ to
+\texttt{/etc/munin/plugins.d}. They require that the ODR-DabMux management
+server is enabled in the configuration, and will automatically generate the
+graphs for the subchannels used in the configuration.
+
+
+\subsection{Real-time Scheduling}
+
+As a general principle, it is advisable to run tools that do not need superuser
+privileges under another user than \texttt{root}. The same principle also
+applies to the ODR-mmbTools, where care has to be taken that the tools can
+request real-time scheduling when needed.
+
+This is achieved by adding the following to \texttt{/etc/security/limits.conf},
+assuming the tools are run under the user \texttt{odr}.
+
+\begin{lstlisting}
+odr - rtprio 65
+odr - nice -10
+\end{lstlisting}
+
+If you have installed JACK with real-time privileges, you might already find the
+same setting, but for the audio group, written as \texttt{@audio}, which is
+sufficient.
+
+\subsection{Accessing the USRP as Non-root}
+
+Superuser privileges are not required to access USB-connected USRP devices, but
+sometimes the system lacks the configuration to enable normal users to
+communicate to the device.
+
+In that case, it is necessary to add a rule file for \texttt{udev}. This file is
+included in the UHD sources, but might not have been automatically installed.
+
+The file is called \texttt{uhd-usrp.rules}, should be placed into
+\texttt{/etc/udev/rules.d/} and should contain
+{ \footnotesize
+\begin{verbatim}
+#USRP1
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="fffe", ATTRS{idProduct}=="0002", MODE:="0666"
+#B100
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2500", ATTRS{idProduct}=="0002", MODE:="0666"
+#B200
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2500", ATTRS{idProduct}=="0020", MODE:="0666"
+\end{verbatim}
+}
+
+% vim: spl=en spell tw=80 et