Jump to content
Калькуляторы

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

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.

Edited by h3ll1

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites
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....

Edited by h3ll1
Добавил текст

Share this post


Link to post
Share on other sites
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

Edited by h3ll1

Share this post


Link to post
Share on other sites
42 minutes ago, pppoetest said:

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

time grep eth2.37 /proc/net/route

 

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

 

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
В 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

Share this post


Link to post
Share on other sites
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)

Edited by h3ll1

Share this post


Link to post
Share on other sites

Для начала сет надо создавать с явным указанием на использование 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

 

Share this post


Link to post
Share on other sites

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

tc hashkey == ||  hash

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now