Назначение статического IP-адреса с помощью nmcli

Это уже достаточно оптимизировано. Трудно определить, в чем заключается "бутылочное горлышко", не зная больше деталей, например:

  • тип хранилища (HD, SSD, сеть, RAIDed)
  • количество и средний размер совпадающих файлов
  • количество каталогов и других несовпадающих файлов
  • количество полей в каждой строке
  • средняя длина строки

То, что вы можете сделать в любом случае:

  • замените -print | xargs на -exec cmd {} + или -print0 | xargs -r0, если ваши find/xargs поддерживают это. -print | xargs не только неверно, но и более дорого, поскольку xargs должен декодировать символы, чтобы выяснить, какие из них являются пробелами, и выполнять дорогостоящую обработку кавычек.
  • исправить локаль на C (export LC_ALL=C). Поскольку все символы, задействованные здесь (| и десятичные цифры для содержимого файлов и латинские буквы, точка и знак подчеркивания для имен файлов) являются частью переносимой кодировки, если ваша кодировка UTF-8 или другая многобайтовая кодировка, переход на C с его однобайтовой кодировкой избавит от большого количества работы для find и awk.
  • упростите часть awk до: awk -F "|" '$14 == "20160920100643" && $22 == "567094398953"'.
  • поскольку вы направляете вывод в head, вы можете отключить буферизацию вывода для awk, чтобы он вывел эти 10 строк как можно раньше. В gawk или mawk для этого можно использовать fflush(). Или вы можете добавить if (++n == 10) exit в awk.

Подведем итоги:

(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -exec zcat {} + |
  awk -F "|" '$14 == "20160920100643" && $22 == "567094398953" {
    print; if (++n == 10) exit}')

Если "узким местом" является процессор, на многоядерной системе GNU можно попробовать:

(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -print0 |
  xargs -r0P 4 -n 100 sh -c '
    zcat "$@" | 
      awk -F "|" "\$14 == "20160920100643" && \$22 == "567094398953" {
        print; fflush()}"' sh | head)

Запустить 4 задания zcat | awk параллельно на партиях по 100 файлов.

Если 20160920100643 - это метка времени, вы можете захотеть исключить файлы, которые были последний раз изменены до этого. В GNU или BSD find добавьте -newermt '2016-09-20 10:06:42'.

Если строки имеют большое количество полей, вы получите штраф за то, что awk разделит ее и выделит так много $n полей. Использование подхода, учитывающего только первые 22 поля, может ускорить работу:

grep -E '^([^|]*\|){13}20160920100643(\|[^|]*){7}\|567094398953(\||$)'

вместо команды awk. В GNU grep добавьте опцию --line-buffered для вывода строк как можно раньше при параллельном подходе или -m 10 для остановки после 10 совпадений при непараллельном.

Подведем итоги, если CPU является "бутылочным горлышком" и в вашей системе есть по крайней мере 4 ядра CPU, и есть по крайней мере 400 файлов muc*, и вы находитесь на системе GNU (где grep обычно значительно быстрее, чем GNU awk):

(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -newermt '2016-09-20 10:06:42' -print0 |
  xargs -r0P 4 -n 100 sh -c '
    zcat "$@" | 
      grep --line-buffered -E \
        "^([^|]*\|){13}20160920100643(\|[^|]*){7}\|567094398953(\||$)"
  ' sh | head)

Обратите внимание, что при параллельном подходе вывод команд grep может перемешаться (хотя при построчной буферизации и при условии, что размер строк не превышает нескольких килобайт, границы строк должны сохраняться).

14
26.06.2016, 22:55
3 ответа

Попробуйте:

# nmcli con add con-name "static-ens32" ifname ens32 type ethernet ip4 xxx.xxx.120.44/24 gw4 xxx.xxx.120.1
# nmcli con mod "static-ens32" ipv4.dns "xxx.xxx.120.1,8.8.8.8"
# nmcli con up "static-ens32" iface ens32

Далее найдите другие соединения и удалите их. Например:

# nmcli con show
NAME         UUID                 TYPE           DEVICE
ens32        ff9804db5-........   802-3-ethernet --
static-ens32 a4b59cb4a-........   802-3-ethernet ens32
# nmcli con del ens32

При следующей перезагрузке нужно поднять соединение static-ens32, так как оно единственное доступное.

30
27.01.2020, 19:50

Индивидуальный IPv4-адрес / 32. / 24 обозначает сеть, которая в данном случае будет XXX.XXX.120. [0-255]. Попробуйте изменить запись ipv4.address на XXX.XXX.120.44 / 32 и посмотрите, что произойдет. Если это не сработает, я должен задать тот же вопрос, который задан в комментариях - является ли NetworkManager обязательным требованием, или мы можем настроить адрес другими способами?

0
27.01.2020, 19:50

Замена /32 (single )на /24 (network )устранила мою проблему с назначением ipv4.addresses диапазона и первого IP-адреса.

Я думаю, что "вручную" может быть проблемой в вашем случае. Руководство может сказать nm вообще не управлять или не обрабатывать dhcp. Вы пробовали «общий», а затем ipv4.addresss, а не ipv4.address1? Или, если вручную, то ipv4.address1 может быть правильным вместо ipv4.addresses.

Вы заглядывали в /var/log/syslog? В моем случае dnsmasq сказал, что 32 слишком мало, а nmcli сообщил, что «слишком мало» в выводе ошибки.

0
27.01.2020, 19:50

Теги

Похожие вопросы