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

Совсем не чуток. При обработке такого большого количества маршрутов текстовая форма представления совершенно лишняя. И при чтении /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

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.