LXC – nierówna walka z IO

Niedawno jeden z klientów miał problem z obciążaniem macierzy przez operacje IO. Z racji biznesu jaki prowadzi, ważne było, aby poszczególne instancje procesów były od siebie odseparowane, możliwie z jak najmniejszym narzutem. Wybrór padł na LXC. Sama konfiguracja i limitowanie wszystkiego poza IO nie sprawiło problemów. Wszystko działa stabilnie:

root@nodeA # lxc-ls -f
 NAME   STATE    IPV4             IPV6  AUTOSTART
 ------------------------------------------------
 fh1    RUNNING  10.1.1.200       -     YES
 fh2    RUNNING  10.1.1.102       -     YES
 fh3    RUNNING  10.1.1.240       -     YES
 fh4    RUNNING  10.1.1.150       -     YES

root@nodeA # lxc-info -n fh5
 Name: fh5
 State: RUNNING
 PID: 2664
 IP: 10.1.1.217
 CPU use: 3685.40 seconds
 Memory use: 582.64 MiB
 Link: vethB42HVS
 TX bytes: 22.17 MiB
 RX bytes: 37.91 MiB
 Total bytes: 60.08 MiB

Tak jak wspomniałem wcześniej stanąłem do walki z limitowaniem IO, gdyż chcieliśmy aby narzut IO na jednym kontenerze nie powodał problemów na innym.

Korzystając z oficjalnej dokumentacji Linux kernel: https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt

(dodam, że było późno w nocy) zacząłem konfigurację. Sama w sobie jest prosta, wszystko poszło sprawnie i przystąpiłem do testowania:

root@nodeA # lxc-attach -n fh4
 root@fh4 # dd if=/dev/zero of=plik
 ^C421509+0 records in
 421509+0 records out
 215812608 bytes (216 MB) copied, 1.82788 s, 118 MB/s

root@fh4 # dd if=/dev/zero of=plik
 ^C452817+0 records in
 452817+0 records out
 231842304 bytes (232 MB) copied, 2.33912 s, 99.1 MB/s

root@fh4 #

No i nie działa. Stwierdziłem, że zawsze świeży umysł pomagał i poszedłem spać. Przez kolejne kilka dni w ramach wolnych chwil przeglądałem dokumentację, fora w poszukiwaniu rozwiązania.

Konfiguracja byla poprawna i teoretycznie powinno działać. Zmęczenie z tamtego okresu dało za wygraną.

Jakiś czas później wróciłem do tematu i zorientowałem się, że testowałem z cachem. Otworzyłem piwo i przystąpiłem do kolejnych testów, będąc pewien, że mini projekt mogę ustawić na DONE:

root@fh5 # dd if=/dev/zero of=plik oflag=direct
 ^C15467+0 records in
 15467+0 records out
 7919104 bytes (7.9 MB) copied, 1.37133 s, 5.8 MB/s

root@fh5 # dd if=/dev/zero of=plik oflag=direct
 ^C20370+0 records in
 20370+0 records out
 10429440 bytes (10 MB) copied, 2.15935 s, 4.8 MB/s

Nauczka na przyszłość:

  • być wypoczęty
  • dokładnie czytać dokumentację
  • myśleć