Прочитав (очень быстро )исходный код , я бы сказал, что старая запись удалена:
if (t->entries >= ip_list_tot) {
e = list_entry(t->lru_list.next, struct recent_entry, lru_list);
recent_entry_remove(t, e);
}
Чтобы увеличить это значение, вы можете установить параметр при загрузке модуля вручную:
~$ sudo modinfo -p xt_recent
ip_list_tot:number of IPs to remember per list (uint)
ip_list_hash_size:size of hash table used to look up IPs (uint)
ip_list_perms:permissions on /proc/net/xt_recent/* files (uint)
ip_list_uid:default owner of /proc/net/xt_recent/* files (uint)
ip_list_gid:default owning group of /proc/net/xt_recent/* files (uint)
ip_pkt_list_tot:number of packets per IP address to remember (max. 255) (uint)
~$ sudo modprobe xt_recent ip_list_tot=10000
~$ sudo cat /sys/module/xt_recent/parameters/ip_list_tot
10000
Перед выгрузкой/загрузкой убедитесь, что модуль не используется. (отключите брандмауэр или, по крайней мере, правила, использующие recent
соответствие ).
Чтобы сделать этот параметр постоянным, вы можете поместить файл в /etc/modprobe.d/xt _недавний со следующим содержимым:
options xt_recent ip_list_tot=10000
(Обратите внимание, что этот метод может не работать и может быть адаптирован в зависимости от вашего дистрибутива ).
Трудно сказать, какие проблемы с производительностью могут возникнуть при последовательном увеличении значения этого параметра. Это зависит от вашего оборудования, от других задач, запущенных в системе, и т. д.
Тем не менее, основываясь на чтении исходного кода и моем собственном опыте разработки, я бы сказал, что главное, чего вы можете бояться, — это введение задержки, если, например, в настоящее время тестируемый IP-адрес является последним в списке. или нет в списке (, что может часто встречаться):
static struct recent_table *recent_table_lookup(struct recent_net *recent_net,
const char *name)
{
struct recent_table *t;
list_for_each_entry(t, &recent_net->tables, list)
if (!strcmp(t->name, name))
return t;
return NULL;
}
Учитывая x
сложность list_for_each_entry() + strcmp
,дополнительная «стоимость» установки `ip _list _tot̀ на огромное значение — это время просмотра списка.
Окончательная сложность может варьироваться от 1 * x
до ip_list_tot * x
.
Тем не менее, я предполагаю, что связанный список в ядре хорошо реализован, производительность и скорость являются требованиями.
В заключение я бы посоветовал вам провести сравнительный анализ... если это возможно.
Из /dev/null
вы получаете только то, что системный вызов read()
успешно возвращается с нулевым прочитанным байтом. Это то же самое, что происходит при попытке read()
из (или после )конца файла, и из-за этого это называется «конец -из -файла».
Но есть и более странные случаи, например, терминал, который может возвращать нулевые байты при одном вызове (, если пользователь нажимает ^D
на пустой строке или после другого ^D
), но затем возвращает больше данных. при следующем прочтении. И сокеты дейтаграмм, которые могут поддерживать дейтаграммы с нулевым -байтом, и система будет возвращать нулевые байты для такой дейтаграммы, но все равно будет возвращать следующую дейтаграмму при следующем вызове. Также, конечно, вы можете read()
из файла в конце получить нулевые байты, но затем повторить вызов позже, и на этот раз вы обнаружите, что ожидаются дополнительные данные. (Вот что могла бы сделать реализация tail -f
.)
Вы не можете на самом деле "печатать EOF", так как нечего печатать. Это просто отсутствие данных.
Зная, что cat
выходит из EOF, вы, конечно, могли бы сделать что-то вроде
(cat /dev/null; echo EOF) | whatever...
печатать что-то после конца.Не то, чтобы это было очень полезно, ИМО.
См.: