【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)(一)https://developer.aliyun.com/article/1471062
建议将操作系统和数据分开
"将操作系统和数据分开,既在逻辑上也在物理上进行分离" 这句话的意思是为了获得最佳性能,建议将操作系统和数据库的数据存储位置分开。
在逻辑上分离意味着,操作系统和数据库应该使用不同的目录或分区进行存储。这样可以确保操作系统的文件和数据库的数据文件分开管理,避免混淆和冲突。
在物理上分离意味着,可以将操作系统和数据库安装在不同的物理硬盘上。这样做可以避免操作系统和数据库之间共享磁盘资源导致的性能瓶颈,并提高数据库的读写速度。
通过将操作系统和数据分开,在逻辑和物理上进行分离,可以提高系统的整体性能和灵活性。这种配置使得操作系统和数据库各自专注于其特定的任务,减少了资源竞争和冲突,提升了系统的稳定性和响应能力。
文件系统层优化
调整磁盘Cache mode
理解"调整磁盘Cache mode,启用WCE=1(Write Cache Enable),RCD=0(Read Cache Disable)模式"之前,让我们先了解一下磁盘的缓存。
读写磁盘缓存
磁盘缓存是一种临时存储机制,用于加快磁盘的读写速度。它主要包括读缓存和写缓存。
- 读缓存(Read Cache)存储最近读取的数据块,当再次访问相同数据时,可以直接从缓存中读取,而不需要再次从磁盘读取数据,提高了读取速度。
- 写缓存(Write Cache)存储要写入磁盘的数据,当应用程序进行写操作时,数据首先被写入缓存中,然后由磁盘控制器异步地将数据写入磁盘。这可以显著提高写入速度。
解析命令 "sdparm -s WCE=1,RCD=0 -S /dev/sdb":
- "sdparm" 是一个用于设置磁盘参数的命令行实用工具。
- "-s WCE=1,RCD=0" 标志将WCE(Write Cache Enable)设置为1(启用写缓存),将RCD(Read Cache Disable)设置为0(禁用读缓存)。
- "-S /dev/sdb" 标志指定要应用这些参数的磁盘,这里是/dev/sdb。
状态值解析
- 通过将WCE设置为1,我们启用了磁盘的写缓存功能。这意味着写操作将首先被写入磁盘缓存,然后由磁盘控制器异步地将数据写入实际磁盘。这可以显著提高写入性能,但也带来了一定的数据丢失风险,因为缓存中的数据尚未被持久化到磁盘。
- 通过将RCD设置为0,我们禁用了磁盘的读缓存功能。这意味着每次进行读取操作时,数据都将直接从磁盘读取,而不会使用读取缓存。这样可以确保读取到的数据是最新的,而不是读取到了缓存中旧的数据。
注意,这些参数的设置可能因磁盘型号和驱动程序而异,因此在应用该命令之前,请确保对应硬件和驱动程序支持这些参数设置。
采用Linux I/O scheduler算法deadline
Linux中的I/O调度器是用来管理和调度磁盘I/O操作的算法。其中,deadline是一种常用的I/O调度算法。
deadline算法
deadline算法的主要目标是通过合理分配磁盘带宽,提高磁盘访问的响应时间和性能。它在处理I/O请求时,将读写请求分成两个队列,分别用于读取和写入操作。它采用了三个重要参数来控制调度行为:
- read_expire(读取超时时间):它定义了一个读取请求在队列中可以等待的最长时间。当读取请求超过这个时间时,它会被放入写入队列以提高响应时间。一般建议将read_expire设置为write_expire的一半。
- write_expire(写入超时时间):它定义了一个写入请求在队列中可以等待的最长时间。当写入请求超过这个时间时,它会被强制执行,以保证写入操作的及时性。
- fifo_batch(批量处理请求数):它定义了一次性处理的最大请求数量。当队列中达到fifo_batch设置的请求数时,调度器会将这些请求作为一个批次处理,以提高效率。
过期时间参数调优
通过设置这些参数,可以根据实际需求来调整磁盘I/O的调度行为。对于CentOS Linux系统,建议将read_expire设置为write_expire的一半,以平衡读取和写入操作的响应时间。
你可以使用以下命令来设置deadline调度器的参数:
bash
复制代码
echo 500 >/sys/block/sdb/queue/iosched/read_expire echo 1000 >/sys/block/sdb/queue/iosched/write_expire
以上命令将read_expire设置为500毫秒,write_expire设置为1000毫秒。你也可以根据具体情况进行自定义设置。通过调整deadline调度算法的参数,可以优化磁盘I/O性能,提高系统的响应速度和效率。
采用xfs文件系统
如果你使用XFS文件系统,并且希望进行高性能设置,以下是一些调整XFS文件系统日志和缓冲变量的建议:
调整日志大小
日志是XFS文件系统用于记录文件系统操作的关键组成部分。增加日志大小可以提高系统的写入性能和吞吐量。通过以下命令可以调整日志大小(以512字节块为单位):
bash
复制代码
sudo xfs_admin -L <log_size> /dev/<device>
其中,是期望的日志大小,
是XFS文件系统所在的设备名称。
调整日志存储位置
XFS文件系统的日志存储在文件系统的起始扇区。如果你的磁盘布局使得起始扇区被频繁访问,你可以将日志存储在其他位置来减少争用。可以使用以下命令将日志存储在指定块设备上:
bash
复制代码
sudo xfs_admin -J device=/dev/<journal_device> /dev/<filesystem_device>
其中,是用于存储日志的设备名称,
是XFS文件系统所在的设备名称。
调整日志和数据缓冲区
XFS使用日志和数据缓冲区来提高性能。你可以通过以下方法调整这些缓冲区的大小:
调整日志缓冲区大小
编辑/etc/sysctl.conf文件,在末尾添加以下行,并重新加载sysctl配置:
bash
复制代码
fs.xfs.logbufs=<num_log_buffers>
其中, 是期望的日志缓冲区数目。增加日志缓冲区的大小可以提高写入性能。
调整数据缓冲区大小
编辑/etc/sysctl.conf文件,在末尾添加以下行,并重新加载sysctl配置:
bash
复制代码
vm.dirty_background_bytes=<background_bytes> vm.dirty_bytes=<dirty_bytes>
其中,是系统进程在触发后台写入操作之前保持的脏数据大小(单位:字节),
是系统进程在触发强制写入操作前可以累积的脏数据大小(单位:字节)。增加数据缓冲区的大小可以提高写入性能。
优化TCP协议栈
这些配置参数是用来优化TCP连接性能的。我们逐一解释它们的作用:
优化TCP连接层面
net.ipv4.tcp_tw_recycle=1
:启用TCP连接的快速回收,即允许在TIME_WAIT状态下的连接被立即回收重用。这可以减少服务器上处于TIME_WAIT状态的连接数量,提高TCP连接的效率。net.ipv4.tcp_tw_reuse=1
:启用TCP连接的端口复用,即允许服务器上处于TIME_WAIT状态的本地端口被立即重用。这样可以避免端口耗尽的问题,提高系统对新连接的支持能力。
优化TCP连接时间
net.ipv4.tcp_fin_timeout=2
:指定了处于FIN-WAIT-2状态的连接最长的保持时间,控制了关闭连接的速度。通过减少这个时间,系统可以更快地处理更多的连接。net.ipv4.tcp_keepalive_time=600
:指定了TCP的Keepalive发送间隔时间。Keepalive机制用于检测连接是否存活,通过减少检测时间,系统可以更快地释放闲置连接资源。net.ipv4.tcp_max_syn_backlog=16384
:指定了系统支持的最大SYN半连接数。SYN半连接是TCP三次握手中的第一次握手,通过增加这个数值,系统可以处理更多的连接请求。
调整连接重试
net.ipv4.tcp_synack_retries=1
、net.ipv4.tcp_sync_retries=1
:指定了TCP连接建立过程中的SYN包重试次数,减少重试次数可以加速连接建立的速度。
提升连接范围和数量
net.ipv4.ip_local_prot_range=450065535
:指定了系统可用的本地端口范围。通过增大这个范围,系统可以支持更多的并发连接。
扩展优化方向
net.ipv4.tcp_timestamps = 0
:将TCP时间戳功能禁用。TCP时间戳用于在网络中识别重复包和计算往返时间(RTT)。禁用时间戳可以减少对服务器的计算负担,但也可能影响某些特定的网络应用。net.ipv4.tcp_max_orphans = 3276800
:指定了系统在没有相关的socket文件句柄的情况下所能持有的TCP套接字数量的最大值。TCP套接字是在TIME_WAIT状态下的连接,该参数可以控制套接字的最大数量,避免资源耗尽问题。net.ipv4.tcp_max_tw_buckets = 360000
:指定了系统为处理处于TIME_WAIT状态的连接所维护的最大套接字桶的数量。套接字桶用于存储已关闭的连接,以便在TIME_WAIT状态下等待一段时间以确保网络上的数据已传输完毕。这个参数可以控制系统处理TIME_WAIT连接的效率和数量。
注意,修改这些参数可能会对系统性能和网络连接产生影响。在进行修改之前,请确保了解其含义和潜在的影响,并在进行修改之前备份重要的配置文件,并进行测试。
网络优化
net.core.rmem_max=16777216
:设置了最大的套接字读缓冲区大小。套接字读缓冲区用于存储从网络接收的数据。较大的缓冲区大小可以提高系统对数据接收的效率和吞吐量。这里设置为16MB。net.core.wmem_max=16777216
:设置了最大的套接字写缓冲区大小。套接字写缓冲区用于存储将要发送到网络的数据。较大的缓冲区大小可以提高系统对数据发送的效率和吞吐量。这里设置为16MB。net.core.wmem_default=8388608
:设置了默认的套接字写缓冲区大小。这个值是新创建的套接字写缓冲区的初始大小。这里设置为8MB。net.core.rmem_default=8388608
:设置了默认的套接字读缓冲区大小。这个值是新创建的套接字读缓冲区的初始大小。这里设置为8MB。net.ipv4.tcp_rmem=4096 87380 16777216
:设置了TCP套接字的读缓冲区大小的参数。它是一个由三个值组成的数组,分别表示最小缓冲区大小、默认缓冲区大小和最大缓冲区大小。在这里,最小缓冲区大小被设置为4KB,默认缓冲区大小为87.38KB,最大缓冲区大小为16MB。net.ipv4.tcp_wmem=4096 65536 16777216
:设置了TCP套接字的写缓冲区大小的参数。与tcp_rmem类似,这里最小缓冲区大小为4KB,默认缓冲区大小为64KB,最大缓冲区大小为16MB。net.ipv4.tcp_mem=94500000 915000000927000000
:设置了Linux autotuning TCP缓冲区大小的参数。这个参数指定了当前系统中所有TCP缓冲区的最小值、默认值和最大值。在这里,最小值为94.5MB,默认值为915MB,最大值为927MB。这个参数可以让系统根据当前网络环境动态调整TCP缓冲区的大小。net.core.netdev_max_backlog=3000
:设置了网络设备接收队列的最大长度。这个参数指定了在网络接口上等待处理的传入数据包的最大数量。较大的队列长度可以缓解瞬时的网络流量高峰。这里设置为3000。
这些配置旨在优化系统的套接字缓冲区大小、TCP接收/发送缓冲区以及网络设备接收队列长度。通过适当调整这些参数,可以提高系统的网络性能和吞吐量。请注意,在进行修改之前,请确保了解其含义和潜在的影响,并在进行修改之前备份重要的配置文件,并进行测试。