Chromium/Chrome действительно не кэширует DNS-запросы дольше минуты.
Интересно, что из bugs-chromium — Issue 164026 — DNS TTL не учитывается с 21 апреля 2011 г.
Единственный кеш DNS в системе находится в Chrome, и он не учитывает ТТЛ. Нам нужно либо исправить хром и/или добавить промежуточный кеш который правильно обрабатывает TTL.
Ответ в заявке от 4 декабря 2012 г.:
HostCache в настоящее время предполагает TTL=60 с для всех положительных результатов. С участием асинхронный преобразователь DNS, мы планируем использовать TTL=max(60s, server_reported_ttl), то есть не менее 60 с. Смысл в том, чтобы улучшить производительность кэша. (Когда CDN NS обеспечивает TTL=10-20 с, и это получение всех подресурсов занимает более 30 секунд, нам часто приходится повторно запрашивать одно и то же имя хоста во время загрузки одной страницы.)
Заявка закрыта 10 октября 2013 г. по следующим причинам:
Chrome на CrOS использует асинхронный преобразователь DNS, который учитывает TTL = max (60s, > server_reported_ttl)
Я закрываю это как WontFix (устарело/работает по назначению).
Это известная проблема уже много лет; их внутренний преобразователь DNS игнорирует TTL записей DNS и кэширует DNS-запросы только на 1 минуту.
В течение многих лет пользователи запрашивали функцию, позволяющую изменить это поведение по умолчанию, но Google так и не создал ее.
В прошлом вы могли отключить внутренний преобразователь DNS в chrome://flags
, в настоящее время он функционально больше не доступен.
Подводя итог, можно сказать, что это функция, т.е. он делает это по дизайну.
(Я изначально написал, что это никогда не может быть изменено, что, очевидно, не соответствует действительности.Решительный человек может либо перекомпилировать Chromium, либо взломать бинарники Chrome. ).
Итак, в качестве дополнения: существует множество задокументированных свидетельств того, что инженеры Google не намерены соблюдать значение TTL по умолчанию в полученных ответах DNS в Chrome/ium.
Из Отрицательное кэширование DNS-запросов (DNS NCACHE)
Как и в случае с кэшированием положительных ответов, распознаватель имеет смысл ограничение на то, как долго он будет кэшировать отрицательный ответ...
Хотя подразумевается, что преобразователь может/должен наложить максимальный лимит на кеширование ответа DNS, ограничение в 1 минуту в Google Chrome может быть слишком низким.
П.С. На самом деле я нашел ответ на то, что беспокоило меня в течение многих лет, когда я искал статистику Chrome, чтобы ответить на этот вопрос: Chrome: DNS-запросы со случайными DNS-именами: вредоносное ПО?
PPS Из приведенного ниже кода видно, что отрицательные ответы не кэшируются (TTL=0).
Из https://chromium.googlesource.com/chromium/src/net/dns/host_resolver_impl.cc
99 // Default TTL for successful resolutions with ProcTask.
100 const unsigned kCacheEntryTTLSeconds = 60;
101
102 // Default TTL for unsuccessful resolutions with ProcTask.
103 const unsigned kNegativeCacheEntryTTLSeconds = 0;
104
105 // Minimum TTL for successful resolutions with DnsTask.
106 const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;
1518 // Called by ProcTask when it completes.
1519 void OnProcTaskComplete(base::TimeTicks start_time,
1520 int net_error,
1521 const AddressList& addr_list) {
1522 DCHECK(is_proc_running());
1523
1524 if (dns_task_error_ != OK) {
1525 base::TimeDelta duration = base::TimeTicks::Now() - start_time;
1526 if (net_error == OK) {
1527 UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackSuccess", duration);
1528 if ((dns_task_error_ == ERR_NAME_NOT_RESOLVED) &&
1529 ResemblesNetBIOSName(key_.hostname)) {
1530 UmaAsyncDnsResolveStatus(RESOLVE_STATUS_SUSPECT_NETBIOS);
1531 } else {
1532 UmaAsyncDnsResolveStatus(RESOLVE_STATUS_PROC_SUCCESS);
1533 }
1534 base::UmaHistogramSparse("Net.DNS.DnsTask.Errors",
1535 std::abs(dns_task_error_));
1536 resolver_->OnDnsTaskResolve(dns_task_error_);
1537 } else {
1538 UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackFail", duration);
1539 UmaAsyncDnsResolveStatus(RESOLVE_STATUS_FAIL);
1540 }
1541 }
1542
1543 if (ContainsIcannNameCollisionIp(addr_list))
1544 net_error = ERR_ICANN_NAME_COLLISION;
1545
1546 base::TimeDelta ttl =
# always 0 seconds
1547 base::TimeDelta::FromSeconds(kNegativeCacheEntryTTLSeconds);
1548 if (net_error == OK)
# always 60 seconds
1549 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds);
1550
1551 // Source unknown because the system resolver could have gotten it from a
1552 // hosts file, its own cache, a DNS lookup or somewhere else.
1553 // Don't store the |ttl| in cache since it's not obtained from the server.
1554 CompleteRequests(
1555 MakeCacheEntry(net_error, addr_list, HostCache::Entry::SOURCE_UNKNOWN),
1556 ttl);
1557 }
Плагины синтаксиса и типов файлов могут заменять ваши настройки по умолчанию. Причина в том, что они применяются позже, когда файл открывается, а не при запуске vim.
Чтобы обойти это, вы можете сделать что-то вроде:
autocmd FileType * set nocindent
Обычно это приводит к вызову set nocindent
каждый раз при открытии файла.
Измените *
на c
, если вы хотите, чтобы это применялось только к файлам c
.
@Michas: Насколько я знаю, мы можем переопределить среду нашего Vim, используя параметр "-u", встроенный в команду vim. Например:
1) Создание файла, скажем, ~ / .yourvim, со следующими материалами:
set nocindent
set noautoindent
2) Затем добавьте в свой файл ~ / .bashrc эту строку
alias vim="vim -u ~/.yourvim"
3) Выйдите из текущего терминала, откройте новый, и вы можете попробовать с новой средой vim.
Я использую этот трюк, чтобы определить свой собственный vim. Конечно, мы можем предоставить больше параметров в файлах "~ / .yourvim", а также в команде "alias". Пока что он работает на моем Debian 8 с vim версии 7.4.
Есть другой способ: изменить или создать (если он не существует)
~/.vimrc
поместить следующие строки в последний файл
set nocindent
set noautoindent
Выйти из текущего терминала, открыть новый и попробовать. Удачи!