Mamy kilka systemów produkcyjnych, które zostały niedawno przekształcone w maszyny wirtualne. Istnieje nasza aplikacja, która często uzyskuje dostęp do bazy danych MySQL, i dla każdego zapytania tworzy połączenie, zapytania i rozłącza to połączenie.
To nie jest odpowiedni sposób na zapytanie (wiem), ale mamy ograniczenia, których nie możemy obejść. W każdym razie problem jest taki: gdy maszyna była hostem fizycznym, program działał dobrze. Po konwersji na maszynę wirtualną zauważyliśmy sporadyczne problemy z połączeniem z bazą danych. W pewnym momencie było ponad 24000 połączeń gniazd w TIME_WAIT (na hoście fizycznym najwięcej widziałem 17000 - nie jest dobrze, ale nie powoduje problemów).
Chciałbym, aby te połączenia były ponownie używane, abyśmy nie widzieli tego problemu z połączeniem, a więc:
Pytania:
Czy można ustawić wartość tcp_tw_reuse na 1? Jakie są oczywiste niebezpieczeństwa? Czy jest jakiś powód, dla którego nigdy nie powinienem tego robić?
Ponadto, czy jest jakiś inny sposób, aby uzyskać system (RHEL / CentOS), aby uniemożliwić tak wielu połączeniom przejście do TIME_WAIT lub sprawienie, aby były ponownie wykorzystywane?
Co wreszcie zrobi zmiana tcp_tw_recycle i czy to mi pomoże?
Z góry dzięki!
Odpowiedzi:
Możesz bezpiecznie skrócić czas przestoju, ale możesz napotkać problemy z nieprawidłowo zamkniętymi połączeniami w sieciach z utratą lub fluktuacją pakietów. Nie zaczynam strojenia od 1 sekundy, zaczynam od 15-30 i pracuję w dół.
Ponadto naprawdę musisz naprawić swoją aplikację.
RFC 1185 ma dobre wyjaśnienie w sekcji 3.2:
źródło
To nie odpowiada na twoje pytanie (i jest 18 miesięcy spóźnienia), ale sugeruje inny sposób na ponowne wykorzystanie portów przez starszą aplikację:
Przydatną alternatywą dla ustawienia
tcp_tw_reuse
(lubtcp_tw_recycle
) w systemie jest wstawienie biblioteki współdzielonej (przy użyciuLD_PRELOAD
) do aplikacji; ta biblioteka może następnie pozwolić na ponowne użycie portu. To sprawia, że starsza aplikacja pozwala na ponowne użycie portu bez wymuszania tego we wszystkich aplikacjach w systemie (nie jest wymagana modyfikacja aplikacji), co ogranicza wpływ poprawek. Na przykład,Ta współużytkowana biblioteka powinna przechwytywać
socket()
wywołanie, wywoływać prawdziwe gniazdo () i ustawiać SO_REUSEADDR i / lub SO_REUSEPORT na zwróconym gnieździe. Spójrz na http://libkeepalive.sourceforge.net, aby zobaczyć przykład, jak to zrobić (to włącza Keepalives, ale włączanie SO_REUSEPORT jest bardzo podobne). Jeśli Twoja źle zachowana starsza aplikacja korzysta z protokołu IPv6, pamiętaj o zmianie wiersza 55libkeepalive.c
zdo
Jeśli utkniesz, wyślij mi e-mail, a ja napiszę kod i wyślę go do Ciebie.
źródło
Myślę, że dobrze jest zmienić tę wartość na 1. Bardziej odpowiednim sposobem może być użycie polecenia:
Nie mam żadnych oczywistych zagrożeń, o których wiem, ale szybkie wyszukiwanie w Google daje ten link, który potwierdza, że
tcp_tw_reuse
jest to lepsza alternatywa niżtcp_tw_recycle
, ale niezależnie od tego należy z niej korzystać ostrożnie.źródło
Połączenie nie może być ponownie użyte, jeśli są w CZASIE OCZEKIWANIA. Jeśli nie masz utraty pakietów w sieci między aplikacją a MySQL, możesz skrócić czas oczekiwania.
Jednak najlepszym rozwiązaniem jest użycie trwałych połączeń z bazą danych i pulą połączeń.
źródło