... Я думаю , что в момент , когда это становится фактическое беспокойство , а не академическое любопытство вы далеко прошли точку , где было бы разумнее создать частный сервер DNS с точки зрения производительности и ремонтопригодности.
Шадур
5
Я удивлен, что вы спрашиваете. Почему вы ожидаете какого-то точного и жесткого значимого ограничения на размер файлов конфигурации?
Старынкевич,
3
@BasileStarynkevitch Я спросил, потому что файл хоста ~ 2 МБ не работал на моем маршрутизаторе, но проблема заключалась в том, что я не вздохнул dnsmasq, чтобы перечитать файл хостов.
Джеремия
2
@Geremia мой хост-файл 500M, более 15 000 записей, никаких проблем. Всегда лучше определить первопричину вашей проблемы и решить ее в первую очередь
bsd
3
Вы используете свой хост-файл для блокировки IP-адресов? Если это так, вы должны использовать iptables с ipset. Использование только iptables приведет к значительному снижению производительности, однако при использовании ipset список из почти 500 000 ips оказывает незначительное влияние.
кибернард
Ответы:
57
Проблемные эффекты включают медленное разрешение имени хоста (разве ОС каким-то образом преобразует линейный список в более быструю структуру поиска?) И возможность неожиданного взаимодействия с tabзавершением оболочки задолго до того, как будет достигнут какой-либо значимый размер файла.
Например! Если разместить 500 000 записей хоста в/etc/hosts
для науки, tabзавершение имени хоста по умолчанию в ZSH занимает около 25 секунд в моей системе, чтобы вернуть подсказку о завершении (да, это на ноутбуке 2008 года с диском 5400 об / мин, но все же).
Я не думаю, что он имеет ограничение по размеру с точки зрения количества строк.
До DNS (который был введен в эксплуатацию в 1985 году) именно этот файл служил единственным средством для поиска имен хостов, поэтому я предполагаю, что это означает, что файл должен иметь тысячи или, по крайней мере, сотни записей для быть в состоянии поддерживать большинство интернет-узлов до 1985 года.
Вот пример 1985 года (формат несколько изменился): http://jim.rees.org/apollo-archive/hosts.txt Этот файл содержит 1680 строк, из которых 1325 - строки хоста. Оставшиеся 355 строк являются пустыми, комментарии, сети или шлюзы 1 .
Единственным реальным ограничением, которое я смог найти, было то, что в некоторых системах отдельные строки были ограничены менее чем BUFSIZсимволами (1024 на моей машине OpenBSD).
Если у вас более нескольких записей /etc/hosts, вам следует рассмотреть возможность настройки локального сервера имен, но это мое личное мнение.
До DNS я не думаю, что было принято преобразовывать полную таблицу хостов Интернета в /etc/hostsформат. Большинство систем Unix даже не было в Интернете, и даже если бы машина была, ей не требовалась полная таблица хостов, а всего лишь несколько машин, с которыми ей нужно было общаться. Я был бы удивлен, если бы было много машин с более чем 100 записей.
Бармар
13
Как я могу определить ограничение размера / etc / hosts?
Это обычный файл, поэтому ограничение будет соответствовать ограничениям базовой файловой системы (которая сама будет ограничена количеством дисков за ней), за вычетом пространства, используемого любыми другими файлами в той же (вероятно, root ( /)) файловой системе:
ext2 / 3: 2 TiB
ext4: 16 TiB (с размером блока по умолчанию 4KiB)
xfs: 500 TiB
Как я могу установить ограничение размера / etc / hosts?
Поскольку это файл, отредактированный вручную, только вручную:
Верно в принципе, но ограничения файловой системы (например, терабайты) практически не имеют значения.
Старынкевич,
11
Ограничения размера применяются только при выделении статических буферов. gethostbyname(3), который анализирует записи в /etc/hosts, не выделяет статические буферы - и никогда не имеет. Исходная версия алгоритма BSD 4.3 1983 года показывает открытый файл, а строка анализа - шаблон закрытого файла:
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();
Современные реализации сохраняют это наследие во всех основах.
Во всяком случае, внутренне, *hostentсемейство функций хранит файловый указатель на текущую строку в файле. sethostentоткрывает файл и устанавливает позицию указателя файла. gethostentполучает данные и перемещает указатель endhostentзакрывает указатель файла. Библиотека GNU C предлагает подробное описание этих функций.
Как можно догадаться из реализации, записи, находящиеся ранее в файле, разрешаются быстрее. Если ваш файл hosts огромен, это вступает в игру.
Таким образом, независимо от размера файла, ОС будет его использовать. В конце концов, однако, вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера ). У вас также есть максимальные пределы размера линии (согласно ответу Кусалананды ). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но, пожалуйста, не надо.
Использование glibc и linux, к сожалению, не так просто. Если вы вызываете gethostbyname и система настроена соответствующим образом (по умолчанию на многих системах), то вместо чтения / etc / host вызовет nscd. Я понятия не имею, будет ли NSCD кэшировать только попадания в файл или попытаться кэшировать его целиком. В последнем случае у вас будет ограничение оперативной памяти для размера файла (при условии, что конфигурация nscd допускает столько записей)
PlasmaHH
1
Версия 4.3BSD находится здесь . Он поддерживал версию / etc / hosts с хэшем в dbm. IIRC, dbm наложил некоторые ограничения на размер, что может привести к неудаче при попытках создания хэшированной БД.
Марк Плотник
2
... Я ломал голову, и ради жизни я не могу вспомнить ни одной ситуации или обстоятельства, при которых вы бы подошли к какому-либо вопросу ограничения размера /etc/hosts- вы столкнулись бы с практическими проблемами, такими как серьезные снижение производительности getaddrinfo()семейства системных вызовов, которым все должны обратиться к файлу, прежде чем решить, следует ли отправлять DNS-запрос, не говоря уже о проблемах с сохранением плоского текстового файла такого размера.
Я подозреваю, что то, что мы имеем здесь, это неспособность общаться на более высоком уровне. Какую проблему вы пытаетесь решить с помощью гигантского /etc/hostsфайла? Я почти уверен, что есть лучшее решение, чем это.
Некоторые люди используют hostsфайл для черного списка рекламы / вредоносных программ / отслеживания / и т. Д. В интернете есть кураторские списки, я использую 41 тыс. Строк и 1,1 МБ.
Берт
Вероятно, было бы лучше использовать производительность dnsmasqдля этого - см., Например, dnsgate (который я не пробовал).
reinierpost
Мой имеет 1,7 МБ с 57k строк. Вы можете получить ваш огромный /etc/hostsфайл с hostsfile.org
Ответы:
Проблемные эффекты включают медленное разрешение имени хоста (разве ОС каким-то образом преобразует линейный список в более быструю структуру поиска?) И возможность неожиданного взаимодействия с tabзавершением оболочки задолго до того, как будет достигнут какой-либо значимый размер файла.
Например! Если разместить 500 000 записей хоста в
/etc/hosts
для науки, tabзавершение имени хоста по умолчанию в ZSH занимает около 25 секунд в моей системе, чтобы вернуть подсказку о завершении (да, это на ноутбуке 2008 года с диском 5400 об / мин, но все же).
источник
Я не думаю, что он имеет ограничение по размеру с точки зрения количества строк.
До DNS (который был введен в эксплуатацию в 1985 году) именно этот файл служил единственным средством для поиска имен хостов, поэтому я предполагаю, что это означает, что файл должен иметь тысячи или, по крайней мере, сотни записей для быть в состоянии поддерживать большинство интернет-узлов до 1985 года.
Вот пример 1985 года (формат несколько изменился): http://jim.rees.org/apollo-archive/hosts.txt Этот файл содержит 1680 строк, из которых 1325 - строки хоста. Оставшиеся 355 строк являются пустыми, комментарии, сети или шлюзы 1 .
Единственным реальным ограничением, которое я смог найти, было то, что в некоторых системах отдельные строки были ограничены менее чем
BUFSIZ
символами (1024 на моей машине OpenBSD).Если у вас более нескольких записей
/etc/hosts
, вам следует рассмотреть возможность настройки локального сервера имен, но это мое личное мнение.1 Спасибо Джеффу Шаллеру за то, что выкопали это.
источник
/etc/hosts
формат. Большинство систем Unix даже не было в Интернете, и даже если бы машина была, ей не требовалась полная таблица хостов, а всего лишь несколько машин, с которыми ей нужно было общаться. Я был бы удивлен, если бы было много машин с более чем 100 записей.Это обычный файл, поэтому ограничение будет соответствовать ограничениям базовой файловой системы (которая сама будет ограничена количеством дисков за ней), за вычетом пространства, используемого любыми другими файлами в той же (вероятно, root (
/
)) файловой системе:Поскольку это файл, отредактированный вручную, только вручную:
(удалить строки 100 и дальше).
источник
Ограничения размера применяются только при выделении статических буферов.
gethostbyname(3)
, который анализирует записи в/etc/hosts
, не выделяет статические буферы - и никогда не имеет. Исходная версия алгоритма BSD 4.3 1983 года показывает открытый файл, а строка анализа - шаблон закрытого файла:Современные реализации сохраняют это наследие во всех основах.
Во всяком случае, внутренне,
*hostent
семейство функций хранит файловый указатель на текущую строку в файле.sethostent
открывает файл и устанавливает позицию указателя файла.gethostent
получает данные и перемещает указательendhostent
закрывает указатель файла. Библиотека GNU C предлагает подробное описание этих функций.Как можно догадаться из реализации, записи, находящиеся ранее в файле, разрешаются быстрее. Если ваш файл hosts огромен, это вступает в игру.
Таким образом, независимо от размера файла, ОС будет его использовать. В конце концов, однако, вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера ). У вас также есть максимальные пределы размера линии (согласно ответу Кусалананды ). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но, пожалуйста, не надо.
источник
... Я ломал голову, и ради жизни я не могу вспомнить ни одной ситуации или обстоятельства, при которых вы бы подошли к какому-либо вопросу ограничения размера
/etc/hosts
- вы столкнулись бы с практическими проблемами, такими как серьезные снижение производительностиgetaddrinfo()
семейства системных вызовов, которым все должны обратиться к файлу, прежде чем решить, следует ли отправлять DNS-запрос, не говоря уже о проблемах с сохранением плоского текстового файла такого размера.Я подозреваю, что то, что мы имеем здесь, это неспособность общаться на более высоком уровне. Какую проблему вы пытаетесь решить с помощью гигантского
/etc/hosts
файла? Я почти уверен, что есть лучшее решение, чем это.источник
hosts
файл для черного списка рекламы / вредоносных программ / отслеживания / и т. Д. В интернете есть кураторские списки, я использую 41 тыс. Строк и 1,1 МБ.dnsmasq
для этого - см., Например, dnsgate (который я не пробовал)./etc/hosts
файл с hostsfile.org