Перейти к содержимому
Калькуляторы

Можеть кто-то скажет как сделать быстрее в линукс

time ip route show  proto boot | awk '{print $1,$2,$3,$5}'

у меня:  

real    0m0.741s
user    0m0.026s
sys     0m0.712s

 

Quote

time ip r |wc  

780643 7025778 54490718

 

real    0m7.476s
user    0m3.821s
sys     0m8.112s

 

Идея - поиск статических маршрутов в RT.

Изменено пользователем h3ll1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

netstat -rn скорее всего у ip route есть аналогичная опция: не ресолвить адреса.

 

хотя там какое-то адское число записей, тогда скорее всего не поможет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ip r ничего не резолвит. Основное время сжирает цикл вывода информации о сотен тысяч маршрутов в текстовом виде. Как выше правильно сказали, писать самодельную приблуду, которая будет получать маршруты из libnetlink и без перевода в текст отфильтровывать что нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

lib/rt netlink будет чуток быстрее, /proc/net/route  - заметно проще для не очень опытных программеров. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Совсем не чуток. При обработке такого большого количества маршрутов текстовая форма представления совершенно лишняя. И при чтении /proc/net/route можно выхватить неопределенное состояние, когда во время считывания маршруты поменялись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 hours ago, taf_321 said:

Совсем не чуток. При обработке такого большого количества маршрутов текстовая форма представления совершенно лишняя.

Ну да, я как бы об этом и намекал.

 

3 hours ago, taf_321 said:

И при чтении /proc/net/route можно выхватить неопределенное состояние, когда во время считывания маршруты поменялись.

Я не эксперт в кернеле, но сейчас заглянул, и похоже там при открытии /proc/net/route делается дамп через тот же netlink, а потом он в цикле рисуется вывод. Мне кажется, вряд ли динамический список может измениться "на лету". Ну да ладно, это не принципиально.
 

Spoiler



static int fib_route_seq_show(struct seq_file *seq, void *v)
{
	struct fib_route_iter *iter = seq->private;
	struct fib_table *tb = iter->main_tb;
	struct fib_alias *fa;
	struct key_vector *l = v;
	__be32 prefix;

	if (v == SEQ_START_TOKEN) {
		seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
			   "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
			   "\tWindow\tIRTT");
		return 0;
	}

	prefix = htonl(l->key);

	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
		const struct fib_info *fi = fa->fa_info;
		__be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen);
		unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);

		if ((fa->fa_type == RTN_BROADCAST) ||
		    (fa->fa_type == RTN_MULTICAST))
			continue;

		if (fa->tb_id != tb->tb_id)
			continue;

		seq_setwidth(seq, 127);

		if (fi)
			seq_printf(seq,
				   "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
				   "%d\t%08X\t%d\t%u\t%u",
				   fi->fib_dev ? fi->fib_dev->name : "*",
				   prefix,
				   fi->fib_nh->nh_gw, flags, 0, 0,
				   fi->fib_priority,
				   mask,
				   (fi->fib_advmss ?
				    fi->fib_advmss + 40 : 0),
				   fi->fib_window,
				   fi->fib_rtt >> 3);
		else
			seq_printf(seq,
				   "*\t%08X\t%08X\t%04X\t%d\t%u\t"
				   "%d\t%08X\t%d\t%u\t%u",
				   prefix, 0, flags, 0, 0, 0,
				   mask, 0, 0, 0);

		seq_pad(seq, '\n');
	}

	return 0;
}


 

 

 

Мне интересно, за сколько у топикстартера выполнится команд:

 

cat /proc/net/route > /dev/null

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

time  cat /proc/net/route > /dev/null 

real    0m1.589s
user    0m0.016s
sys     0m1.569s

Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz

 cat /proc/cpuinfo | grep MHz |wc
     12      48     240

 

 

On 9/29/2019 at 1:22 PM, vop said:

Можно сюда смотреть: /proc/net/route

ето же то само ip r....

Изменено пользователем h3ll1
Добавил текст

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

On 9/30/2019 at 10:33 PM, vop said:

Мне интересно, за сколько у топикстартера выполнится команд:

 time ip route show  proto boot 
1.2.3.0/24 via 1.2.3.4 dev eth2.37 
1.2.3.32/28 via 1.2.3.4 dev eth2.37 

real    0m0.736s
user    0m0.032s
sys     0m0.700s
time cat /proc/net/route | grep eth2.37
eth2.37 00F43E5C        1AEB92C2        0003    0       0       0       00FFFFFF        0       0       0                                                                            
eth2.37 18EB92C2        00000000        0001    0       0       0       FCFFFFFF        0       0       0                                                                            
eth2.37 20EB92C2        1AEB92C2        0003    0       0       0       F0FFFFFF        0       0       0                                                                            

real    0m1.954s
user    0m1.645s
sys     0m1.828s

Изменено пользователем h3ll1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пайпа то зачем

time grep eth2.37 /proc/net/route

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

42 minutes ago, pppoetest said:

Пайпа то зачем

time grep eth2.37 /proc/net/route

 

Так немного тяжеловато. Надо бы приклеить поисковый параметр, что ли. Типа

 

time grep -w ^eth2.37 /proc/net/route

 

Так, вроде, должно пошустрее. :)

 

Ну да ладно, не в этом вопрос.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а чо не складывать это скриптом в какой-то KV db аля редис и не дрочить редис?

или обожемой прикрутить поисковое двигло

или нужно прям ондеманд быстро-быстро?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 28.09.2019 в 23:24, h3ll1 сказал:

real    0m7.476s

Ваше счастье что вы никогда не видели трейсов с сиськолами которые дёргаются при работе десктопа на фре/линухе всем этим DE и прикладными приложениями.

Особенно впечатляет насколько коряво реализовано и работает FILE в stdlib и других либах которые это юзают.

https://github.com/eranif/codelite/issues/2338

Или "прекрасная" glib от гнома, глюкодром говнокода: https://gitlab.gnome.org/GNOME/glib/merge_requests/1105/diffs

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

On 10/2/2019 at 3:13 PM, Ivan_83 said:

Ваше счастье что вы

Я не бил програмер, я не могу сам ето сделать. Я только ищу что будеть делать дела.

Заметка: 

"All set types support the optional skbinfo extension"  - ето с ipset док.

Quote

by usage of SET netfilter target with --map-set option. skbmark option format: MARK 


or

 MARK/MASK, where MARK and MASK are 32bit hex numbers with 0x prefix

sbin/ipset add  -! u231 10.2.3.0/28 skbprio 78cf
ipset v6.30: Syntax error: Invalid skbprio format, it should be:MAJOR:MINOR (see manpage)

Изменено пользователем h3ll1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для начала сет надо создавать с явным указанием на использование skbinfo:

 

ipset create local-skb4 hash:net family inet skbinfo counters

И skbprio != fwmark, и указывается в формате команды tc:

 

ipset add local-skb4 100.64.0.0/10 skbprio 1:fffd

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема, что я не могу сбежатъ с imq. IMQ не работает, с 2 года я ищу как сделять правила для ifb, и понимаю что не работает. Ну я знаю 

tc hashkey == ||  hash

HASHKEY := [ mask u32_hex_value ] [ at 4*int_value ]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думал, что я чего-то попутал, но.

https://github.com/imq/linuximq/issues/86

 

Для меня: решение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже, проблема больше нет.

https://github.com/imq/linuximq/issues/86#issuecomment-572741119

Все работает на УРА

Изменено пользователем h3ll1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.