硬件和MariaDB之间是操作系统,并且可以在此级别进行许多优化。
1. 为MariaDB配置Linux
1.1 Linux内核设置
1.1.1 IO调度器
为了使数据库运行时获得最佳的IO性能,我们使用了noop调度程序。推荐的调度程序是noop和deadline。您可以使用以下方法检查调度程序设置:
# cat /sys/block/${DEVICE}/queue/scheduler
例如,它应该看起来像这样的输出:
# cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
您可以在此处找到有关Linux调度程序的详细说明:TPCC中的Linux调度程序(例如benchmark)。
http://www.mysqlperformanceblog.com/2009/01/30/linux-schedulers-in-tpcc-like-benchmark/
1.2 资源限制
1.2.1 配置打开文件限制
默认情况下,系统限制一个进程一次可以打开多少个打开的文件描述符。它具有软限制和硬限制。在许多系统上,软限制和硬限制均默认为1024。在活动数据库服务器上,很容易超过1024个打开文件描述符。因此,您可能需要增加软限制和硬限制。有几种方法可以这样做。
如果mysqld_safe用于启动mysqld,请参见mysqld_safe:配置打开文件限制中的说明。
https://mariadb.com/kb/en/mysqld_safe/#configuring-the-open-files-limit
[mysqld_safe]
open_files_limit=4294967295
如果systemd用于启动mysqld,请参阅systemd:配置打开文件数限制中的说明。
https://mariadb.com/kb/en/systemd/#configuring-the-open-files-limit
sudo tee /etc/systemd/system/mariadb.service.d/limitnofile.conf <<EOF
[Service]
LimitNOFILE=infinity
EOF
sudo systemctl daemon-reload
否则,您可以通过将以下行添加到/etc/security/limits.conf来设置用户帐户mysql的软限制和硬限制:
mysql soft nofile 65535
mysql hard nofile 65535
重新引导系统后,mysql用户应使用新的限制,并且用户的ulimit输出应如下所示:
$ ulimit -Sn
65535
$ ulimit -Hn
65535
1.2.2 配置核心文件大小
默认情况下,系统限制可以创建的核心文件的大小。它具有软限制和硬限制。在许多系统上,软限制默认为0。如果要启用核心转储,则可能需要增加该值。因此,您可能需要增加软限制和硬限制。有几种方法可以这样做。
如果mysqld_safe用于启动mysqld,请参见mysqld_safe上的说明:配置核心文件大小。
https://mariadb.com/kb/en/mysqld_safe/#configuring-the-core-file-size
[mysqld_safe]
core_file_size=unlimited
如果systemd用于启动mysqld,请参阅systemd:配置核心文件大小中的说明。
https://mariadb.com/kb/en/systemd/#configuring-the-core-file-size
sudo tee /etc/systemd/system/mariadb.service.d/limitcore.conf <<EOF
[Service]
LimitCORE=infinity
EOF
sudo systemctl daemon-reload
否则,您可以通过将以下行添加到/etc/security/limits.conf来设置用户帐户mysql的软限制和硬限制:
mysql soft core unlimited
mysql hard core unlimited
重新引导系统后,mysql用户应使用新的限制,并且用户的ulimit输出应如下所示:
$ ulimit -Sc
unlimited
$ ulimit -Hc
unlimited
2. 配置Swappiness
2.1 为什么要避免使用交换内存
显然,从磁盘访问交换内存比直接访问RAM要慢得多。这在数据库服务器上尤其糟糕,因为:
- MariaDB的内部算法假定内存不会交换,如果内存交换效率很低。一些算法旨在避免或延迟磁盘IO,并在可能的情况下使用内存 - 通过交换执行此操作可能比仅在磁盘上执行操作要差。
- 由于页面被主动交换入和交换出,交换首先增加了IO,而不是仅使用磁盘。即使旨在删除不再要存储在内存中的脏页(虽然旨在提高效率)之类的东西,在交换情况下也会花费更多的IO。
- 数据库锁的交换效率特别低。它们的设计旨在使其能够快速,频繁地获取和发布,并且暂停执行磁盘IO将严重影响其可用性。
避免交换的主要方法是确保您有足够的RAM供计算机上需要运行的所有进程使用。将系统变量设置得太高可能意味着服务器在负载不足时运行的内存不足,需要使用swap。因此,了解使用哪些设置以及这些设置如何影响服务器的内存使用至关重要。
2.2 在Linux上设置Swappiness
Linux有一个swappiness设置,该设置确定从RAM换出页面(内存块)到硬盘驱动器上预先配置的交换空间之间的平衡。
设置范围是0到100,值越小表示交换的可能性越小。默认值通常为60 - 您可以通过运行以下命令进行检查:
sysctl vm.swappiness
默认设置鼓励服务器使用交换。由于除了MariaDB进程外,数据库服务器上可能没有其他要交换的东西,因此您可能希望将其减少为零,以避免尽可能多地交换。您可以通过在sysctl.conf文件中添加一行来更改默认设置(通常在/etc/sysctl.conf中找到)。要将可交换性设置为零,请添加以下行:
vm.swappiness = 0
重新启动后通常会生效,但是您可以更改值而无需重新启动,如下所示:
sysctl -w vm.swappiness = 0
从RHEL 6.4开始,更积极地将swappiness设置为0可以避免掉出,这会增加在强大内存和I/O压力下杀死OOM的风险。
建议对数据库工作负载使用低交换率设置。对于MariaDB数据库,建议将swappiness设置为1。
vm.swappiness = 1
2.3 完全禁用交换内存
尽管有些人完全禁用交换,并且您当然想避免使用任何数据库进程,但谨慎地留一些交换空间,以至少在出现峰值时允许内核正常掉线。拥有紧急交换至少可以使您有一定的余地来杀死任何失控的进程。
3. 文件系统优化
3.1 哪个文件系统最好?
文件系统不是MariaDB性能最重要的方面。更重要的是可用的RAM,驱动器速度,系统变量设置(请参阅硬件优化和系统变量)。
https://mariadb.com/kb/en/hardware-optimization/
https://mariadb.com/kb/en/system-variables/
但是,在某些情况下,优化文件系统可能会产生明显的不同。当前,最好的Linux文件系统通常被认为是ext4,XFS和Btrfs。它们全部包含在主线Linux内核中,并且得到大多数Linux发行版的广泛支持。红帽虽然将Brtfs视为技术预览,但尚未准备好用于生产系统。
以下理论文件大小和文件系统大小限制适用于这三个文件系统:
ext4 XFS BRTFS
---------------------------------------
文件大小上限 16TB 8EB 16EB
文件系统大小上限 1EB 8EB 16EB
每个都有独特的特征,值得充分利用。
3.2 禁用访问时间
您不太可能需要在数据库服务器上记录文件访问时间,并且在禁用此选项的情况下挂载文件系统可以轻松提高性能。为此,请使用noatime选项。
如果要保留日志文件或其他系统文件的访问时间,可以将它们存储在单独的驱动器上。