Archiv für den Monat: Mai 2014

FreeBSD 10: Hierarchical Resource Limits (RCTL)

RCTL ermöglicht eine Ressourcenlimitierung auf login class, process, user oder jail Ebene.

ausführliche Beschreibungen gibt es unter:

FreeBSD: rctl
FreeBSD: security-resourcelimits.html
FreeBSD: Hierarchical_Resource_Limits
FreeBSD: CPULimits

RCTLs lassen sich dynamisch, zur Laufzeit, setzen; /etc/rctl.conf dient dabei als Vorlage, ein „service rctl start/stop“ setzt die Ressourcenlimitierungen an oder aus

Zur Definierung von RCTLs mit Jails muss der tatsächliche Jailname (nicht Hostname) verwendet werden:

$
jls -n | awk '{print $8,$9}'
$

Benötigt wird:
– Kernel mit RACCT & RCTL

FreeBSD Beastie Installation: RACCT/RCTL

Punkt 1: zunächst wird mit den aktuellen Kernelsourcen der RACCT/RCTL Support hinzugefügt

$
cd /usr/ports/devel/subversion/ && make install clean

zfs create -o checksum=sha256 -o compression=lz4 -o mountpoint=/usr/src zroot/usr/src
zfs create -o checksum=sha256 -o compression=lz4 -o mountpoint=/usr/obj zroot/usr/obj

cd /usr
chflags -R noschg /usr/obj/*
rm -rfv /usr/obj/*
rm -rfv /usr/src/*
rm -rfv /usr/src/.svn

cd /usr/src
svn checkout https://svn0.eu.FreeBSD.org/base/releng/10.0 /usr/src
svn up /usr/src
$

Punkt 2: Kernel Konfig

$
cd /usr/src/sys/amd64/conf
mkdir /root/kernels
cp GENERIC /root/kernels/RCTL
ln -s /root/kernels/RCTL
vi /root/kernels/RCTL
$
$
### ### ### RCTL ### ### ###
#
cpu             HAMMER
ident           RCTL

makeoptions     DEBUG=-g                        # Build kernel with gdb(1) debug symbols
makeoptions     WITH_CTF=1                      # Run ctfconvert(1) for DTrace support

### < --- --- --- > ###

options         RACCT                           # Resource accounting
options         RCTL                            # Controls resource limits

#
### ### ### RCTL ### ### ###
$

Punkt 3: Kernel bauen/installieren

$
cd /usr/src
time make buildkernel KERNCONF=RCTL
time make installkernel KERNCONF=RCTL

reboot
$

Punkt 4: rc.local anpassen

$
vi /etc/rc.local

/usr/sbin/service rctl start
$

Punkt 5: rctl.conf definieren

Im folgenden Beispiel soll der ersten Jail (test01) nur maximal 40% CPU Leistung erlaubt werden, die zweite Jail (test02) bekommt zusätzlich noch eine Beschränkung der maximalen TTYs, eine Arbeitsspeicherlimitierung (realer RAM) und SWAP Begrenzung

$
vi /etc/rctl.conf

### ### ### RACCT/RCTL // ### ### ###

### jail - test01
#jail:test01:pcpu:log=40/jail
jail:test01:pcpu:deny=41/jail

### jail - test02
#jail:test02:pcpu:log=40/jail
jail:test02:pcpu:deny=41/jail
jail:test02:memoryuse:log=256M
jail:test02:memoryuse:sighup=500M
jail:test02:memoryuse:sigkill=506M
jail:test02:memoryuse:deny=512M
jail:test02:swapuse:log=496M
jail:test02:swapuse:deny=512M
#jail:test02:maxproc:log=50
#jail:test02:maxproc:deny=100
jail:test02:pseudoterminals:log=1
jail:test02:pseudoterminals:deny=2

### ### ### // RACCT/RCTL ### ### ###
# EOF
$
$
service rctl start
$

Punkt 6: aktive RCTLs anzeigen lassen

$
rctl -h
$

Punkt 7: derzeitigen Ressourcenverbrauch einer Jail anzeigen lassen

$
rctl -hu jail:test02
$

Ergänzungen:

Punkt .1: ein ausführen von cpuburn, in beiden Jails, zeigt mittels top -aSP eine klare Ressourcenlimitierung an

$
  PID USERNAME         THR PRI NICE   SIZE    RES STATE    TIME    WCPU COMMAND
81923 root               1  52    0 65676K  4164K racct    2:16  34.38% burnBX
81920 root               1  52    0 65676K  4164K racct    2:16  32.08% burnBX
   11 root               1 155 ki31     0K    16K RUN    621:51  25.88% [idle]
$

Punkt .2: eine Überstrapazierung von SSH Verbindungen führt durch die Limitierung der TTYs auch zu einer gewünschten Verbindungsablehnung:

$
ssh root@10.143.26.25

PTY allocation request failed on channel 0
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
$

Punkt .3: auf FreeBSD 9.2 / SPARC64 Maschinen kann ein Kernelcrash entstehen wenn bei einem Reboot/Shutdown nicht vorher die RCTL Regeln entfernt wurden:

$
reboot

Fri May 23 19:38:54 CEST 2014

FreeBSD/sparc64 (ttyu0)

pflog0: promiscuous mode disabled
panic: trap: kernel stack fault (kernel)
cpuid = -92546688
KDB: stack backtrace:
#0 0xc0923834 at trap+0x554
Uptime: 25m30s

SC Alert: Host System has Reset

CPU 0000.0000.0000.0001 AFSR 0210.9000.0100.0000 JETO PRIV OM TO
AFAR 0000.07bb.ccea.52e0
Fatal Error Reset 
Executing Power On Self Test
0>
0>@(#)Sun Fire[TM] V215/V245 POST 4.30.4 2009/08/19 07:35 
       /export/delivery/delivery/4.30/4.30.4/post4.30.4-micro/Fiesta/seattle/integrated  (root)  
0>Copyright 2009 Sun Microsystems, Inc. All rights reserved
0>FATAL Reset! 
0>OBP->POST Call with %o0=00000800.01014000.
0>Diag level set to MAX.
0>Verbosity level set to NORMAL.
0>
0>@(#)Sun Fire[TM] V215/V245 POST 4.30.4 2009/08/19 07:35 
       /export/delivery/delivery/4.30/4.30.4/post4.30.4-micro/Fiesta/seattle/integrated  (root)  
0>Copyright 2009 Sun Microsystems, Inc. All rights reserved
0>OBP->POST Call with %o0=00000800.01014000.
0>Diag level set to MAX.
0>Verbosity level set to NORMAL.
0>Start Selftest.....
0>CPUs present in system: 0 1
$

—> vor dem tatsächlichen reboot/halt genug ein service rctl stop <--- That’s FreeBSD