• Оптимизация кода в уме, или «Ну так же однозначно быстрее»

      Намедни работая над одной ошибкой в одном опенсорсном проекте, увидел как коллега (тоже работающий параллельно над той же проблемой) залил такой вот коммит [31a078bec7]:

         	/*
      -	 * Select the list item based on the index. Negative operand means
      -	 * end-based indexing (-2, ...), and -1 means out of range.
      +	 * Decode end-offset index values.
         	 */
      -	if (opnd < -1) {
      -	    index = opnd+1 + objc;
      -	} else {
      -	    index = opnd;
      -	}
      +	index = opnd + (opnd <= TCL_INDEX_END)*(objc - 1 - TCL_INDEX_END);
         	pcAdjustment = 5;
      

      Изменение само по себе правильное (теперь TCL_INDEX_END есть константное определение (-2)).

      И грубо говоря в уме это разворачивается в следующее (все переменные int):

      index = opnd + cmp(opnd, (-2))==>(0 | 1) * (objc - 1 - (-2));
      

      Т. е. он как бы тем самым хотел сэкономить здесь один условный переход.
      И всё как бы ничего, однако меня всё же насторожила такая казалось бы пустячная «оптимизация» с уклоном в арифметику.

      Во первых, это изменение касается самой «главной» функции в этом проекте (TEBCresume), ибо она ответственна за исполнение байт-кода (JIT скомпилированных инструкций языка TCL). По этой причине эта функция еще и самая большая (порядка 6 тысяч строк + примитивы и макросы) и одна из самых сложных в кодовой базе проекта, с множественными `goto`, головоломными макросами для работы со «стеком» исполнения, свёртка/развертка NRE (nonrecursive evaluation) и т.д. и т.п.

      Т.е. изменения этой функции нередко рассматриваются под лупой, а то и под микроскопом (т.к. бывало что даже незначительные модификации могут перевернуть весь код этой функции с ног на голову)…

      Во вторых, по роду деятельности мне часто приходится оптимизировать сишный код, разглядывая его ассемблерное отражение, выжимая доли микро- а то и нано-секунд, и я часто вижу, что там очень всё совсем неоднозначно бывает. Как минимум иногда разворачивая такие вот «экономящие» условный jump конструкции обратно в if или даже if/else, я видел улучшение как и в результирующем ассемблерном коде, так и явно при конечном сравнении производительности результатов исполнения.

      Собственно к чему я все это писал — хотелось на примере показать как оно бывает, ну и раз уж коснулись этой темы, собрать немного статистики. Посему пара опросов в конце статьи…
      Развернуть в ассемблер ...
    • Great developer, true engineer and real leader — RIP Shawn O. Pearce

        image


        29 января 2018, скончался Шон Пирс, известный программист, автор, коммиттер и основатель многих проектов, в том числе Git, Jgit, libgit и Gerrit Code Review.


        Умер выдающийся разработчик, настоящий инженер и отличный руководитель, оставив замечательных пацанов, жену и… всё опенсорс сообщество.


        Почти год назад, когда у него был диагностирован рак легких, у него была только одна просьба, сделайте все возможное, присмотрите за мальчиками и Сарой, чтобы помочь им в переходный период.

        Читать дальше →
        • +55
        • 13,8k
        • 9
      • И так сойдёт… или Дыра как средство защиты


          По мотивам "И так сойдёт… или как данные 14 миллионов россиян оказались у меня в руках"...


          Статья, которую вы сейчас читаете, вовсе не ответ на вышеозвученный пост. Это будет скорее попытка показать что уже сейчас иногда делается, и что вообще можно сделать в области информационной безопасности, если немного отойти от общепринятых канонов при защите систем.


          И чтобы расставить все точки над E, — я вовсе не пытаюсь оценить или как-то обелить "ответственные" лица, что с одной, что с другой стороны.


          Я скорее просто попробую объяснить другой (возможно новый для некоторых читателей) концептуальный подход на примерах, в том числе и касающихся той статьи.


          Кстати, то что в ней не всё или скорей всего возможно не совсем всё правда, "реальному хакеру" видно невооруженным глазом.


          Например прочитав "Утащил базу весом 5 Гб… сколько времени это качалось. Вы думаете, кто-то заметил?" я лишь усмехнулся и продолжил чтение (ибо ИМХО некоторое преувеличение допускается в такого рода статьях).


          Хотя автор и сам признал что он немного лгунишка апдейтом в конце статьи.


          конечно же, никакой базы у меня нет, на протяжении 3-х дней я эмулировал скачивание ...

          Теперь почему это очевидно/вероятно (даже не принимая другие типовые ограничения во внимание):

          Читать дальше →
        • С новым (айтишным) «годом» Вас, други

            Как то прошло незамеченным, что несколько часов назад началась новая "эра", как минимум на наших железках всех мастей.


            Я не перепил, если что...

            Читать дальше →
          • [Опрос] А вот про нейронные сети, ИИ и т.д

              На просторах интернета часто доводилось видеть мнения, что де "нейросеть — панацея от всего и вся", т.е. например "натравите нейросеть — и все, профит" или еще брутальней "скоро создадут ИИ на базе нейронной сети, которая сможет заменить даже программистов / администраторов / аналитиков и т.д.".


              Как правило когда пытаешься затем выяснить глубину познания дзэн оппонента в этой области, выясняется что он чуть не полный дилетант (ну или после пары бестолковых "аргументов" с пеной у рта, он сливается, прерывая тем самым попытку выяснить его уровень).


              Я не понаслышке знаком с нейронными сетями, участвовал в некоторых проектах, "конструировал", обучил и настроил уже более десятка различных flow с использованием последних в разных областях применения (при этом перепробовав множество различных движков и типов сетей от простейших перцептронов до самоорганизующихся монстров). Кроме того, я лично знаком с некоторым количеством людей, активно проектирующих и использующих нейросети в повседневности, и пока что ни от одного из них не слышал про сногсшибательный прорыв в использовании нейросетей (что касается интеллекта последних). Т.е. я думаю, что в состоянии озвучить удаленность от реалий вышеприведенных высказываний.


              Написать статью (и опрос) хотел уже довольно давно, но все как-то руки не доходили. А после очередного вопроса-предложения по е-майлу "натравите же нейронную сеть" на проблему из моей прошлой статьи "Мониторинг лог-журналов: Такой уязвимый лог...", все-таки понял — нет — надо писать.


              В итоге целью этой статьи я ставлю во первых высказать свое скромное мнение, а во вторых выяснить что думают профессионалы с хабра по этому же поводу. Т.е. чтобы можно было ткнуть носом в статью очередного такого "все-лучше-всех-знающего" от интернета...


              Хотя вдруг это я таки нещадно отстал от жизни...

              Читать дальше →
            • Мониторинг лог-журналов: Такой уязвимый лог или как подложить свинью коллегам

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


                К сожалению часто связано это и с человеческим фактором, а именно с нежеланием или непониманием некоторых простых довольно вещей многими разработчиками программ, API и сервисов, логирующих в журнал ту самую, так необходимую для мониторинга информацию.
                Ниже именно то, как это часто делается и почему так дальше жить нельзя. Мы поговорим про форматы логов, разберем пару примеров, напишем несколько регулярных выражений и т.д…


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


                Меня же написать этот пост, заставил очередной фэйл с непростым таким для анализа форматом лога, приведший к очередной "уязвимости", вплоть до написания готового эксплойта в процессе поиска.


                И если я этой статьей сподвигну хоть одного разработчика задуматься, — это уже будет большое дело, и возможно, в следующий раз анализируя журналы, писаные его программой, его не помянут грязным словом, а напротив благодарно похвалят.

                Люди, включайте мозг ...
              • Fail2ban 0.10: Новые возможности. Тест открыт

                  Это анонс новой версии fail2ban (пока тестовая альфа-ветка), в которой помимо многих других улучшений и вкусностей, хоть и с опозданием, все же появилась давно запланированная поддержка IPv6.
                  Время, будь оно не ладно — летит с бешеной скоростью.

                  Читать дальше →
                • NGINX — Ускорение или Детектив для программиста «Оптимизация под Windows»

                    Довольно много времени прошло после моей последней статьи про nginx под windows, неделя nginx закончилась. Стоит поправить это упущение.

                    Иногда так случается, что вдруг появилось свободное время, но для чего-то путного его не хватает, а просто полазить в интернетах, почитать хабр всячески повышать свою квалификацию совсем не хочется.
                    Чтобы сделать все-таки что-нибудь полезного, решил заняться анализом логов с некоторых серверов одного проекта, насколько удастся впихнуть это в пару свободных минут.

                    После небольшого разбора и оценки в сравнении с результатами предыдущего анализа, заметил одну странность — абсолютная скорость отдачи nginx упала в среднем от 5 до 15%.

                    Объяснить, чем это вызвано с налета никак не удавалось, больших изменений вроде не было, объемы данных тоже настолько не выросли. Да и на отдаче динамики сильных изменений немного.

                    Покрутив логи и так и сяк, зацепился за отдачу маленькой статики — выяснилась одна закономерность: чем длиннее путь (url) — тем «медлительней» становился nginx (независимо от размера файла).

                    Итак после нескольких экспериментов, имеем следующие факты:
                    • скорость отдачи падает прямо пропорционально увеличению длины пути до файла
                    • скорость практически не зависит от длинны URL, т.е. если URL короткий, но увеличиваем длину root/alias, скорость отдачи падает также, т.е. это все-таки длинна пути, а не URL
                    • ну и наконец, поиграв с путями файла, а именно его вложенности, выяснилось, что скорость отдачи падает в зависимости от количества поддиректорий, и не зависит от длины как-таковой. Т.е. файл «D:\...\ms-ms-ms-ms-ms-ms-ms-ms\test.gif» отдается много быстрее «D:\...\ms\ms\ms\ms\ms\ms\ms\ms\test.gif»

                    И тут пришло озарение — я вспомнил, что в этом проекте изменилась файловая структура, и вложенность до некоторой статики и динамики, отдаваемой файлом (по redirect), увеличилась на два-три, а местами до пяти каталогов.
                    Читать дальше →
                  • Блокировка по access_log, легкий способ прострелить ногу или устранение конкурентов

                      Очередной пример, как легко прострелить себе ногу, на этот раз «переусердствовав» при защите сайта.
                      Имён как всегда не называю, однако история показательна как-таковая, т.е. в качестве примера, как не надо «защищать» свои сервера. Эх говоришь им, говоришь — а все без толку.

                      Пришлось тут намедни делать «аудит» одного коммерческого проекта… ну очень просили.
                      Упала посещаемость сайта, не совсем чтобы совсем, но довольно заметно. Смотрели логи, аналитику поисковиков и т.д. и т.п. Все вроде нормально, и кто приходит, тот даже не уходит сразу.
                      Но не буду ходить вокруг, да около — проанализировав логи банов по IP выяснилась одна закономерность — за короткое время в бан попадало огромное количество IP-адресов. Все поголовно по одной причине — якобы как botsearch. Отротированные логи за последний месяц тоже ужасали своими размерами и даже заглядывать туда не нужно было, и так все ясно. Т.е. случилось следующее: куча клиентов просто не могла попасть на сайт.
                      На вопрос «что-то меняли где-то с месяц назад?» был получен отрицательный ответ.

                      Не буду утомлять здесь детективным чтивом, после недолгих поисков — картина маслом. Некий прямой конкурент этого сайта поспособствовал «утечке» клиентов, или вернее и организовал эту «странную непосещаемость».
                      Читать дальше →
                    • NGINX — История перерождения под Windows

                        Раз уж тут у нас «неделя» nginx, например тут или тут, то попробую и я внести свою, так сказать, лепту. Речь пойдет про nginx 4 windows, а именно про более-менее официальную сборку для этой пропритарной, некоторыми не очень любимой платформы.

                        Почему Windows. Все просто, в корпоративном секторе Windows на сервере, да и на рабочих станциях — нередко обязательная программа. И от этих требований к платформе, например в ультимативной форме озвученных клиентом, никуда не денешься.
                        И раз уж имеем Windows, но не хочется мучиться с IIS, apache и иже с ними, если хочется использовать любимые инструменты, а nginx однозначно к ним относится, то приходится иногда мириться даже с некоторыми ограничениями на этой платформе. Вернее приходилось…

                        Хотя нужно заметить, что даже с этими ограничениями, nginx даст фору практически любому веб-серверу под windows по многим факторам, в том числе по стабильности, потреблению памяти, а главное производительности.

                        Спешу сразу поделится хорошей новостью — больше ограничений, критичных к высокой производительности, при использовании nginx под windows практически не существует, и последнее из критичных, с высокой долей вероятности, тоже скоро отпадет. Но по порядку…

                        Здесь описаны известные проблемы nginx 4 windows, а именно:

                        • Рабочий процесс может обслуживать не более 1024 одновременных соединений.
                        • Кэш и другие модули, требующие поддержки разделяемой памяти, не работают под Windows Vista и более поздними версиями в связи с тем, что на этих версиях Windows включена рандомизация адресного пространства.
                        • Хоть и возможен запуск нескольких рабочих процессов, только один из них реально работает.

                        Я немного изменил порядок, т.к. именно в такой последовательности я разбирался с этими ограничениями, так сказать отсортировано «исторически».
                        Читать дальше →