Почему MariaDB в Docker работает намного медленнее, чем «родной» пакет MariaDB на том же компьютере Synology?

Есть Synology DS1621xs+ (с SSD-кэшем NVMe и 24 ГБ ОЗУ). ОС: Synology DSM 7.1 Файловая система: btrfs Версия докера: 20.10.3

На этой машине работает сервер MariaDB10 на Docker.

Идентичная база данных работает в «родном» пакете Synology MariaDB10 на том же компьютере. (Сброшено и скопировано из экземпляра Docker.)

Запросы к базе данных «родного» пакета MariaDB10 выполняются намного быстрее, чем к экземпляру докера. Разница как минимум в 2,5 раза, а по некоторым запросам и в 20 раз.

В чем может быть причина такой огромной разницы в производительности, почему запросы в Docker выполняются медленнее, чем в версии пакета Synology для MariaDB?

Информация о докере:

Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 10
  Running: 7
  Paused: 0
  Stopped: 3
 Images: 36
 Server Version: 20.10.3
 Storage Driver: btrfs
  Build Version: Btrfs v4.0
  Library Version: 101
 Logging Driver: db
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs db fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3fa00912415f3e9c6f82dd72119179d599efd13b
 runc version: 31cc25f16f5eba4d0f53e35374532873744f4b31
 init version: ed96d00 (expected: de40ad0)
 Security Options:
  apparmor
 Kernel Version: 4.4.180+
 Operating System:  (containerized)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 23.25GiB
 Name: NAS
 ID: ZLGI:KUWA:HOGC:3J6W:B6NJ:CZLJ:ZQP2:HAG5:3DP6:OEPX:5WRW:IHAJ
 Docker Root Dir: /volume2/@docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No kernel memory TCP limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
WARNING: No blkio weight support
WARNING: No blkio weight_device support
WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support
`

Журнал контейнера MariaDB:

2022-11-19T08:55:19.209130033Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Buffer pool(s) load completed at 221119  9:55:19
2022-11-19T08:55:19.174115217Z  stdout  Version: '10.6.5-MariaDB-1:10.6.5+maria~focal'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
2022-11-19T08:55:19.174011946Z  stdout  2022-11-19  9:55:19 0 [Note] mysqld: ready for connections.
2022-11-19T08:55:19.167072919Z  stdout  2022-11-19  9:55:19 0 [Warning] 'proxies_priv' entry '@% root@mariadb-copy' ignored in --skip-name-resolve mode.
2022-11-19T08:55:19.163349561Z  stdout  2022-11-19  9:55:19 0 [Note] Server socket created on IP: '::'.
2022-11-19T08:55:19.163211778Z  stdout  2022-11-19  9:55:19 0 [Note] Server socket created on IP: '0.0.0.0'.
2022-11-19T08:55:19.161820288Z  stdout  2022-11-19  9:55:19 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work.
2022-11-19T08:55:19.149901116Z  stdout  2022-11-19  9:55:19 0 [Note] Plugin 'FEEDBACK' is disabled.
2022-11-19T08:55:19.149840357Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2022-11-19T08:55:19.149391807Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: 10.6.5 started; log sequence number 3282096825; transaction id 7204
2022-11-19T08:55:19.148296829Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2022-11-19T08:55:19.148223400Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2022-11-19T08:55:19.148147151Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2022-11-19T08:55:19.147243337Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: 128 rollback segments are active.
2022-11-19T08:55:19.086673922Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Completed initialization of buffer pool
2022-11-19T08:55:19.085986215Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728
2022-11-19T08:55:19.085469623Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Using Linux native AIO
2022-11-19T08:55:19.068551244Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
2022-11-19T08:55:19.068528556Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Number of pools: 1
2022-11-19T08:55:19.068487467Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Using transactional memory
2022-11-19T08:55:19.068374374Z  stdout  2022-11-19  9:55:19 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2022-11-19T08:55:19.049836283Z  stdout  2022-11-19  9:55:19 0 [Note] mysqld (server 10.6.5-MariaDB-1:10.6.5+maria~focal) starting as process 1 ...
2022-11-19T08:55:18.900158637Z  stdout  2022-11-19 09:55:18+01:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.3.14+maria~bionic started.
2022-11-19T08:55:18.892594609Z  stdout  2022-11-19 09:55:18+01:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-11-19T08:55:18.738312960Z  stdout  2022-11-19 09:55:18+01:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.3.14+maria~bionic started.

Пожалуйста, поделитесь файлом Dockerfile и командами, которые вы ввели, а также журналами, версией docker, версией docker compose, версией ОС. Используйте кнопку редактирования на вашем вопросе, чтобы обновить его.

zsolt 19.11.2022 11:58

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

sobek 19.11.2022 12:03

@zsolt: спасибо, я поделился журналом контейнера и информацией о докере, а также добавил информацию об ОС. Я не использовал docker compose, я просто вытащил официальный контейнер mariadb с помощью графического интерфейса приложения Synology Docker и создал из него контейнер. Я не уверен, какие команды вы хотели бы видеть. SQL-запросы?

David P. 19.11.2022 12:54

@sobek: Хост Synology использует файловую систему btrfs. Как я могу проверить, какую файловую систему использует контейнер? Разве это не всегда то же самое, что и файловая система хоста?

David P. 19.11.2022 12:56

Как у вас есть версии 10.6.5 и 10.3.14 в журнале вашего контейнера? Какую версию вы на самом деле измеряете нативной и контейнерной? Пожалуйста, посмотрите на использование версии 10.6.11, есть несколько существенных исправлений . Вы сравниваете это с Synology MARIADB10{.3.32}. Возможна ли версия, подобная сравнению?

danblack 19.11.2022 22:25

Я понятия не имею, что делает 10.3.14 в файле журнала. :-D Контейнер 10.6.5 (и сразу обновлю до последней), "родной" (упакованный) 10.3.32. (Synology обновляет свои пакеты довольно редко.) Таким образом, чем новее, тем медленнее.

David P. 19.11.2022 23:23
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
6
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MariaDB изменила innodb_flush_method=O_DIRECT в версии 10.6, чтобы повысить производительность. Таким образом, MariaDB-10.6 гораздо больше зависит от innodb_buffer_pool_size и innodb_log_file_size для повышения производительности чтения/записи.

В качестве обходного пути протестируйте 10.6 с помощью innodb_flush_method=fsync. btrfs значительно новее, чем сегодня, чем в ядре 4.4.0, поэтому, возможно, его пути O_DIRECT не были такими эффективными в 4.4.0.

Это также может быть 🔁 MDEV-29967 с неработающим линейным чтением, которое мы прилагаем все усилия, чтобы исправить его до следующего релиза.

Также может быть статистика 10.6 отличается попробуйте пересчитать с помощью ANALYZE TABLES.

В этой ссылке есть пара ссылок/предложений btrfs.

Или это может быть что-то совершенно другое, требующее:

  • тщательное измерение и разбивка отдельных запросов и их выполнение.
  • устранение локальной среды (запуск версии 10.3 в контейнере той же версии/конфигурации, что и локальный пакет).

Большое спасибо! «innodb_flush_method=fsync» сделал свое дело, теперь контейнерная версия даже немного быстрее нативной (упакованной)! Остался один вопрос: вы упомянули это решение «как обходной путь» и упомянули «innodb_buffer_pool_size» и «innodb_log_file_size». Должен ли я оставить все как сейчас, или я должен поиграть с «innodb_buffer_pool_size» и «innodb_log_file_size»? Если да, то каковы рекомендуемые значения для них? Спасибо еще раз!

David P. 22.11.2022 00:28

Да, оставить все как есть. В innodb_buffer_pool_size, в show global status like 'innodb_buffer_pool_read%', сравните "чтения" / "read_requests", процент должен приблизиться к <% 1 после разумного времени безотказной работы. На innodb_log_file_size, зависит от объема записи, где-то должен быть существующий ответ. Задайте новый вопрос, если он не ясен.

danblack 22.11.2022 01:50

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