Do czego służy polecenie synchronizacji?

15

Wiem, co robi ... Chyba jestem ciekawy, dlaczego rozwiązuje problem w odziedziczonej przeze mnie aplikacji. Przejęłam dość dużą aplikację tomcat, która działa jako serwer Red5 dla wielu klientów Flex i obsługuje wiele danych interakcji w czasie rzeczywistym, które ostatecznie są wyrzucane do interfejsu Railsowego. Problem z czasem był obciążony, a reakcje na tych klientów rosły do ​​3-400 ms, gdzie zwykle <100 ms. Klient podejrzewał, że to problem z pamięcią, którego tak naprawdę nigdy nie byliśmy w stanie potwierdzić. Pewnego dnia serwer pomostowy, na którym przeprowadzałem test obciążenia, zasadniczo przestał przyjmować żądania lub działał bardzo wolno. Na kaprys wysłałem

sync && echo 3 > /proc/sys/vm/drop_caches

i magicznie serwer wrócił do życia i zaczął działać na pełnych obrotach, obsługując te połączenia. Czy to był przypadek, czy to zachowanie ma sens i dlaczego?

j_mcnally
źródło
4
To są dwa polecenia. Który miał efekt, który zauważyłeś?
Michael Hampton
linuxtidbits.wordpress.com/2008/02/20/purge-memory zasugerował, aby uruchomić je razem, więc nie wiem.
j_mcnally
Zostało
4
Trudno powiedzieć. Nie spodziewałbyś się, że te polecenia zrobią na serwerze coś korzystnego, chyba że zostanie to okropnie błędne. Ale z pewnością nie można wykluczyć bez dokładniejszych badań. Jeśli to się powtórzy, spróbuj po prostu synclub echo. Następnie spróbuj dowiedzieć się, dlaczego serwer działa wolno w przypadkach, które to rozwiązuje (czy procesor jest maksymalny? Czy IO jest maksymalny? Czy system stronicuje?)
David Schwartz

Odpowiedzi:

20

Każdy dysk twardy jest o rząd wielkości wolniejszy niż pamięć RAM, więc Linux używa dowolnej wolnej pamięci RAM, którą możesz swobodnie przemieszczać, aby buforować dane systemu plików. Jednak tak naprawdę nigdy nie powinno to powodować problemów z wydajnością, chyba że coś jest nie tak z twoim dyskiem twardym lub usługi na twoim serwerze próbują zapisywać dane z tak dużą szybkością tak długo, aż serwer nie będzie w stanie buforować lub odzyskać danych. Może to również oznaczać, że Twój dysk twardy zbliża się do końca swojej żywotności.

W każdym razie:

  • uruchomione man syncpowie ci, co robi synchronizacja [opróżnia bufory FS]
  • przeglądanie „linux drop_caches” powie ci, że echo liczby 3 zwalnia wszystkie niepotrzebne strony pamięci z pamięci podręcznej [nie powinno to być konieczne w zdrowym systemie]
  • command1 && command2 dzieli się na „jeśli polecenie 1 zakończy się pomyślnie, a następnie uruchom polecenie 2”
    • partnerem tego jest command1 || command2aka „jeśli polecenie 1 nie powiedzie się, uruchom polecenie 2”

Polecenie, które otrzymałeś, jest co najwyżej tymczasową poprawką i jest objawem czegoś innego, co jest nie tak z twoim systemem. Albo twoje dyski są u kresu żywotności, albo twój system jest zbyt słabo przygotowany do tego, co z nim robisz, albo jedno i drugie .

Sammitch
źródło
dzięki, nie jestem pewien, pomyślałem, że to bardzo krótkoterminowe rozwiązanie. Chyba chciałem dowiedzieć się, dlaczego to może działać. Serwer działa na EC2, więc nie jestem pewien co do pomysłu na HD EOL.
j_mcnally
@j_mcnally EC2? Cóż, mogę tylko zgadywać, jak wygląda Twoja konkretna instancja, ale prawdopodobnie jest to kombinacja takich czynników, jak EBS przez cały czas bardzo niestabilny, niewielkie przydziały pamięci RAM i brak partycji wymiany.
Sammitch,
Więc mówisz, że rozwiązanie może być rzeczywiście ważne LOL?
j_mcnally
@ j_mcnally niestety, jeśli nie korzystasz z jednego z zoptymalizowanych IO w dolarach miesięcznie, potencjalnie tak.
Sammitch,
5

AWS nie jest dla osób o słabych nerwach i właśnie spotkałeś jeden z powodów, dla których to zrobiłeś. Słaba sytuacja wejścia / wyjścia dysku w AWS jest dobrze znana i jest jednym z głównych czynników, które należy wziąć pod uwagę dla każdego, kto tworzy aplikację na nim. Istnieją zoptymalizowane dyski wystąpienia i kilka innych sztuczek (takich jak budowanie RAID 0 z woluminów EBS), które możesz spróbować poprawić. Upewnij się, że używasz większych instancji (co najmniej m1.large), aby jądro mogło buforować dyskowe operacje we / wy.

Joel E. Salas
źródło
tak, używając m1.large. Serwery te są rozpakowywane pod kątem aplikacji, a następnie zrywane kilka godzin później ... więc nie jestem pewien, czy zainwestujesz czas itp. Na dysku io. Doceniam wkład każdego i sugestie wyglądają na to, że poprawka może być ważna, nawet jeśli nie jest to preferowane. dzięki jeszcze raz.
j_mcnally