GolosSQL - Обновление 11 - О блокировках и производительности
![](https://img.golos.io/proxy/http://i.cubeupload.com/5vkhGt.png)
GolosSQL – это публичная MS-SQL база данных со всеми данными блокчейна внутри.
Предыдущие посты:
- Вступительный пост
- Обновление 1 - Распознавание языка (english only - только на английском)
- Обновление 2
- Обновление 3
- Обновление 4
- Обновление 5
- Обновление 6
- Обновление 7
- Обновление 8
- Обновление 9
- Обновление 10
Успех и массовое распространение GolosSQL
GolosSQL широко применяется многими пользователями для аналитической обработки данных и даже для запуска ботов. И действительно, зачастую проще послать SQL-запросы для получения информации о содержимом блокчейна, чем проанализировать каждый блок и выполнить агрегацию всех этих данных самому.
GolosSQL использует процесс «Инжектор базы данных», который считывает блокчейн в режиме реального времени и распределяет транзакции, выполненные в блокчейне, в различные таблицы. Сегодня в среднем генерируется 4 транзакции в секунду с отдельным пиком в 248 транзакций в секунду. Каждая транзакция может также влиять на не содержащие транзакций таблицы Accounts
и Comments
, которые также должны быть обновлены.
Чтобы обеспечить целостность базы данных, инжектору базы данных нужно выполнять блокировку обновляемых таблиц каждый раз, когда он должен вставить или обновить данные.
Даешь блокировку!
![](https://img.golos.io/proxy/http://i.cubeupload.com/INOc3y.jpg)
Во время работы инжектора базы данных пользователи GolosSQL посылают запросы в базу данных для выполнения своего анализа.
Поэтому SQL-сервер также попытается выполнить блокировку таблицы, к которой относится запрос пользователя, дабы гарантировать, что возвращаемые данные будут согласованы.
Как видите, поскольку оба процесса выполняются одновременно, может начаться гонка за выставление блокировки на таблицах между инжектором базы данных, стремящимся добавить в нее данные, и выпустившим запрос, стремящимся прочитать данные из нее.
Инжектор базы данных – замечательный процесс, потому что он часто запрашивает блокировку, но только на очень короткое время, так как выполняет обновление очень быстро.
С другой стороны, часто бывает так, что на выполнение выпущенных пользователями запросов требуется несколько секунд или даже минут до полного завершения. Я видел несколько запросов, на которые ушло более получаса, потому что они были плохо написаны или недостаточно ограничительны.
И пока эти долгие запросы не завершены, инжектор базы данных не может добавлять в нее новые данные. Это не только раздражает с точки зрения производительности из-за рассинхронизации база данных с блокчейном, но также является для меня источником спама, потому что я получаю уведомление всякий раз, когда возникает проблема с инжектированием данных в базу.
Пожалуйста, используйте подсказку NOLOCK!
Члены канала #GolosSQL на chat.golos.io начали замечать мою повторяющуюся просьбу о том, чтобы они использовали подсказку оптимизации SQL (NOLOCK)
.
Подсказка (NOLOCK) сообщает серверу SQL о том, что разрешается “нечистое” чтение. Когда пользователь посылает запрос с подсказкой NOLOCK, то при этом не создается общих блокировок, запрещающих инжектору базы данных добавлять данные в базу. Даже если последний выпустит исключающую блокировку, она не будет блокировать возможность чтения заблокированных данных для запроса пользователя.
Как я уже объяснял пользователям GolosSQL, использование подсказки NOLOCK не только останавливает прерывание работы инжектора базы данных, но также улучшает производительность их запросов.
Как пользователи отреагировали на мою просьбу
![](https://img.golos.io/proxy/http://i.cubeupload.com/Q8SwZ9.jpg)
Хорошие
Некоторые быстро осознали для себя преимущество с точки зрения производительности (и для меня с точки зрения спокойствия) и начали систематически использовать NOLOCK. Они добавили подсказку к своим запросам, и всё стало хорошо.
Плохие
К сожалению, некоторые не услышали моего призыва или просто не обратили на него внимания. Они продолжали выпускать запросы без подсказки или забывали добавлять их во все таблицы в своих запросах (или подзапросах).
Другие же, не зная, как писать SQL-запросы, использовали для выполнения задачи инструменты анализа, и даже если они узнали о NOLOCK, то не смогли заставить свой инструмент использовать подсказку.
Злые
Наконец, некоторые из тех, кто, как мне известно, видел мою просьбу об использовании NOLOCK, просто проигнорировали ее. Ленивцы! Я должен признать, что мне пришлось забанить кое-кого из них, чтобы сохранить плавность работы GolosSQL.
Необходимость в ответном ударе
![](https://img.golos.io/proxy/http://i.cubeupload.com/Qi1jHp.jpg)
Всё чаще мне приходится бороться с людьми, выпускающими запросы, которые валят GolosSQL.
Чтобы дать вам представление о проблеме, вот график, который показывает количество запросов на блокировку в минуту за последние 30 дней:
Как вы можете видеть, серверу приходится иметь дело в среднем с 767K запросов на блокировку/мин, а иногда и до 4075K запросов на блокировку/мин.
Я также получал сотни уведомлений о тупиковой ситуации в день. Я начал уставать от необходимости постоянно чистить свой почтовый ящик. Настало время положить конец этой анархии.
Но как решить эту проблему, не прерывая запущенных процессов (а их, похоже, довольно много)?
Агент 007 спешит на помощь
![](https://img.golos.io/proxy/http://i.cubeupload.com/cQEfjL.jpg)
К счастью (или сожалению), я не агент 007 и не имею лицензии на убийство (A KILL). А значит, единственным оставшимся мне вариантом было использование Представления (A VIEW)!
В SQL представление является виртуальной таблицей на основе результирующего набора инструкции SQL. В представлении содержатся строки и столбцы, как в любой реальной таблице. Поля в представлении представляют собой поля из одной или нескольких реальных таблиц в базе данных.
Поэтому все таблицы были перемещены за представления SQL, которые имитируют таблицы и используют подсказку NOLOCK. Сами таблицы теперь недоступны для пользователей, а доступ имеет только Инжектор базы данных. Поскольку это единственный процесс обновления базы данных, нам не нужно бояться повреждения данных.
Например, таблица Comments
была переименована в «TComments», и представление было создано со следующим определением:
CREATE VIEW Comments AS SELECT * FROM TComments (NOLOCK)
Это гарантирует, что каждый запрос, выпущенный к таблице через представление, будет использовать подсказку NOLOCK.
Пользователям не придется ничего менять в своем существующем процессе, поскольку всё полностью прозрачно и для них, и для любого приложения, которое они используют для посылания запросов в базу данных.
Вперед на полной скорости
![](https://img.golos.io/proxy/http://i.cubeupload.com/GiDJdg.jpg)
Несмотря на то, что эта новая внедренная структура теперь скроет то, как таблицы выглядят и объединены вместе, это позволит GolosSQL продолжать работать на полной скорости и справиться с будущим ростом платформы Golos.
Я твердо намерен создать и опубликовать документацию и руководства для GolosSQL.
Более того, теперь я смогу выпустить некоторые очень ожидаемые новые функции, релиз которых я откладывал, чтобы не повалить сервер.
Спасибо всем тем, кто регулярно посылает мне хвалебные комментарии и выражает свою признательность за создание GolosSQL.
Спасибо за чтение.
Помогите GolosSQL остаться публичным и работать 24/7/365. Все выплаты этой должности будут распределены на инфраструктуру GolosSQL.
Спасибо за вашу поддержку!
Спасибо @blockchained за вычитку этого поста перед публикацией.
![](https://imgp.golos.io/50x60t0/http://golosboard.com/@arcange/votes.png)
![](https://imgp.golos.io/58x70t0/http://golosboard.com/@arcange/commented.png)
![](https://imgp.golos.io/67x80t0/http://golosboard.com/@arcange/posts.png)
![](https://imgp.golos.io/100x100t600/http://golosboard.com/@arcange/level.png)
![](https://imgp.golos.io/67x80t0/http://golosboard.com/@arcange/comments.png)
![](https://imgp.golos.io/58x70t0/http://golosboard.com/@arcange/voted.png)
![](https://imgp.golos.io/50x60t0/http://golosboard.com/@arcange/payout.png)
Поддержите мою работу в качестве делегата. Каждый голос важен. Спасибо !
![](https://img.golos.io/proxy/http://i.cubeupload.com/EUl6v7.png)