
Добавление к предыдущим постам. Поставил на машину с SSD mysql сервер, потестил innodb. Параметры innodb дефолтные для 5.6. Поставил лишь
innodb_log_buffer_size=500M
innodb_buffer_pool_size=1G
Пробовал O_DIRECT, с ним немного медленнее, убрал. Такая же таблица на 2,5 млн, такие же дефолтные параметры sysbench, такое же железо (на самом деле тестил на датаноде, там всё равно нагрузки сейчас нет никакой).
Результаты:
[user@localhost ~]$ sysbench --num-threads=100 --max-requests=100000 --oltp-table-size=2500000 --mysql-host=my_host --mysql-db=my_test --mysql-user=test --db-driver=mysql --test=oltp run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 100
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 100000
Threads started!
Done.
OLTP test statistics:
queries performed:
read: 1400476
write: 500170
other: 200068
total: 2100714
transactions: 100034 (2210.84 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 1900646 (42005.92 per sec.)
other operations: 200068 (4421.68 per sec.)
Test execution summary:
total time: 45.2471s
total number of events: 100034
total time taken by event execution: 4522.8856
per-request statistics:
min: 3.19ms
avg: 45.21ms
max: 948.74ms
approx. 95 percentile: 94.73ms
Threads fairness:
events (avg/stddev): 1000.3400/23.82
execution time (avg/stddev): 45.2289/0.01
Как видно, даже немного лучше кластера. top на хосте показывает чуть более 395% нагрузки процессора.
Забыл в предыдущих хостах конфиги кластера.
my.cnf (только [mysqld], [client] и другое не привожу):
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
log-error=/var/log/mysqld/mysqld.53.err
expire_logs_days=10
datadir="/var/lib/mysql"
tmpdir=/tmp
ndbcluster=on
ndb-nodeid=53
ndb-connectstring=<ip адрес ndb_mgmd>:1186
ndb-cluster-connection-pool=4
#autocommit=off
ndb-force-send=0
ndb-use-exact-count=0
ndb-batch-size=64M
ndb-autoincrement-prefetch-sz=1024
default-storage-engine=ndbcluster
В некоторых манах советуют отключать автокоммит, чтобы он группировал транзакции. Видимо, это я не осилил (работало с моим конфигом ещё медленнее + глючило). Соответственно, ndb-batch-size и ndb-forse-send по идее игнорируются
config.ini:
[NDB_MGMD DEFAULT]
Portnumber=1186
[NDB_MGMD]
NodeId=49
HostName=<ip management ноды>
DataDir=/data/Cluster/49/
Portnumber=1186
[TCP DEFAULT]
SendBufferMemory=4M
ReceiveBufferMemory=4M
[NDBD DEFAULT]
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
BackupReportFrequency=10
MemReportFrequency=30
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
DataMemory=3600M
IndexMemory=750M
MaxNoOfTables=2048
MaxNoOfTriggers=2048
MaxNoOfOrderedIndexes=1024
MaxNoOfAttributes=2048
NoOfReplicas=2
StringMemory=25
DiskPageBufferMemory=64M
MaxNoOfConcurrentTransactions=16384
MaxNoOfConcurrentOperations=100000
BatchSizePerLocalScan=512
FragmentLogFileSize=256M
NoOfFragmentLogFiles=22 # 6xDataMemory [in MB]/(4 *FragmentLogFileSize [in MB]
RedoBuffer=32M
MaxNoOfExecutionThreads=4
StopOnError=false
LockPagesInMainMemory=1
SharedGlobalMemory=256M #default 128
TransactionDeadlockDetectionTimeout=52000
[NDBD]
NodeId=1
HostName=<ip первой датаноды>
DataDir=/data/Cluster/1/
[NDBD]
NodeId=2
HostName=<ip второй датаноды>
DataDir=/data/Cluster/2/
[MYSQLD DEFAULT]
[MYSQLD]
NodeId=53
HostName=<ip mysql сервера>
[MYSQLD]
[MYSQLD]
[MYSQLD]
Пустые секции mysql - для подключения в несколько потоков.
По I/O пока ничего не скажу, кроме того, что при тесте на один хост с innodb iotop показывает циферки побольше раза в 2 (около 40 M/S), чем при тесте кластера . Надеюсь, поставлю мониторинг датанод, можно будет посмотреть графики/статистику, не только с количеством записанного, но и с tps за всё время теста.
В итоге сейчас результаты примерно одинаковые, что для 1 innodb, что для кластера из 4х нод. При этом датаноды и по CPU, и по IO загружены примерно на половину возможного, а mysql серверы загружаются на полную.