If you follow the best practices for database design and the
tuning techniques for SQL operations, but your database is still
slowed by heavy disk I/O activity, explore these low-level
techniques related to disk I/O. If the Unix
top tool or the Windows Task Manager shows
that the CPU usage percentage with your workload is less than
70%, your workload is probably disk-bound.
When table data is cached in the InnoDB
buffer pool, it can be accessed repeatedly by queries
without requiring any disk I/O. Specify the size of the
buffer pool with the
innodb_buffer_pool_size
option. This memory area is important enough that it is
typically recommended that
innodb_buffer_pool_size is
configured to 50 to 75 percent of system memory. For more
information see, Section 8.12.4.1, “How MySQL Uses Memory”.
In some versions of GNU/Linux and Unix, flushing files to
disk with the Unix fsync() call (which
InnoDB uses by default) and similar
methods is surprisingly slow. If database write performance
is an issue, conduct benchmarks with the
innodb_flush_method
parameter set to O_DSYNC.
When using the InnoDB storage engine on
Solaris 10 for x86_64 architecture (AMD Opteron), use direct
I/O for InnoDB-related files, to avoid
degradation of InnoDB performance. To use
direct I/O for an entire UFS file system used for storing
InnoDB-related files, mount it with the
forcedirectio option; see
mount_ufs(1M). (The default on Solaris
10/x86_64 is not to use this option.)
To apply direct I/O only to InnoDB file
operations rather than the whole file system, set
innodb_flush_method =
O_DIRECT. With this setting,
InnoDB calls
directio() instead of
fcntl() for I/O to data files (not for
I/O to log files).
When using the InnoDB storage engine with
a large
innodb_buffer_pool_size
value on any release of Solaris 2.6 and up and any platform
(sparc/x86/x64/amd64), conduct benchmarks with
InnoDB data files and log files on raw
devices or on a separate direct I/O UFS file system, using
the forcedirectio mount option as
described earlier. (It is necessary to use the mount option
rather than setting
innodb_flush_method if you
want direct I/O for the log files.) Users of the Veritas
file system VxFS should use the
convosync=direct mount option.
Do not place other MySQL data files, such as those for
MyISAM tables, on a direct I/O file
system. Executables or libraries must
not be placed on a direct I/O file system.
If you have additional storage devices available to set up a RAID configuration or symbolic links to different disks, Section 8.12.2, “Optimizing Disk I/O” for additional low-level I/O tips.
If throughput drops periodically because of
InnoDB
checkpoint
operations, consider increasing the value of the
innodb_io_capacity
configuration option. Higher values cause more frequent
flushing, avoiding the
backlog of work that can cause dips in throughput.
If the system is not falling behind with
InnoDB
flushing operations,
consider lowering the value of the
innodb_io_capacity
configuration option. Typically, you keep this option value
as low as practical, but not so low that it causes periodic
drops in throughput as mentioned in the preceding bullet. In
a typical scenario where you could lower the option value,
you might see a combination like this in the output from
SHOW ENGINE
INNODB STATUS:
History list length low, below a few thousand.
Insert buffer merges close to rows inserted.
Modified pages in buffer pool consistently well below
innodb_max_dirty_pages_pct
of the buffer pool. (Measure at a time when the server
is not doing bulk inserts; it is normal during bulk
inserts for the modified pages percentage to rise
significantly.)
Log sequence number - Last checkpoint
is at less than 7/8 or ideally less than 6/8 of the
total size of the InnoDB
log files.
When using the InnoDB table
compression feature,
images of re-compressed
pages are written to the
redo log when changes
are made to compressed data. This behavior is controlled by
innodb_log_compressed_pages,
which is enabled by default to prevent corruption that can
occur if a different version of the zlib
compression algorithm is used during recovery. If you are
certain that the zlib version will not
change, disable
innodb_log_compressed_pages
to reduce redo log generation for workloads that modify
compressed data.
Other InnoDB configuration options to
consider when tuning I/O-bound workloads include
innodb_adaptive_flushing,
innodb_change_buffering,
innodb_log_buffer_size,
innodb_log_file_size,
innodb_max_dirty_pages_pct,
innodb_max_purge_lag,
innodb_open_files,
innodb_random_read_ahead,
innodb_read_ahead_threshold,
innodb_read_io_threads,
innodb_rollback_segments,
innodb_write_io_threads,
and sync_binlog.