... Myślę, że w momencie, gdy staje się to prawdziwym zmartwieniem, a nie akademicką ciekawostką, znacznie przekroczyłeś punkt, w którym rozsądniej byłoby założyć prywatny serwer DNS pod względem wydajności i łatwości konserwacji.
Shadur
5
Jestem zaskoczony, że pytasz. Dlaczego oczekujesz precyzyjnego i twardego ograniczenia rozmiaru plików konfiguracyjnych?
Basile Starynkevitch
3
@BasileStarynkevitch Zapytałem, ponieważ plik hostów o wielkości ~ 2 MB nie działał na moim routerze, ale problem polegał na tym, że nie od razu dnsmasq przestałem czytać plik hosts.
Geremia
2
@Geremia mój plik hosts to 500M, ponad 15 000 wpisów, żadnych problemów. Zawsze najlepiej jest określić pierwotną przyczynę problemu i rozwiązać go najpierw
bsd
3
Czy używasz pliku hosta do blokowania adresów IP? Jeśli tak, powinieneś używać iptables z ipset. Używanie samego iptables spowoduje znaczny spadek wydajności, jednak w przypadku ipset lista prawie 500 000 ips ma znikomy wpływ.
cybernard
Odpowiedzi:
57
Problematyczne skutki obejmują powolne rozpoznawanie nazwy hosta (chyba że system operacyjny w jakiś sposób przekształci listę liniową w strukturę szybszego wyszukiwania?) tabOraz możliwość zaskakującej interakcji z uzupełnianiem powłoki na długo przed osiągnięciem jakiegokolwiek znaczącego rozmiaru pliku.
Na przykład! Jeśli umieścisz 500 000 wpisów hosta w/etc/hosts
dla nauki, domyślne tabuzupełnienie nazwy hosta w ZSH zajmuje około ~ 25 sekund w moim systemie, aby zwrócić monit o zakończenie (oczywiście, jest to na laptopie z 2008 roku z dyskiem 5400 RPM, ale nadal).
Nie sądzę, że ma limit rozmiaru pod względem liczby linii.
Przed DNS (który został wprowadzony do użytku w 1985 r.) Był to jedyny sposób wykonywania wyszukiwania nazw hostów, więc zakładam, że oznacza to, że plik powinien mieć tysiące lub co najmniej setki wpisów do być w stanie obsługiwać najlepiej połączone węzły internetowe sprzed 1985 roku.
Oto przykład z 1985 roku (format nieco się zmienił): http://jim.rees.org/apollo-archive/hosts.txt Ten plik ma 1680 linii, z czego 1325 to linie hosta. Pozostałe 355 wierszy jest puste, komentarze, sieci lub bramy 1 .
Jedynym prawdziwym ograniczeniem, jakie mogłem znaleźć, było to, że w niektórych systemach poszczególne wiersze są ograniczone do mniej niż BUFSIZznaków (1024 na moim komputerze OpenBSD).
Jeśli masz więcej niż kilka wpisów /etc/hosts, powinieneś rozważyć utworzenie lokalnego serwera nazw, ale takie jest moje osobiste zdanie.
1 Podziękowania dla Jeffa Schallera za wykopanie tego.
Przed DNS nie sądzę, że konwersja pełnej tabeli hostów internetowych do /etc/hostsformatu była powszechna . Większość systemów uniksowych nie była nawet w Internecie, a nawet jeśli była to maszyna, nie potrzebowała kompletnej tabeli hostów, tylko garść maszyn, z którymi musiała rozmawiać. Byłbym zaskoczony, gdyby było wiele maszyn z ponad 100 wpisami.
Barmar
13
Jak mogę określić limit rozmiaru / etc / hosts?
Jest to zwykły plik, więc limit odpowiadałby limitom bazowego systemu plików (który sam byłby ograniczony przez liczbę dysków za nim), pomniejszone o miejsce zajmowane przez inne pliki w tym samym (prawdopodobnie root ( /)) systemie plików:
To prawda, ale ograniczenia systemu plików (np. Terabajty) są praktycznie w dużej mierze nieistotne.
Basile Starynkevitch
11
Limity rozmiaru obowiązują tylko przy przydzielaniu buforów statycznych. gethostbyname(3), który analizuje wpisy /etc/hosts, nie przydziela buforów statycznych - i nigdy tego nie miał. Oryginalna wersja algorytmu BSD 4.3 z 1983 r. Pokazuje wzór otwartego pliku, podczas analizowania wiersza, zamknięty plik:
sethostent(0);
while (p = gethostent()) {
if (strcmp(p->h_name, name) == 0)
break;
for (cp = p->h_aliases; *cp != 0; cp++)
if (strcmp(*cp, name) == 0)
goto found;
}
found:
endhostent();
Nowoczesne wdrożenia zachowują to dziedzictwo we wszystkich istotnych aspektach.
W każdym razie wewnętrznie *hostentrodzina funkcji przechowuje wskaźnik pliku do bieżącej linii w pliku. sethostentotwiera plik i ustawia pozycję wskaźnika pliku. gethostentpobiera dane i przesuwa wskaźnik. endhostentzamyka wskaźnik pliku. Biblioteka GNU C oferuje dokładne omówienie tych funkcji.
Jak można się domyślić na podstawie implementacji, wpisy występujące wcześniej w pliku są rozpoznawane szybciej. Jeśli plik hostów jest ogromny, wchodzi w grę.
Niezależnie od tego, jak duży jest ten plik, system operacyjny go wykorzysta. W końcu jednak osiągniesz limity systemu plików (zgodnie z odpowiedzią Jeffa Schallera ). Masz również limity maksymalnego rozmiaru linii (na odpowiedź Kusalanandy ). Ale ostatecznie możesz zrobić tak duże, jak chcesz. Ale proszę nie.
Korzystanie z glibc i linux niestety nie jest takie proste. Jeśli wywołasz gethostbyname i system zostanie odpowiednio skonfigurowany (domyślnie w wielu systemach), wówczas zamiast czytać / etc / host wywoła nscd. Nie mam pojęcia, czy nscd buforuje tylko trafienia w pliku, czy próbuje buforować jako całość. W późniejszym przypadku miałbyś ograniczenie
pamięci
1
Wersja 4.3BSD jest tutaj . Obsługiwano zaszyfrowaną dbm wersję / etc / hosts. IIRC, dbm narzuciło pewne limity wielkości, które mogą spowodować, że próby utworzenia skasowanej bazy danych zakończą się niepowodzeniem.
Mark Plotnick
2
... Zmiażdżyłem swój mózg i przez całe życie nie mogę wymyślić ani jednej sytuacji ani okoliczności, w których można by podejść do jakiegokolwiek problemu z ograniczeniem wielkości /etc/hosts- wpadłbyś na problemy praktyczne, takie jak poważne wydajność uderzyła w getaddrinfo()rodzinę wywołań systemowych, które muszą zapoznać się z plikiem przed podjęciem decyzji o wysłaniu zapytania DNS, nie mówiąc już o problemach z utrzymaniem płaskiego pliku tekstowego o takim rozmiarze.
Podejrzewam, że mamy tu do czynienia z brakiem komunikacji na wyższym poziomie. Jaki problem próbujesz rozwiązać za pomocą gigantycznego /etc/hostspliku? Jestem prawie pewien, że istnieje lepsze rozwiązanie niż to.
Niektóre osoby używają hostspliku do umieszczania na czarnej liście reklam / złośliwego oprogramowania / śledzenia / itp. W Internecie są wyselekcjonowane listy, z których korzystam to 41 tys. Linii i rozmiar 1,1 MB.
Bert
Prawdopodobnie lepiej byłoby użyć dnsmasqdo tego wydajności - patrz np. Dnsgate (którego nie próbowałem).
reinierpost
Mój ma 1,7 MB z 57 tys. Linii. Możesz pobrać swój ogromny /etc/hostsplik z hostsfile.org
Odpowiedzi:
Problematyczne skutki obejmują powolne rozpoznawanie nazwy hosta (chyba że system operacyjny w jakiś sposób przekształci listę liniową w strukturę szybszego wyszukiwania?) tabOraz możliwość zaskakującej interakcji z uzupełnianiem powłoki na długo przed osiągnięciem jakiegokolwiek znaczącego rozmiaru pliku.
Na przykład! Jeśli umieścisz 500 000 wpisów hosta w
/etc/hosts
dla nauki, domyślne tabuzupełnienie nazwy hosta w ZSH zajmuje około ~ 25 sekund w moim systemie, aby zwrócić monit o zakończenie (oczywiście, jest to na laptopie z 2008 roku z dyskiem 5400 RPM, ale nadal).
źródło
Nie sądzę, że ma limit rozmiaru pod względem liczby linii.
Przed DNS (który został wprowadzony do użytku w 1985 r.) Był to jedyny sposób wykonywania wyszukiwania nazw hostów, więc zakładam, że oznacza to, że plik powinien mieć tysiące lub co najmniej setki wpisów do być w stanie obsługiwać najlepiej połączone węzły internetowe sprzed 1985 roku.
Oto przykład z 1985 roku (format nieco się zmienił): http://jim.rees.org/apollo-archive/hosts.txt Ten plik ma 1680 linii, z czego 1325 to linie hosta. Pozostałe 355 wierszy jest puste, komentarze, sieci lub bramy 1 .
Jedynym prawdziwym ograniczeniem, jakie mogłem znaleźć, było to, że w niektórych systemach poszczególne wiersze są ograniczone do mniej niż
BUFSIZ
znaków (1024 na moim komputerze OpenBSD).Jeśli masz więcej niż kilka wpisów
/etc/hosts
, powinieneś rozważyć utworzenie lokalnego serwera nazw, ale takie jest moje osobiste zdanie.1 Podziękowania dla Jeffa Schallera za wykopanie tego.
źródło
/etc/hosts
formatu była powszechna . Większość systemów uniksowych nie była nawet w Internecie, a nawet jeśli była to maszyna, nie potrzebowała kompletnej tabeli hostów, tylko garść maszyn, z którymi musiała rozmawiać. Byłbym zaskoczony, gdyby było wiele maszyn z ponad 100 wpisami.Jest to zwykły plik, więc limit odpowiadałby limitom bazowego systemu plików (który sam byłby ograniczony przez liczbę dysków za nim), pomniejszone o miejsce zajmowane przez inne pliki w tym samym (prawdopodobnie root (
/
)) systemie plików:Ponieważ jest to plik edytowany ręcznie, tylko ręcznie:
(aby usunąć linie 100 i dalsze).
źródło
Limity rozmiaru obowiązują tylko przy przydzielaniu buforów statycznych.
gethostbyname(3)
, który analizuje wpisy/etc/hosts
, nie przydziela buforów statycznych - i nigdy tego nie miał. Oryginalna wersja algorytmu BSD 4.3 z 1983 r. Pokazuje wzór otwartego pliku, podczas analizowania wiersza, zamknięty plik:Nowoczesne wdrożenia zachowują to dziedzictwo we wszystkich istotnych aspektach.
W każdym razie wewnętrznie
*hostent
rodzina funkcji przechowuje wskaźnik pliku do bieżącej linii w pliku.sethostent
otwiera plik i ustawia pozycję wskaźnika pliku.gethostent
pobiera dane i przesuwa wskaźnik.endhostent
zamyka wskaźnik pliku. Biblioteka GNU C oferuje dokładne omówienie tych funkcji.Jak można się domyślić na podstawie implementacji, wpisy występujące wcześniej w pliku są rozpoznawane szybciej. Jeśli plik hostów jest ogromny, wchodzi w grę.
Niezależnie od tego, jak duży jest ten plik, system operacyjny go wykorzysta. W końcu jednak osiągniesz limity systemu plików (zgodnie z odpowiedzią Jeffa Schallera ). Masz również limity maksymalnego rozmiaru linii (na odpowiedź Kusalanandy ). Ale ostatecznie możesz zrobić tak duże, jak chcesz. Ale proszę nie.
źródło
... Zmiażdżyłem swój mózg i przez całe życie nie mogę wymyślić ani jednej sytuacji ani okoliczności, w których można by podejść do jakiegokolwiek problemu z ograniczeniem wielkości
/etc/hosts
- wpadłbyś na problemy praktyczne, takie jak poważne wydajność uderzyła wgetaddrinfo()
rodzinę wywołań systemowych, które muszą zapoznać się z plikiem przed podjęciem decyzji o wysłaniu zapytania DNS, nie mówiąc już o problemach z utrzymaniem płaskiego pliku tekstowego o takim rozmiarze.Podejrzewam, że mamy tu do czynienia z brakiem komunikacji na wyższym poziomie. Jaki problem próbujesz rozwiązać za pomocą gigantycznego
/etc/hosts
pliku? Jestem prawie pewien, że istnieje lepsze rozwiązanie niż to.źródło
hosts
pliku do umieszczania na czarnej liście reklam / złośliwego oprogramowania / śledzenia / itp. W Internecie są wyselekcjonowane listy, z których korzystam to 41 tys. Linii i rozmiar 1,1 MB.dnsmasq
do tego wydajności - patrz np. Dnsgate (którego nie próbowałem)./etc/hosts
plik z hostsfile.org