九、优化案例——系统底层优化
磁盘读写
MySQL 执行增删改查需要读取数据页到 buffer pool ,SQL 执行过程中还会写入日志。读取数据页的操作属于随机读写,操作系统的磁盘 IOPS 和响应延迟直接影响数据库执行 crud 时随机读写的性能。而日志的写操作是基于操作系统磁盘的顺序读写操作,在 redo 日志文件尾部追加,所以这个顺序写的性能会很高。磁盘的性能会直接影响数据库的并发和性能,所以说数据库的性能和并发与操作系统的磁盘性能有很大关系,一般推荐数据库操作系统采用 SSD 固态硬盘。
Linux 存储原理
Linux 存储系统分为 vfs 层,文件系统层,page cache 层,通用 block 层,io 调度层,block 设备驱动层,block 设备层。
Linux 系统收到 io 请求后会把请求转发给相应的文件系统,然后文件系统会在 page cache 中查找是否有缓存,有就基于缓存操作,没有就把请求转发给通用 block 层,通用 block 把 io 请求转为 block io 请求,然后转发给 IO 调度层,IO 调度层 通过 CFQ 公平调度算法或者 deadline IO 调度算法决定优先执行哪个 io 请求,然后把请求交给 block 驱动层,block 驱动调用 block 设备执行 io 请求,io 请求完成后逐级返回请求响应。
关于 Linux 存储优化点就是 io 调度采用的算法。CFQ 公平算法会根据输入输出请求的地址进行排序,然后按次序执行,这可能导致一些 io 请求长时间等待。deadline 算法会根据请求的超时机制,让即将超时的请求优先执行。所以对于 Linux IO 调度算法的优化也是 MySQL 的一个优化点。
RAID 磁盘冗余阵列
服务器一般使用多块磁盘组成磁盘阵列,用 RAID 来管理这个阵列,RAID 可以实现数据的冗余,把一份数据在多个磁盘上备份。
RAID 架构一般有一个 RAID 卡,并拥有一个缓冲区用来提高磁盘的读写性能。RAID 磁盘架构通常会有一个锂电池来保障服务器断电时把缓冲区的数据写入磁盘,但是锂电池需要每隔一段时间充放电来提高电池的使用寿命。电池充放电会导致数据写磁盘时不经过缓冲区直接读写磁盘,从而会使数据库周期性的性能抖动。
对于 RAID 充放电的优化,可以选择使用电容来代替电池,但电容使用寿命低,也可以关闭自动充放电,在凌晨业务低峰期手动充放电,再就是充放电时不要把 write back 修改为 write through。
Linux 文件句柄
文件句柄是打开文件读取数据的唯一标识,文件句柄数的大小会限制进程建立连接、打开文件的数量,以限制对系统资源的占用,通常遇到异常 "too many open files" 就是文件句柄数超过系统限制。
建立数据库连接时,可能会遇到的异常 “ERROR 1040(HY000): Too many connections” 意思就是数据库连接太多了,无法再建立连接了。
因为数据库内部其实也是有一个连接池来保持与外部系统的连接,一般遇到这种情况首先是使用命令 "show variables like 'max_connections'" 检查 MySQL 的连接数,然后查看 my.cnf 配置文件配置的连接数。如果已建立的连接数达到配置的连接数,可以适当增加连接数,这个看机器的配置了。
如果已建立的连接数没有达到配置的连接数,这时需要看看 MySQL 的启动日志
Could not increase number of max_open_files to more than mysqld (request: 65535) Changed limits: max_connections: 214 (requested 2000) Changed limits: table_open_cache: 400 (requested 4096)
发现实际上最大连接数 max_connections 并不是配置的连接数,也就是说 MySQL 的最大连接数被限制在 214 ,这是因为 linux 的文件句柄数被限制了。
使用命令 ulimit -HSn 65535 把 Linux 文件句柄数修改为 65535,然后检查文件
cat /etc/security/limits.conf
cat /etc/rc.local
查看是否修改,再把 MySQL 的配置文件 my.cnf 的 max_connection 参数调整好,然后重启服务器、MySQL,最大文件句柄数生效、MySQL 最大连接数生效。
所以一般会使用 ulimit 命令来设置进程的资源使用,ulimit -a 查看资源使用。
core file size:表示进程崩溃时转储的文件大小。
max locked memory:表示最大锁定内存。
open file:表示最大可以打开的文件句柄。
max user processes:表示最大拥有的子进程数。
对 MySQL 所在的 Linux 系统的最大文件句柄数的优化也是 MySQL 优化的一项,一般设置最大文件句柄数为 65535
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)