Pull to refresh
11
0
Паша @krpsh

сисадмин

Send message

первая задача быстрее/эффективнее решается через cat ... | awk '$8 == 500'

В awk нумерация начинается с 1, а не с 0, поэтому правильно вот так: cat ... | awk '$9 == 500'. Тут мы разобрали много способов решения первой задачи, в том числе и awk.

Что касаемо остального, то могу только сказать, что вы (как истинный любитель Perl) следуете главному девизу TMTOWTDI )))

Полностью согласен. Однострочники Perl это вообще отдельная тема и я ее не упомянул лишь потому что в Golang нет онострочников.

Разбор логов

По умолчанию print ставит перевод строки, поэтому я чуток поправил вот так print(line , end='')

real    0m19,840s
user    0m18,834s
sys     0m1,006s

9728 python ./script.py
9728 python ./script.py
9728 python ./script.py

Работа с базой

У меня ошибка (

Traceback (most recent call last):
  File "/home/pasha/src_my/habr_perl_golang/./task2/script.py", line 11, in <module>
    print(f"{row['deal_city_id']} {row['ShortName']} {row['FullName']}")
             ~~~^^^^^^^^^^^^^^^^
TypeError: tuple indices must be integers or slices, not str

Пришлось поправить вывод результата вот так print(row)

real    0m2,338s
user    0m0,061s
sys     0m0,053s

19284 python ./script.py
20308 python ./script.py

Получение информации о сертефикате

real    0m0,475s
user    0m0,054s
sys     0m0,011s

25668 python ./script.py

вывод скрипта

<X509Name object '/C=US/ST=California/L=Los Angeles/O=Internet\xC2\xA0Corporation\xC2\xA0for\xC2\xA0Assigned\xC2\xA0Names\xC2\xA0and\xC2\xA0Numbers/CN=www.example.org'>
b'20230113000000Z'
b'20240213235959Z'

Работа с джсоном

Тут я прям сильно удивился простоте скрипта. Вы, наверное, не поняли сути задачи, ибо в массиве developers явно находятся не строки, а какие-то структуры, т.к. каждая строка вывода скрипта не является валидным json объектом.

вывод скрипта

{'id': 1, 'name': 'Larry'}
{'id': 2, 'name': 'Robert'}
{'id': 3, 'name': 'Rob'}
{'id': 4, 'name': 'Ken'}

  • Я access.log не генерил, а взял с рабочего сервера

  • У меня 500-х кодов 226 строк

  • Во всех тестах вывод был на терминал, никуда ничего не перенаправлял

уговорили )))

time rg "\s500\s" ./access.log

real	0m0,208s
user	0m0,135s
sys	    0m0,073s

да, действительно, реактивный какой )

спасибо, за полезный инструмент!

Так использовали б его для большего юзабилити вроде вот такого.

поржал )))))

time grep -E "\s500\s" ./access.log

real    0m1,165s
user    0m1,051s
sys     0m0,114s

time awk '$9~500' ./access.log

real    0m1,258s
user    0m1,077s
sys     0m0,182s

если что, то в логе вот сколько строк

wc -l ./access.log

3984116 ./access.log

ripgrep - не встречал такого (

Ну почему же. В данном случае это оправдано, т.к. все развернуто локально и база в том числе, а это значит, что она в момент теста не была нагуржена от слова совсем и замеры проводились несколько раз чтобы прогреть всякие буферы, кеши и прочее.

Да, так работает быстрее

real    0m8,611s
user    0m8,331s
sys     0m0,539s

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

И если захватывать остаток строки вот так

re := regexp.MustCompile(`(?s)(?:.+?\s){8}(.+?)\s(.+)`)

то результат будет другой

real    0m14,968s
user    0m14,719s
sys     0m0,560s

Соглашусь с вами - это не конкуренты, я этого и не утверждал. Просто мне было интересно, можно ли использовать Golang (не слишком ли он сложен) как сриптовый язык для простых нужд сисадмина. Да, горутины классные, я пробовал, но скажу вам, что для рядового сисадмина горутины почти не нужны, да и на Perl есть куча модулей позволяющих так же элегантно породить (fork) кучу воркеров. Конечно же fork не сравнится с горутинами, но например для опроса кучи сайтов можно использовать не воркеры, а асинхронно это сделать.

И да, для всего нужен свой инструмент и правильный сисадмин умеет его выбирать под задачу )

Я знаю, что так можно, но как раз в этом-то и заключается ключевое отличие. В Perl ты получаешь сразу весь десериализованный json, а в Golang ты должен его описать настолько подробно, насколько тебе надо прежде чем десериализовать. Этот момент понять было сложнее всего.

И да, у Perl то же есть песочница )

Компилировать regex конечно надо вне цикла

точно, а вы ведь правы

я проверил и Golang отработал быстрее (везде он чуток, но быстрее, елки зеленые :-)), но по памяти проиграл

real    0m15,796s
user    0m15,603s
sys     0m0,691s
 8232 /tmp/go-build260055243/b001/exe/script
 8300 /tmp/go-build260055243/b001/exe/script
 8120 /tmp/go-build260055243/b001/exe/script

Кстати, а нет ли у вас желания воспроизвести такие же скрипты на питоне (можно без замеров), чтобы можно было наглядно сравнить?

  • А я в статье и не призываю никого учить Perl и ничего против питона не имею.

  • В точку про производительность!

  • Скорее всего соглашусь с вами

Это все очень хорошо, ansible и т.п., но в данном конкретном случае имеется: один админ, один сервер, один контейнер на сервере. А вот про systemctl mask спасибо что напомнили, все время упускаю этот момент, а ведь в данном случае это необходимо сделать (как вы правильно сказали - защита от дурака).

Да было конечно. Можно и так сделать, но на мой взгяд, в данном случае удобней сделать отдельный сервис, т.к. изменение в запуске существенные.

Конечно пробовали, вот ситуации который мы тестировали:

  • тестирование отключения одного из серверов:
    Запись не прекращается, когда выключенный сервер возвращается в строй, все файлы синхронизируются

  • тестирование замены одного из серверов:

    Сначала нужно ввести новый сервер в кластер, затем заменить кирпичик (replace-brick) и уже после удалить старый сервер из кластера.

Про riak не слышал. Бегло сейчас читанул - нам не подходит, т.к. нам нужен доступ к файлам на файловой системе. Да и файлы у нас разные, от 10kb до 100Mb.

Если перевести нашу схему на 10GBit/s, то мы упремся в диски на srv{1,2}, т.е. в 165. Для двух серверов с томом Replicate сеть в 10GBit/s излишне,а вот для фактора репликации 3 и с быстрыми дисками на серверах это уже вполне годится )

Хорашая мысль, но у нас весь проект в дата-центре и цены там на 10-гигабитную сеть не особо радуют. А вот вариант с объединением сетевух вполне реален с нашим бюджетом.

1

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity