iptables просматривает каждое правило из таблицы до тех пор, пока не будет найдено совпадение с конечной целью, поэтому меньшее количество правил означает меньшую загрузку ЦП. Хотя некоторые правила работают быстрее, чем другие, например, правило multiport для 15 портов может быть быстрее, чем эквивалентное правило set (, как в ответе Hauke Laging ).. Так что важно не только количество правил, но и их тип.
Исходный код для tcp/udp , multiport и set соответствуют некоторым эмпирическим правилам, но поскольку трудно предсказать, где все работает медленно , я бы рекомендовал протестировать возможные наборы правил iptables и посмотреть, какой из них быстрее. Например, я запускаю iperf3 со списком всего из 3 портов, и модуль tcp был немного быстрее, чем многопортовый и набор . модули, которые предлагали аналогичную пропускную способность.
Если вы все еще увлекаетесь микробенчмарками, я подсчитал количество циклов ЦП, необходимых для запускаipt_do_table
функции ядра, с помощью этого самого,очень примитивный скрипт SystemTap :
global call_cycles = 0
probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").call {
call_cycles = get_cycles()
}
probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").return {
delta = get_cycles() - call_cycles
printf(" <- delta = %d\n", delta)
}
Это мои результаты для пакета, проходящего через все правила на виртуальной машине под управлением Linux 4.15:
Модуль | Порты | Правила | Прогон 1 | Прогон 2 | Прогон 3 | Прогон 4 | Прогон 5 |
---|---|---|---|---|---|---|---|
TCP | 4500 | 4500 | 973148 | 1032564 | 856528 | 410894 | 854708 |
многопортовый | 4500 | 300 | 89370 | 259250 | 99752 | 225275 | 182256 |
набор | 4500 | 1 | 28463 | 43494 | 28315 | 33589 | 40988 |
Двойные (или одинарные )кавычки используются для остановки обработки текста в них оболочкой. Вы не можете добавить их как часть самой команды.
Однако вы можете создать команду, используя массив, а затем включить эту переменную массива в результат. Здесь я использовал args
как переменную массива, а не скалярную (строку ), так что мы можем неоднократно добавлять значения в кавычках к ее списку:
C3=yellow
FILE=file.png
args=()
args+=(-draw 'line 0,0 0,319')
args+=(-draw 'line 125,0 125,319')
args+=(-draw 'line 652,0 652,319')
или
args+=(-draw "line $x,$y1 $x,$y2")
если вы используете переменные вместо буквенных чисел. Обратите внимание, что одинарные кавычки, которые вы указали в своем обновленном вопросе, неверны (, это неправильно :args+=(-draw "'line $x,$y1 $x,$y2'")
, так как вы будете включать символы одинарной кавычки в значения , которые передаются вmogrify
).
Наконец, дважды -заключайте в кавычки набор значений args
, чтобы каждый элемент рассматривался оболочкой как значение в кавычках:
mogrify -stroke "$C3" "${args[@]}" "$FILE"