Często instalacja naszej aplikacji opartej na stabilnej wersji Debiana działa na maszynie wirtualnej - zazwyczaj w VMware ESXi. W ogólnym przypadku nie mamy wglądu ani wpływu na ich środowisko wirtualizacji i nie mamy dostępu np. Do klienta VMware vCenter lub równoważnego. Skupiam się tutaj na VMware, ponieważ jest to zdecydowanie najbardziej powszechne.
Chcielibyśmy:
- Powiadom administratora VMware klienta: Możesz uruchomić naszą aplikację np. W środowisku VMware ESX, o ile spełnia ona kryteria wydajności X, Y i Z.
- Być w stanie ustalić, czy kryteria X, Y i Z są faktycznie spełniane w sposób ciągły (np. Również teraz ), nawet w działającym systemie (nie możemy zatrzymać naszej aplikacji i uruchomić testów porównawczych, a początkowy test porównawczy nie wystarczy, ponieważ wydajność w środowiska wirtualne zmieniają się w czasie).
- Miej pewność, że jeśli spełnione zostaną kryteria X, Y i Z, będziemy mieli odpowiednie wirtualne zasoby sprzętowe, aby uruchomić naszą aplikację z zadowalającą wydajnością.
Co to są X, Y i Z?
Wielokrotnie widzieliśmy, że gdy występują problemy z wydajnością, problem nie dotyczy naszej aplikacji, ale środowiska wirtualizacji. Np. Inna maszyna wirtualna wykorzystuje mnóstwo procesora, pamięci lub sieci SAN, na której dyski są faktycznie przechowywane, jest intensywnie wykorzystywana przez coś innego niż nasza aplikacja. Obecnie nie możemy tego udowodnić ani obalić.
Teoretycznie może być również możliwe, że czasami nasza aplikacja jest powolna ... ;-)
W jaki sposób określa się główną przyczynę problemów z wydajnością: środowisko wirtualne lub nasza aplikacja?
Zazwyczaj występują 3 obszary problemów z wydajnością Procesor, pamięć i dyskowe operacje we / wy.
procesor
Na przykład VMware administrator może określić rezerwację i limit wyrażony w MHz, ale czy np. 512 MHz na jednym hoście ESX jest dokładnie taki sam jak 512 MHz na innym hoście ESX, być może w zupełnie innym klastrze ESX?
I jak mierzyć, czy rzeczywiście to otrzymujemy? Podczas gdy nasza aplikacja jest uruchomiona, być może możemy zauważyć, że mamy 212% wykorzystania procesora na 4 procesorach. Czy to dlatego, że nasza aplikacja robi dużo, czy dlatego, że inna maszyna wirtualna na tym samym hoście wykonuje zadanie intensywnie wykorzystujące procesor i zużywa cały procesor?
Pamięć (baloniarstwo?)
Jeśli poprosimy o np. 16 GB pamięci RAM, która jest często konfigurowana, ale z powodu balonowania , w rzeczywistości dostajemy tylko 4 GB i, co zaskakujące, nasza aplikacja działa słabo.
Można zapytać narzędzia VMware o bieżące balonowanie, ale okazało się, że często kłamie (lub jest co najmniej niedokładny). Widzieliśmy przykłady, w których system operacyjny uważa, że całkowita pamięć RAM wynosi 16 GB, suma pamięci rezydentnej (RSS) wszystkich procesów wynosi 4 GB pamięci RAM, ale dostępna jest tylko 2 GB pamięci RAM, nawet jeśli narzędzia VMware mówią nam, że balonowanie 0: - (
Również samo dodanie RSS razem nie jest prawidłowe, ponieważ można łatwo udostępnić pamięć RAM, np. Pamięć kopiowania przy zapisie, więc 512 MB + 512 MB niekoniecznie oznacza 1 GB, ale może oznaczać coś mniej. Dlatego nie można po prostu odjąć RSS od wszystkich procesów, aby uzyskać pomiar ilości wolnej pamięci RAM, a tym samym niezawodnie wykryć balonowanie. Można wykryć niektóre przypadki balonowania, ale istnieją inne przypadki, w których balonowanie jest skuteczne, ale nie jest wykrywalne tą metodą.
Dysk I / O
Wydaje mi się, że moglibyśmy wykresować w czasie liczbę odczytów i zapisów na dysku, liczbę odczytanych i zapisanych bajtów oraz% oczekiwania we / wy. Ale czy to da nam dokładny obraz dysku I / O? Wyobrażam sobie, że jeśli górnik Bitcoin działa na innej maszynie wirtualnej używającej całego procesora, nasz% oczekiwania na We / Wy wzrośnie, nawet jeśli bazowa SAN daje dokładnie taką samą wydajność, po prostu dlatego, że zasoby naszego procesora spadną, a zatem IO czeka ( który jest mierzony w% ) idzie w górę.
Podsumowując, w jakim języku możemy opisać np. Administratorowi VMware, jakiej wydajności potrzebujemy w przenośny i mierzalny sposób?
"It runs fine with x, y, and z"
nie jest wystarczająco precyzyjne. Musisz być w stanie dokładnie powiedzieć swoim klientom, czego wymaga Twoja aplikacja. Jeśli dadzą ci te zasoby, a aplikacja działa słabo, to pytanie nie jest "What do we need from a resource perspective?"
, ale"Why is it performing poorly even though the proper resources have been allocated?"