Docker 2024 04/Resource Restriction: Unterschied zwischen den Versionen
Drlue (Diskussion | Beiträge) |
Drlue (Diskussion | Beiträge) |
||
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 6: | Zeile 6: | ||
=== Testimage === | === Testimage === | ||
Folgendes Image bietet einige Anwendungen um die Ressourcenlimitierung zu prüfen. | |||
==== Dockerfile ==== | ==== Dockerfile ==== | ||
Inhalt in Datei '''Dockerfile''' | Inhalt in Datei '''Dockerfile''' | ||
| Zeile 15: | Zeile 16: | ||
}} | }} | ||
==== | ==== Image erstellen ==== | ||
{{BML|code=docker build . -t | {{BML|code=docker build . -t resource_limiting_base:1.0}} | ||
=== Memory === | === Memory === | ||
512mb RAM, keine Möglichkeit zum swappen | 512mb RAM, keine Möglichkeit zum swappen | ||
{{BML|code= | {{BML|code= | ||
docker run --memory 512m --memory-swap 512m --rm -it | docker run --memory 512m --memory-swap 512m --rm -it resource_limiting_base:1.0 bash | ||
# tail will be filled with up to 3000mb at a rate of 100mb/s | # tail will be filled with up to 3000mb at a rate of 100mb/s | ||
head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail | head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail | ||
| Zeile 28: | Zeile 29: | ||
512mb RAM, 1gb swap Speicher | 512mb RAM, 1gb swap Speicher | ||
{{BML|code= | {{BML|code= | ||
docker run --memory 512m --memory-swap 1536m --rm -it | docker run --memory 512m --memory-swap 1536m --rm -it resource_limiting_base:1.0 bash | ||
# tail will be filled with up to 3000mb at a rate of 100mb/s | # tail will be filled with up to 3000mb at a rate of 100mb/s | ||
head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail | head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail | ||
| Zeile 36: | Zeile 37: | ||
1 Kern | 1 Kern | ||
{{BML|code= | {{BML|code= | ||
docker run --cpus 1 --rm -it | docker run --cpus 1 --rm -it resource_limiting_base:1.0 bash | ||
# stress-ng cpu test (16 cores) for 10 seconds | # stress-ng cpu test (16 cores) for 10 seconds | ||
stress-ng --cpu 16 --timeout 10s | stress-ng --cpu 16 --timeout 10s | ||
| Zeile 43: | Zeile 44: | ||
2 Kerne | 2 Kerne | ||
{{BML|code= | {{BML|code= | ||
docker run --cpus 2 --rm -it | docker run --cpus 2 --rm -it resource_limiting_base:1.0 bash | ||
# stress-ng cpu test (16 cores) for 10 seconds | # stress-ng cpu test (16 cores) for 10 seconds | ||
stress-ng --cpu 16 --timeout 10s | stress-ng --cpu 16 --timeout 10s | ||
| Zeile 50: | Zeile 51: | ||
0.5 Kerne | 0.5 Kerne | ||
{{BML|code= | {{BML|code= | ||
docker run --cpus 0.5 --rm -it | docker run --cpus 0.5 --rm -it resource_limiting_base:1.0 bash | ||
# stress-ng cpu test (16 cores) for 10 seconds | # stress-ng cpu test (16 cores) for 10 seconds | ||
stress-ng --cpu 16 --timeout 10s | stress-ng --cpu 16 --timeout 10s | ||
| Zeile 59: | Zeile 60: | ||
'''/dev/sda''' ist hierbei nur ein Beispiel. Je nachdem wohin geschrieben wird, muss das entsprechende Device gefunden werden. | '''/dev/sda''' ist hierbei nur ein Beispiel. Je nachdem wohin geschrieben wird, muss das entsprechende Device gefunden werden. | ||
{{BML|code= | {{BML|code= | ||
docker run --device-write-bps /dev/sda:10mb --device-read-bps /dev/sda:30mb --rm -it | docker run --device-write-bps /dev/sda:10mb --device-read-bps /dev/sda:30mb --rm -it resource_limiting_base:1.0 bash | ||
# Write 100mb to /tmp/data (no cache) | # Write 100mb to /tmp/data (no cache) | ||
dd if=/dev/zero bs=1M count=100 of=/tmp/data oflag=direct | dd if=/dev/zero bs=1M count=100 of=/tmp/data oflag=direct | ||
| Zeile 70: | Zeile 71: | ||
=== Storage === | === Storage === | ||
Wie beim Netzwerk limitieren ist es nicht so einfach zu realisieren. Eine Möglichkeit bietet das [https://de.wikipedia.org/wiki/XFS XFS]<ref>https://de.wikipedia.org/wiki/XFS</ref> Dateisystem. Mittels z.B.: '''pquota''' kann dies auf '''Volume''' oder auch auf '''Folder Mount''' ebene realisiert werden. Siehe [https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html hier]<ref>https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html</ref> | Wie beim Netzwerk limitieren ist es nicht so einfach zu realisieren. Eine Möglichkeit bietet das [https://de.wikipedia.org/wiki/XFS XFS]<ref>https://de.wikipedia.org/wiki/XFS</ref> Dateisystem. Mittels z.B.: '''pquota''' kann dies auf '''Volume''' oder auch auf '''Folder Mount''' ebene realisiert werden. Siehe [https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html hier]<ref>https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html</ref> und [https://docs.oracle.com/en/operating-systems/oracle-linux/6/adminsg/ol_prjquo_xfs.html hier]<ref>https://docs.oracle.com/en/operating-systems/oracle-linux/6/adminsg/ol_prjquo_xfs.html</ref> | ||
Aktuelle Version vom 19. April 2024, 05:41 Uhr
Im folgenden soll die Limitierung der Ressourcen für Container erläutert werden, diese Informationen Beziehen sich auf das Host System GNU/Linux.
Eine Liste der Option zur Ressourcen Limitierung von CPU, Memory, GPU und Disk IO findet sich hier[1] und hier[2].
Während aller Tests docker stats in eigenem Terminal öffnen.
Testimage
Folgendes Image bietet einige Anwendungen um die Ressourcenlimitierung zu prüfen.
Dockerfile
Inhalt in Datei Dockerfile
FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y -y memtester pv stress-ng net-tools iproute2 netcat dnsutils curl iputils-ping tcpdump iperf3
Image erstellen
docker build . -t resource_limiting_base:1.0
Memory
512mb RAM, keine Möglichkeit zum swappen
docker run --memory 512m --memory-swap 512m --rm -it resource_limiting_base:1.0 bash
# tail will be filled with up to 3000mb at a rate of 100mb/s
head -c 3000m /dev/zero | pv -L 100m | tail
512mb RAM, 1gb swap Speicher
docker run --memory 512m --memory-swap 1536m --rm -it resource_limiting_base:1.0 bash
# tail will be filled with up to 3000mb at a rate of 100mb/s
head -c 3000m /dev/zero | pv -L 100m | tail
CPU
1 Kern
docker run --cpus 1 --rm -it resource_limiting_base:1.0 bash
# stress-ng cpu test (16 cores) for 10 seconds
stress-ng --cpu 16 --timeout 10s
2 Kerne
docker run --cpus 2 --rm -it resource_limiting_base:1.0 bash
# stress-ng cpu test (16 cores) for 10 seconds
stress-ng --cpu 16 --timeout 10s
0.5 Kerne
docker run --cpus 0.5 --rm -it resource_limiting_base:1.0 bash
# stress-ng cpu test (16 cores) for 10 seconds
stress-ng --cpu 16 --timeout 10s
Disk IO
50mb/s lesen, 10mb/s schreiben
/dev/sda ist hierbei nur ein Beispiel. Je nachdem wohin geschrieben wird, muss das entsprechende Device gefunden werden.
docker run --device-write-bps /dev/sda:10mb --device-read-bps /dev/sda:30mb --rm -it resource_limiting_base:1.0 bash
# Write 100mb to /tmp/data (no cache)
dd if=/dev/zero bs=1M count=100 of=/tmp/data oflag=direct
# Read 100mb from /tmp/data (no cache)
dd if=/tmp/data bs=1M of=/dev/null iflag=direct
Network
An dieser Stelle werden wir nicht weiter darauf eingehen, es gestaltet sich nicht so einfach wie die zuvor genannten Limitierungen. Weitere Informationen finden sich hier[3].
Storage
Wie beim Netzwerk limitieren ist es nicht so einfach zu realisieren. Eine Möglichkeit bietet das XFS[4] Dateisystem. Mittels z.B.: pquota kann dies auf Volume oder auch auf Folder Mount ebene realisiert werden. Siehe hier[5] und hier[6]
- ↑ https://docs.docker.com/engine/reference/run/
- ↑ https://docs.docker.com/config/containers/resource_constraints
- ↑ https://hechao.li/2023/08/28/container-bandwidth-limit
- ↑ https://de.wikipedia.org/wiki/XFS
- ↑ https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html
- ↑ https://docs.oracle.com/en/operating-systems/oracle-linux/6/adminsg/ol_prjquo_xfs.html