Sysbench: Iinux vs FreeBSD. Опыты на тему: что «лучше для mysql?»

Всупление: Не холивара ради, уважаю и использую в своей работе как линуксы(CentOS, Debian), так и FreeBSD(8, 9, 10). Все началось с этого замечания на сайте https://www.freebsd.org/ru/features.html (кликабельно): freebsd.orgСорвами: «Бенчмарки показали, что FreeBSD обеспечивает вдвое большую производительность MySQL и PostgreSQL по сравнению с текущими системами Linux на 8-ядерных серверах«. Конечно же, «реклама — двигатель торговли», с 2008 года много времени утекло, существенно изменились как linux так и freebsd. Но… Вторым стимулом стало то, что последнее время не попадались на глаза исследования на эту тему, Почему?

Цель: Попытаться выяснить, ести ли какие преимущества использования одной системы относительно другой на серверах начального уровня для проектов с основной нагрузкой на mysql в наши дни. Рассматриваем только InnoDB и только случай, когда когда вся база помещается в память, что вобщем-то типично для очень большого количества проектов.

Собственно, опыты: Строился сервер под новый проект, было немного времени и большой интерес, почему бы и не сделать пару опытов? Итак, железо для опытов:

  • Мамка: Asus Socket 775 (О.Г. поправь, если ошибаюсь)
  • Проц: Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz (2400.13-MHz K8-class CPU)
  • Память: real memory  = 8589934592 (8192 MB)
  • Диск: <TOSHIBA DT01ACA100 MS2OA750> ATA-8 SATA 3.x device, 300.000MB/s
  1. Ставим линукс: Linux deb 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2
  2. sysbench 0.4.12
  3. MySQL: Server version: 5.5.49-0+deb8u1 (Debian)

Дальше тесты:

CPU: sysbench —test=cpu —cpu-max-prime=5000 run

Test execution summary:
    total time:                          7.7390s
    total number of events:              10000
    total time taken by event execution: 7.7377
    per-request statistics:
         min:                                  0.77ms
         avg:                                  0.77ms
         max:                                  1.21ms
         approx.  95 percentile:               0.78ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   7.7377/0.00

Память: sysbench —test=memory run

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (1897661.46 ops/sec)

102400.00 MB transferred (1853.19 MB/sec)


Test execution summary:
    total time:                          55.2562s
    total number of events:              104857600
    total time taken by event execution: 42.8010
    per-request statistics:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.06ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   42.8010/0.00

Файловые операции:
sysbench —num-threads=16 —test=fileio —file-total-size=3G —file-test-mode=prepare
sysbench —num-threads=16 —test=fileio —file-total-size=3G —file-test-mode=rndrw run

Running the test with following options:
Number of threads: 16

Extra file open flags: 0
128 files, 24Mb each
3Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Done.

Operations performed:  6022 Read, 4016 Write, 12810 Other = 22848 Total
Read 94.094Mb  Written 62.75Mb  Total transferred 156.84Mb  (4.945Mb/sec)
  316.48 Requests/sec executed

Test execution summary:
    total time:                          31.7174s
    total number of events:              10038
    total time taken by event execution: 9.8231
    per-request statistics:
         min:                                  0.01ms
         avg:                                  0.98ms
         max:                                136.80ms
         approx.  95 percentile:               0.09ms

Threads fairness:
    events (avg/stddev):           627.3750/117.67
    execution time (avg/stddev):   0.6139/0.16

Потоки: sysbench —num-threads=64 —test=threads —thread-yields=100 —thread-locks=2 run

Test execution summary:
    total time:                          1.2189s
    total number of events:              10000
    total time taken by event execution: 77.7296
    per-request statistics:
         min:                                  0.04ms
         avg:                                  7.77ms
         max:                                 46.40ms
         approx.  95 percentile:              23.78ms

Threads fairness:
    events (avg/stddev):           156.2500/14.65
    execution time (avg/stddev):   1.2145/0.00

Дальше — очередь MySQL. Нас интересует только InnoDB как основной вид хранилища. Берем с другого сервера более-менее настроенный конфиг MySQL (естественно, что тестировать на конфиге по-умолчанию не будем, это полный бред):

[mysqld]
user      = mysql
pid-file  = /var/run/mysqld/mysqld.pid
socket    = /var/run/mysqld/mysqld.sock
port      = 3306
basedir   = /usr
datadir   = /var/lib/mysql
tmpdir    = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 127.0.0.1

key_buffer         = 16M
max_allowed_packet = 16M
thread_stack       = 192K
thread_cache_size  = 8
myisam-recover     = BACKUP

query_cache_limit  = 1M
query_cache_size   = 16M

log_error = /var/log/mysql/error.log
# * InnoDB
innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 0
innodb_flush_method=O_DIRECT

Создаем базу, наполняем случайными данными: sysbench —test=oltp —mysql-table-engine=innodb —oltp-table-size=100000 —mysql-user=root —mysql-password=mypass —db-driver=mysql —test=oltp prepare
Убеждаемся, что база по размеру меньше innodb_buffer_pool_size, то есть, полностью поместится в память.
Собственно, тест: sysbench —num-threads=8 —max-requests=50000 —oltp-table-size=50000 —mysql-user=root —mysql-password=mypass —db-driver=mysql —test=oltp run

Мы не будем вникать в детали теста, нас будет интересовать только полное время выполнения теста: 829 сек.

Меняем в конфиге mysql значение параметра innodb_flush_log_at_trx_commit на 1, тот же тест повторяем 14 раз, пока не надоест, результаты сводим в табличку (ниже).

Сносим Debian, ставим FreeBSD

  • 10.3-RELEASE #0 r297264: Fri Mar 25 02:10:02 UTC 2016
  • sysbench 0.4.12
  • mysql Ver 14.14 Distrib 5.5.46

CPU: sysbench —test=cpu —cpu-max-prime=5000 run

Test execution summary:
    total time:                          8.6128s
    total number of events:              10000
    total time taken by event execution: 8.6105
    per-request statistics:
         min:                                  0.86ms
         avg:                                  0.86ms
         max:                                  0.87ms
         approx.  95 percentile:               0.87ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   8.6105/0.00

Память: sysbench —test=memory run

Test execution summary:
    total time:                          68.9416s
    total number of events:              104857600
    total time taken by event execution: 48.5759
    per-request statistics:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.18ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   48.5759/0.00

Файловые операции:
sysbench —num-threads=16 —test=fileio —file-total-size=3G —file-test-mode=prepare
sysbench —num-threads=16 —test=fileio —file-total-size=3G —file-test-mode=run

Operations performed:  6000 Read, 4000 Write, 12672 Other = 22672 Total
Read 93.75Mb  Written 62.5Mb  Total transferred 156.25Mb  (8.3672Mb/sec)
  535.50 Requests/sec executed

Test execution summary:
    total time:                          18.6740s
    total number of events:              10000
    total time taken by event execution: 11.4881
    per-request statistics:
         min:                                  0.01ms
         avg:                                  1.15ms
         max:                                196.41ms
         approx.  95 percentile:               0.81ms

Threads fairness:
    events (avg/stddev):           625.0000/78.87
    execution time (avg/stddev):   0.7180/0.23

Потоки: sysbench —num-threads=64 —test=threads —thread-yields=100 —thread-locks=2 run

sysbench --num-threads=64 --test=threads --thread-yields=100 --thread-locks=2 ru
Test execution summary:
    total time:                          1.7816s
    total number of events:              10000
    total time taken by event execution: 113.6721
    per-request statistics:
         min:                                  0.05ms
         avg:                                 11.37ms
         max:                                 59.41ms
         approx.  95 percentile:              29.12ms

Threads fairness:
    events (avg/stddev):           156.2500/15.96
    execution time (avg/stddev):   1.7761/0.00

Дальше mysql, конфиг тот-же, что и для Debian, поправлены пути:
sysbench —test=oltp —mysql-table-engine=innodb —oltp-table-size=100000 —mysql-user=root —mysql-password=110026 —db-driver=mysql —test=oltp prepare
sysbench —num-threads=8 —max-requests=50000 —mysql-user=root —mysql-password=110026 —db-driver=mysql —test=oltp run
Несколько раз, измеряем для innodb_flush_log_at_trx_commit равным как 0, так и 1.

Сводим вместе данные по CPU, памяти, диску, потокам, прводим к процентам рисуем диаграмму.image

Как видим, по всем основным параметрам Linux впереди.

Mysql: innodb_flush_log_at_trx_commit=1 — значение по умолчанию. Диагрвму рисовать нет смысла, значения и так очень наглядны. Время выполнения 50000 операций:
Debian — 829 сек
FreeBSD — 38 сек
То есть, раз в 20 быстрее на freebsd. Как это обьяснить? Не знаю.

Mysql: innodb_flush_log_at_trx_commit=0

№ п.п. Linux FreeBSD
1 38,8933 32,3349
2 38,2592 33,1916
3 38,2369 33,314
4 39,7874 33,1156
5 38,2978 33,2841
6 38,5683 33,1892
7 37,939 33,22
8 38,8933 32,3349
9 38,2592 32,8029
10 38,2369 32,608
11 39,7874 32,8395
12 38,2978 32,9741
13 38,5683 33,0311
14 37,939 33,0596
Среднее 38,5688 32,9499
Среднеквадратич. отклонение 0,59048 0,32660

image1

Выводы: Как видите, математически достоверно что в данном конкретном случае, при innodb_flush_log_at_trx_commit=0, Mysql на FreeBSD работает, примерно, на 17% быстрее. При innodb_flush_log_at_trx_commit=1 разрыв значительно возрастает.

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

Запись опубликована в рубрике Записки админа. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *