Google Cloud SQL работает МЕДЛЕННО: экземпляр mysql с 10 ГБ ОЗУ в 20 раз медленнее, чем Macbook Pro с 125 МБ ОЗУ

Мы создали дамп нашей таблицы в соответствии с инструкциями Google Cloud SQL и импортировали ее в экземпляр Google Cloud SQL второго поколения.

Мы были очень взволнованы, увидев, как наши номера будут работать на «оборудовании Google».

После стресс-тестирования нашего приложения Rails с Apache ab и увеличения времени выполнения на 150 мс мы заметили, что ActiveRecord занимает от 30 до 50 мс больше, чем наш рабочий сервер (голое железо) на тех же страницах.

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

GOOGLE CLOUD SQL - db-n1-standard-4 (4vcpu and 15GB RAM)

1. Cold query

mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
|  3998050 |
+----------+
1 row in set (19.26 sec)

2. Repeat query

mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
|  3998050 |
+----------+
1 row in set (1.16 sec)

SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                          10.500000000000 |
+------------------------------------------+
1 row in set (0.00 sec)


Затем я могу повторить запрос несколько раз, и производительность останется прежней.

Выполнение того же запроса на моем macbook pro 2017 с точно таким же дампом:

MACBOOK PRO 2017

1. Cold query

mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
|  3998050 |
+----------+
1 row in set (1.51 sec)

2. Repeat query

mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
|  3998050 |
+----------+
1 row in set (0,51 sec)

SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                           0.125000000000 |
+------------------------------------------+
1 row in set (0,03 sec)



Что делает это еще более абсурдным, так это то, что, как вы можете видеть выше, я ничего не настраивал из своей установки mysql по умолчанию, поэтому на моем Macbook используется только 125 МБ ОЗУ, в то время как экземпляр Google Cloud имеет 10 ГБ ОЗУ. доступно.

Мы попытались увеличить размер экземпляра Google Cloud SQL до db-n1-highmen-8 (8vCPU с 52 ГБ оперативной памяти!) без повышения производительности (если мы уменьшим размер с db-n1-standard-4, мы увидим снижение производительности).

И последнее, но не менее важное: используя этот вопрос, мы можем подтвердить, что наша база данных имеет только 46 ГБ, но во время импорта использование хранилища в облачном sql google продолжало расти, пока не достигло абсурдных 74 ГБ... мы не знаем, связано ли это с двоичным ведением журнала ( который по умолчанию включен в Google Cloud SQL и выключен на моем локальном компьютере).

Итак... разве никто не использует Google Cloud sql на производстве? :)

ОБНОВИТЬ: мы использовали точно такой же дамп .sql и загрузили его в db.r4.large AWS RDS (тот же процессор / оперативная память) и получили стабильную производительность 0,50 с в запросе, и он также не потреблял более 46 ГБ в пример.

Бинлог виноват superuser.com/questions/848514/…

Hackerman 03.02.2019 14:28

@Hackerman нет, это не так. Мы отключили бинлоггинг (это простая галочка в консоли), и после перезагрузки вот такие результаты: Первый СЧЕТ (я называю это «холодным запросом»): 9,84 сек; другие подсчеты (попробовано> 10 раз с постоянными результатами): в среднем 1,14 секунды.

sandre89 03.02.2019 14:42

Эй, чувак, я испытываю то же самое. Любые решения? В моем случае я нахожусь на внешнем сервере с цифровым океаном, и я нахожу его очень медленным, когда подключаю свой облачный sql google к своему приложению.

Nico Zarris 04.02.2019 22:37

@NicoZarris, поскольку мы сравнивали AWS x Google Cloud, мы просто решили использовать AWS для ознакомления и не стали копать дальше (см. обновленный вопрос, в AWS у нас была оптимальная производительность прямо из коробки). Что очень плохо, так это то, что для Южной Америки стоимость полосы пропускания в AWS более чем в 2 раза выше, чем у GC.

sandre89 06.02.2019 12:48

Кроме того, облачный sql google для MySql по умолчанию использует репликацию GTID, что определенно может быть огромным фактором снижения производительности. cloud.google.com/sql/docs/mysql/1st-2nd-gen-differences

Raj 04.07.2019 07:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
8
5
4 092
1

Ответы 1

Сравните планы выполнения (предваряющие EXPLAIN), и вы, вероятно, обнаружите некоторые заметные различия в реализации, возникающие из-за различий в параметрах конфигурации, помимо размера пула буферов.

На выходных я столкнулся с аналогичными проблемами при настройке базы данных Postgres Cloud SQL с ~ 100 ГБ данных, отражающей локальную базу данных на моем macbook pro. Производительность была сопоставима с моей локальной базой данных для очень целенаправленных выборок с использованием индексов, но запросы, которые сканировали нетривиальные объемы данных, были в 2-5 раз медленнее.

Сравнивая результаты конфигурации SHOW ALL (кажется, SHOW VARIABLES в mysql) между локальными и облачными экземплярами, я заметил несколько различий, например, max_parallel_workers_per_gather = 0 в Cloud SQL против 2 в моем локальном экземпляре.

В случае select count(*)... параметр max_parallel_workers_per_gather > 0 позволяет использовать сбор результатов параллельных последовательных сканирований с использованием нескольких рабочих процессов; при нулевом значении двигатель должен выполнить одно последовательное сканирование. Для других запросов я заметил аналогичные тенденции, когда параллельные рабочие процессы использовались в моей локальной базе данных с меньшими затратами и более высокими скоростями, чем облачный экземпляр.

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

Другие вопросы по теме