IoT, budżetowe VPS i poprawna zmiana JAVA_OPTS w Thingsboard
Opublikowano:
Będzie to krótka opowieść o moich odkryciach w świecie IoT, napotkanych trudnościach i ich pokonywaniu.
Od kilku miesięcy pracuję nad urządzeniami z ESP32, które łączą się z falownikami solarnymi Deye za pośrednictwem protokołów RS485 i Modbus.
Odkrywanie sprzętu IoT i tworzenie fizycznych urządzeń, które pozwalają na zdalne sterowanie innymi urządzeniami, jest dla mnie bardzo ekscytujące.
Nauka protokołów, pułapek, okablowania i wszystkich tych zagadnień sprawia mi frajdę, zwłaszcza że pochodzę ze świata tworzenia stron internetowych.
Zaczynałem od zestawów rozwojowych ESP32, a obecnie korzystam z płytek Waveshare ESP32. Płytki Waveshare idealnie nadają się do komunikacji RS485/CAN – są małe, niedrogie i można je montować na szynach DIN.
Do sterowania płytkami wybrałem platformę Thingsboard – nie wiem, czy istnieją jakieś alternatywy, ale ta jest naprawdę dobra i bardzo rozbudowana.
Próbowałem uruchomić ją na najtańszym serwerze VPS, jaki udało mi się znaleźć.
Najpierw wypróbowałem Contabo – za około 5 EUR można tam dostać 4 vCPU, 8 GB pamięci RAM i 100 GB dysku SSD. Działało to dobrze, ale oprócz ThingsBoard hostowałem też inne serwisy i w końcu osiągnąłem limity procesora i pamięci RAM.
Następnie natrafiłem na „oferty specjalne” LuxVPS: 4 vCPU, 16 GB pamięci RAM i 100 GB dysku NVMe za 7 EUR. Korzystają ze starszych procesorów Intel Xeon, ale szczerze mówiąc, jak na budżetowy serwer VPS z taką ilością pamięci RAM, to świetna oferta, zwłaszcza w czasach niedoboru pamięci RAM spowodowanego rozwojem sztucznej inteligencji.
Kiedy zacząłem się na niego przenosić, od razu wiedziałem, że będzie o wiele lepszy niż Contabo. Przeniesienie plików z Contabo oraz szybkość działania serwera VPS były świetne.
Po migracji do LuxVPS zacząłem majstrować przy konfiguracji Dockera w Thingsboard i próbowałem przypisać więcej pamięci do JVM. AI i niektóre artykuły wskazały mi zmienną środowiskową JAVA_OPTS. Dodałem ją do pliku docker-compose.yml i zostawiłem ją tam na jakiś czas, aż zorientowałem się, że średnie obciążenie procesora wynosi około 50%. Wiedziałem, że coś jest nie tak. Doszedłem do wniosku, że problem dotyczy GC JVM, ponieważ obciążenie procesora skakało z ~20% do ~60% co kilka sekund. Próbowałem jeszcze bardziej dostosować JAVA_OPTS, ale nic nie pomogło. Nic nie poprawiało sytuacji.
Po jakimś czasie dostałem e-mail od LuxVPS z informacją, że ich oferty specjalne wkrótce się kończą i zdecydowałem się na przejście na VPS wyższej klasy. Wybrałem 6 procesorów wirtualnych, 26 GB RAM i 250 GB NVMe za 12 EUR. Pozwoli mi to na skalowanie, jeśli kiedykolwiek będę pracował z setkami urządzeń.
LuxVPS nie pomaga w migracji, więc musiałem przeprowadzić pełną migrację ponownie. Potem sprawdziłem skoki obciążenia procesora i nadal występowały.
W końcu znalazłem rozwiązanie, które było dostępne w dokumentacji Thingsboard: https://thingsboard.io/docs/installation/ubuntu/#step-5-optional-memory-configuration. Zamiast używać deklaracji zmiennej środowiskowej docker, musisz zmienić zmienną JAVA_OPTS w pliku /etc/thingsboard/conf/thingsboard.conf w następujący sposób:
export JAVA_OPTS="$JAVA_OPTS -Xms6G -Xmx6G -Xss512k -XX:+AlwaysPreTouch"
Zabawne, że AI i kilka innych artykułów w Internecie skierowało mnie na złą drogę, podczas gdy prawdziwa odpowiedź, jak zwykle, znajduje się w oficjalnej dokumentacji.