Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Последние изменения в IO-стеке Linux с точки зрения DBA

Время на прочтение15 мин
Количество просмотров20K
Главные вопросы работы с базой данных связаны с особенностями устройства операционной системы, на которой работает база. Сейчас Linux — основная операционная система для баз данных. Solaris, Microsoft и даже HPUX все еще применяются в энтерпрайзе, но первое место им больше никогда не занять, даже вместе взятым. Linux уверенно завоевывает позиции, потому что open source баз данных все больше. Поэтому вопрос взаимодействия БД с ОС, очевидно, о базах данных в Linux. На это накладывается вечная проблема БД — производительность IO. Хорошо, что в Linux последние годы идет капитальный ремонт IO-стека и есть надежда на просветление.


Илья Космодемьянский (hydrobiont) работает в компании Data Egret, которая занимается консалтингом и поддержкой PostgreSQL, и про взаимодействие ОС и баз данных знает многое. В докладе на HighLoad++ Илья рассказал о взаимодействии IO и БД на примере PostgreSQL, но и показал, как с IO работают другие БД. Рассмотрел стек Linux IO, что нового и хорошего в нем появилось и почему все не так, как было пару лет назад. В качестве полезной памятки — контрольный список настроек PostgreSQL и Linux для максимальной производительности подсистемы IO в новых ядрах.
Всего голосов 48: ↑43 и ↓5+38
Комментарии9

Как мы ускорили выполнение запросов PostgreSQL в 100 раз

Время на прочтение10 мин
Количество просмотров40K

Существует великое множество статей об оптимизации PostgreSQL — эта «кроличья нора» весьма глубока. Когда несколько лет назад я начал разрабатывать бэкэнд аналитического сервиса, у меня уже был опыт работы с другими СУБД, такими как MySQL и SQL Server. Тем не менее, раньше мне не приходилось так фокусироваться на производительности. В прошлых проектах, над которыми я работал, либо не было жестких требований к времени обработки (DS/ML), либо не требовалось обрабатывать много строк одновременно (обыкновенные веб-приложения). Однако в этот раз мои запросы:

состояли из 3-10 JOIN-ов по коррелирующим запросам;

уielded от 10 до 1,000,000 строк;

должны были выполняться в течение времени, определенного UX-ом;

не могли быть hinted — пока Cloud SQL, управляемый PostgreSQL в Google Cloud, не стал поддерживать pg_hint_plan в конце 2021 года;

запрещали прямой доступ к серверному процессу, чтобы, например, хакнуть некоторые perf — потому что PostgreSQL был managed.

Получение целого миллиона строк в одном API endpoint сигнализирует о проблеме в алгоритме или архитектуре. Конечно, все можно переписать и перепроектировать, но за это нужно платить.

У нас не нашлось «заклинания», которое решило бы все проблемы с производительностью SQL. Тем не менее, я упомяну здесь несколько дельных предложений, которые помогли нам и, надеюсь, смогут помочь читателю. Разумеется, это не какие-то сакральные знания. Но когда мы начинали оптимизацию, я был бы рад их прочитать или услышать.

Читать далее
Всего голосов 27: ↑24 и ↓3+24
Комментарии2

Я написал более быстрый алгоритм сортировки

Время на прочтение34 мин
Количество просмотров45K

Может показаться откровенной наглостью в наши дни утверждать, что Вы изобрели алгоритм сортировки, который на 30% быстрее, чем лучший существующий. Увы, я должен сделать гораздо более наглое заявление: я написал алгоритм сортировки, который в два раза быстрее, чем std :: sort для многих входных данных. И за исключением случаев, когда я специально конструирую воспроизведение нахудших для него ситуаций, алгоритм никогда не бывает медленнее, чем std :: sort (и даже когда попадаются эти худшие случаи, они обнаруживаются и происходит автоматический возврат к std :: sort).

Почему это утверждение неудачное? Потому что мне, вероятно, будет сложно убедить вас в том, что я ускорил сортировку в два раза. Однако, чтобы всех убедить, всё это должно теперь оказаться описанным довольно длинным сообщением в блоге, а весь исходный код - открытым кодом, чтобы вы могли опробовать его на любых данных. Так что я либо могу убедить вас множеством аргументов и измерений, либо вы можете просто опробовать алгоритм сами.

Читать далее
Всего голосов 44: ↑41 и ↓3+55
Комментарии36

Разгоняем REACTOR

Время на прочтение10 мин
Количество просмотров13K

Реактор сегодня - это стильно, модно, молодежно. Почему многие из нас практикуют реактивное программирование? Мало кто может ответить однозначно на этот вопрос. Но эта статья рассказывает не об этом, а о проблемах, которые реактор может создать даже опытному программисту и о методах их решений. Берем под контроль количество одновременно выполняемых задач, правильно распределяем задачи в пуле и достигаем отличных результатов с параллельной обработкой в reactor.

Читать далее
Всего голосов 7: ↑6 и ↓1+6
Комментарии30

Распознавание текста на картинке с помощью tesseract на Kotlin

Время на прочтение7 мин
Количество просмотров15K

Ни для кого не секрет, что Python прочно занял первенство в ML и Data Science. А что если посмотреть на другие языки и платформы? Насколько в них удобно делать аналогичные решения?


К примеру, распознавание текста на картинке.

Читать дальше →
Всего голосов 26: ↑26 и ↓0+26
Комментарии1

Flutter под капотом

Время на прочтение11 мин
Количество просмотров36K
Всем привет! Меня зовут Михаил Зотьев, я работаю Flutter-разработчиком в Surf. Мне, как, наверное, большинству других разработчиков, которые работают с Flutter, больше всего нравится то, как просто создавать с его помощью красивые и удобные приложения. Чтобы войти во Flutter разработку, нужно совсем немного времени. Недавно я работал в геймдеве, а теперь полностью переключился на кроссплатформенную мобильную разработку на Flutter.

В чём простота? С помощью десятка базовых виджетов можно собирать вполне приличные пользовательские интерфейсы. А со временем, когда багаж используемого скопится вполне приличный, вряд ли какая-то задача поставит вас в тупик: будь то необычный дизайн или изощренная анимация. А самое интересное — скорее всего вы сможете этим пользоваться, даже не задумываясь над вопросом: «А как оно вообще работает?».

Поскольку у Flutter открытые исходники, я решил разобраться с тем, что же там под капотом (on the Dart side of the Force), и поделиться этим с вами.


Читать дальше →
Всего голосов 20: ↑19 и ↓1+21
Комментарии15

Как сделать так, чтобы вашу статью или документацию поняли быстро и точно

Время на прочтение2 мин
Количество просмотров5.2K
Не только содержание, но и структура текста должна быть осмысленна.

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

  • Заголовок
  • Суть статьи
    На основе этих нескольких предложений вместе с заголовком читатель должен понять, интересно ли ему читать эту статью дальше.
  • Краткое изложение
    Здесь в максимально сжатом виде, тезисно, но с необходимой точностью и полнотой должна быть отражена суть данной статьи — от нескольких предложений до нескольких страниц. Кому-то, кто глубоко в теме этого может быть достаточно для понимания всей статьи. Но в любом случае читателю полезно представлять в самом общем виде, о чем эта статья, и какие выводы он получит в конце.
  • Логика статьи
    Если статья длинная, содержит много разделов и сложную логику, то эта глава может быть также полезной. По сути это расширенное оглавление. Здесь кратко, на одной-двух страничках, излагается логика рассуждения, сухо, без деталей. Опять-таки, кому-то этого будет достаточно для того, чтобы все понять. Если сложно, то читатель может это пропустить (как оглавление) и читать дальше.
  • Упрощенное изложение
    Если статья достаточно сложная, то многим было бы удобно сначала понять концептуально, что же хочет сказать автор. Поэтому неплохо сначала изложить все так, как если бы вы рассказывали студентам, упуская сложные доказательства, и, возможно, не столь формальным и строгим языком. Для очень многих такой уровень изложения может быть достаточным, и они остановятся здесь.
  • Строгое изложение
    Здесь строго профессиональное изложение.

Читать дальше →
Всего голосов 7: ↑5 и ↓2+6
Комментарии20

Повторная обработка событий, полученных из Kafka

Время на прочтение7 мин
Количество просмотров26K


Привет, Хабр.


Недавно я поделился опытом о том, какие параметры мы в команде чаще всего используем для Kafka Producer и Consumer, чтобы приблизиться к гарантированной доставке. В этой статье хочу рассказать, как мы организовали повторную обработку события, полученного из Kafka, в результате временной недоступности внешней системы.


Современные приложения работают в очень сложной среде. Бизнес-логика, обернутая в современный технологический стек, работающая в Docker-образе, который управляется оркестратором вроде Kubernetes или OpenShift, и коммуницирующая с другими приложениями или enterprise-решениями через цепочку физических и виртуальных маршрутизаторов. В таком окружении всегда что-то может сломаться, поэтому повторная обработка событий в случае недоступности одной из внешних систем — важная часть наших бизнес-процессов.

Читать дальше →
Всего голосов 18: ↑17 и ↓1+19
Комментарии5

[кейс Locomizer] Как за два с половиной года ускорить расчёт тепловой карты в 20 000 раз

Время на прочтение31 мин
Количество просмотров3.7K
Данная статья является продолжением серии «Кейс Locomizer», см. также


Здравствуйте.

КПДВ: TC, EMR, IDEA

Знаете, что такое «постмортем»? Это повествование о том, как мы дошли до жизни такой.

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

К тому же, если я просто кину ссылку на репозиторий с таким софтом, вряд ли кто-либо сможет врубиться, что это и зачем, и для решения каких задач может быть полезно. Даже если переведу с английского три десятка страниц инструкции по началу работы. Всё же, фреймворк на Spark — это не очередная поделка на ангуляре, надо понимать, что курилипочему авторы написали его именно таким, а не иначе.

Данная статья — историческая вводная по One Ring. Кода в ней нет, и рассказ скорее популярный, чем научный. Зато только про разработку, и ни о чём другом, кроме двух с половиной лет разработки.
Погнали в Нуменор?
Всего голосов 6: ↑6 и ↓0+6
Комментарии38

Исследуем бинарные форматы на примере байткода .class файла

Время на прочтение10 мин
Количество просмотров10K

image


Если вас не пугает картинка выше, если вы знаете чем отличается big-endian от little-endian, если вам всегда было интересно как "устроены" бинарные файлы, значит эта статья для ВАС!

Читать дальше →
Всего голосов 15: ↑13 и ↓2+18
Комментарии6

Не все патчи одинаково полезны

Время на прочтение11 мин
Количество просмотров4.6K

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


Здесь мы рассмотрим несколько "улучшений", отклонённых из-за непонимания тонкостей спецификации языка, неочевидных угловых случаев и других причин. Поехали!

Читать дальше →
Всего голосов 19: ↑19 и ↓0+19
Комментарии10

Кастомизируем маппинг контроллеров Spring MVC

Время на прочтение6 мин
Количество просмотров10K

Введение


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

Читать дальше →
Всего голосов 4: ↑3 и ↓1+5
Комментарии5

Инкрементальные бэкапы postgresql с pgbackrest — курс молодого бойца от разработчика

Время на прочтение7 мин
Количество просмотров32K
Дисклеймер

Я — разработчик. Я пишу код, с базой данных взаимодействую лишь как пользователь. Я ни в коем случае не претендую на должность системного администратора и, тем более, dba. Но…

Так вышло, что мне нужно было организовать резервное копирование postgresql базы данных. Никаких облаков — держи SSH и сделай, чтобы все работало и не просило денег. Что мы делаем в таких случаях? Правильно, пихаем pgdump в cron, каждый день бэкапим все в архив и если совсем разошлись — отправляем этот архив куда-нибудь подальше.

В этот раз сложность состояла в том, что по планам база должна была расти примерно на +- 100 МБ в день. Разумеется, уже через пару недель желание бэкапить все pgdump'ом отпадет. Тут на помощь приходят инкрементальные бэкапы.

Интересно? Добро пожаловать под кат.
Читать дальше →
Всего голосов 17: ↑17 и ↓0+17
Комментарии16

Подробный разбор симплекс-метода

Время на прочтение6 мин
Количество просмотров259K

Пролог


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

Замечание. Пост будет написан достаточно формальным языком, но будет снабжен комментариями, которые должны внести некоторую ясность. Такой формат позволит сохранить научный подход и при этом, возможно, поможет некоторым в изучении данного вопроса.
Читать дальше →
Всего голосов 33: ↑33 и ↓0+33
Комментарии27

Создание библиотеки в стиле Spring Data Repository своими руками при помощи Dynamic Proxy и Spring IoC

Время на прочтение10 мин
Количество просмотров7K

А что если бы можно было создать интерфейс, например, такой:


@Service
public interface GoogleSearchApi {
    /**
     * @return http status code for Google main page
     */
    @Uri("https://www.google.com")
    int mainPageStatus();
}

А затем просто внедрять его и вызывать его методы:


@SpringBootApplication
public class App implements CommandLineRunner {
    private static final Logger LOG = LoggerFactory.getLogger(App.class);

    private final GoogleSearchApi api;

    public App(GoogleSearchApi api) {
        this.api = api;
    }

    @Override
    public void run(String... args) {
        LOG.info("Main page status: " + api.mainPageStatus());
    }

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Такое вполне возможно реализовать (и не очень то и сложно). Дальше я покажу, как и зачем это делать.

Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии0

Как перестать забывать про индексы и начать проверять execution plan в тестах

Время на прочтение9 мин
Количество просмотров12K
кдпв

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

Обычный день, обычный релиз: все задачи вдоль и поперек проверены нашим QA-инженером, поэтому со спокойствием священной коровы «закатываем» на stage. Приложение ведет себя хорошо, в логах — тишина. Принимаем решение делать switch (stage <-> prod). Переключаем, смотрим на приборы…

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

Проходит еще пару минут, первая жалоба из первой линии: у клиентов очень долго загружаются данные, приложение тормозит, долго отвечает и т.д. Начинаем беспокоиться… смотрим логи, ищем возможные причины.
Читать дальше →
Всего голосов 25: ↑22 и ↓3+19
Комментарии29

Знакомство с Helm 3

Время на прочтение10 мин
Количество просмотров24K


Прим. перев.: 16 мая этого года — значимая веха в развитии менеджера пакетов для Kubernetes — Helm. В этот день был представлен первый альфа-релиз будущей крупной версии проекта — 3.0. Её выход принесёт в Helm существенные и долгожданные изменения, на которые многие в Kubernetes-сообществе возлагают большие надежды. К таковым относимся и мы сами, поскольку активно используем Helm для деплоя приложений: мы интегрировали его в свой инструмент для реализации CI/CD werf и от случая к случая вносим посильный вклад в развитие upstream. Этот перевод объединяет 7 заметок из официального блога Helm, что приурочены к первому альфа-релизу Helm 3 и рассказывают об истории проекта и основных фичах Helm 3. Их автор — Matt «bacongobbler» Fisher, сотрудник Microsoft и один из ключевых мейнтейнеров Helm.
Читать дальше →
Всего голосов 35: ↑34 и ↓1+33
Комментарии5

Мины под производительностью ждут своего часа

Время на прочтение17 мин
Количество просмотров15K

В этой статье я расскажу о минах, заложенных под производительность, а также об их обнаружении (желательно ещё до взрыва) и обезвреживании.


Картинка для привлечения внимания

image

Читать дальше →
Всего голосов 36: ↑34 и ↓2+32
Комментарии21

Практические задачи по Java — для курсов и прочих занятий

Время на прочтение35 мин
Количество просмотров784K

Практические задачи по Java — для курсов и прочих занятий


Несколько вводных слов


Последние несколько лет я читаю курс по программированию на Java. Со временем он менялся — то добавлялись, то выкидывались разные части, менялась последовательность тем, менялся подход к построению плана самих занятий, и так далее. То есть, курс совершенствовался. Одной из основных проблем, возникших при подготовке курса — это задачи. О них и пойдёт речь.

Дело в том, что каждое моё занятие состоит из двух частей. На первой я выступаю в роли лектора — рассказываю с примерами кода о какой-то новой теме (классы, наследование, дженерики и так далее). Вторая часть — практическая. Очевидно, что нет смысла просто рассуждать о программировании, надо программировать. Приоритет на занятиях — решение задач, то есть программирование чего-то как-то. Программирование на занятиях отличается от программирования дома, так как на занятиях можно задать вопрос, показать код, получить быструю оценку кода, комментарии по улучшению, исправлению написанного. Очень легко было найти задачи для самых первых занятий. Задачи на циклы, условные операторы, и ООП (к примеру, написать класс «Собака» или класс «Вектор»). Сервисы вроде leetcode позволяют даже проверить правильность решения таких задач сразу, онлайн. Но какие задачи дать студентам на занятии, которое было посвящено коллекциям? Потокам? А аннотациям? За несколько лет я придумал, или переработал несколько таких задач, и эта статья, по сути, является сборником этих задач (к некоторым задачам прилагается решение).
Читать дальше →
Всего голосов 20: ↑19 и ↓1+18
Комментарии20

Spring Data JPA: доводим напильником

Время на прочтение14 мин
Количество просмотров67K

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

Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии6
1

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность