Есть 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.
Какую файловую систему использует ваш хост Synology? Если это не то же самое, что ваш контейнер Docker, вы можете наблюдать потерю производительности из-за преобразования файловой системы.
@zsolt: спасибо, я поделился журналом контейнера и информацией о докере, а также добавил информацию об ОС. Я не использовал docker compose, я просто вытащил официальный контейнер mariadb с помощью графического интерфейса приложения Synology Docker и создал из него контейнер. Я не уверен, какие команды вы хотели бы видеть. SQL-запросы?
@sobek: Хост Synology использует файловую систему btrfs. Как я могу проверить, какую файловую систему использует контейнер? Разве это не всегда то же самое, что и файловая система хоста?
Как у вас есть версии 10.6.5 и 10.3.14 в журнале вашего контейнера? Какую версию вы на самом деле измеряете нативной и контейнерной? Пожалуйста, посмотрите на использование версии 10.6.11, есть несколько существенных исправлений . Вы сравниваете это с Synology MARIADB10{.3.32}. Возможна ли версия, подобная сравнению?
Я понятия не имею, что делает 10.3.14 в файле журнала. :-D Контейнер 10.6.5 (и сразу обновлю до последней), "родной" (упакованный) 10.3.32. (Synology обновляет свои пакеты довольно редко.) Таким образом, чем новее, тем медленнее.
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.
Или это может быть что-то совершенно другое, требующее:
Большое спасибо! «innodb_flush_method=fsync» сделал свое дело, теперь контейнерная версия даже немного быстрее нативной (упакованной)! Остался один вопрос: вы упомянули это решение «как обходной путь» и упомянули «innodb_buffer_pool_size» и «innodb_log_file_size». Должен ли я оставить все как сейчас, или я должен поиграть с «innodb_buffer_pool_size» и «innodb_log_file_size»? Если да, то каковы рекомендуемые значения для них? Спасибо еще раз!
Да, оставить все как есть. В innodb_buffer_pool_size, в show global status like 'innodb_buffer_pool_read%', сравните "чтения" / "read_requests", процент должен приблизиться к <% 1 после разумного времени безотказной работы. На innodb_log_file_size, зависит от объема записи, где-то должен быть существующий ответ. Задайте новый вопрос, если он не ясен.
Пожалуйста, поделитесь файлом Dockerfile и командами, которые вы ввели, а также журналами, версией docker, версией docker compose, версией ОС. Используйте кнопку редактирования на вашем вопросе, чтобы обновить его.