• 22. 磁盘I/O问题


    1. 磁盘I/O问题

    作为应用系统的持久化层,不管数据库采取了什么样的 Cache 机制,但数据库最终总是要将数据储存到可以长久保存的I/O设备──磁盘上,但磁盘的存取速度显然要比CPU、RAM 的速度慢很多,因此,对于比较大的数据库,磁盘 I/O 一般总会成为数据库的一个性能瓶颈!

    我们前面提到的 SQL 优化、数据库对象优化、数据库参数优化,以及应用程序优化等,大部分都是想通过减少或延缓磁盘读写来减轻磁盘 I/O 的压力及其对性能的影响。解决磁盘 I/O 问题,减少或延缓磁盘操作肯定是一个重要方面,但磁盘 I/O 是不可避免的,因此,增强磁盘 I/O 本身的性能和吞吐量也是一个重要方面。

    1.1 使用磁盘阵列

    1.2 使用Symbolic Links分布I/O

    MySQL 的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数 datadir 定义的目录下。这样如果不使用 RAID 或逻辑卷,所有的表都存放在一个磁盘设备上,无法发挥多磁盘并行读写的优势!在这种情况下,我们就可以利用操作系统的符号连接(Symbolic Links)将不同的数据库或表、索引指向不同的物理磁盘,从而达到分布磁盘 I/O 的目的。

    (1)将一个数据库指向其他物理磁盘

    (2)将MyISAM(其他存储引擎的表不支持)表的数据文件或索引文件指向其他物理磁盘。

    (3)在Windows下使用符号连接。

    1.3 禁止操作系统更新文件的atime属性

    atime 是 Linux/UNIX 系统下的一个文件属性,每当读取文件时,操作系统都会将读操作发生的时间回写到磁盘上。对于读写频繁的数据库文件来说,记录文件的访问时间一般没有任何用处,却会增加磁盘系统的负担,影响 I/O 的性能!因此,可以通过设置文件系统的 mount属性,阻止操作系统写 atime 信息,以减轻磁盘 I/O 的负担。

    1.4 用裸设备(Raw Device)存放InnoDB的共享表空间

    MyISAM 存储引擎有自己的索引缓存机制,但数据文件的读写完全依赖于操作系统,操作系统磁盘 I/O 缓存对 MyISAM 表的存取很重要。但 InnoDB 存储引擎与 MyISAM 不同,它采用类似 Oracle 的数据缓存机制来 Cache 索引和数据,操作系统的磁盘 I/O 缓存对其性能不仅没有帮助,甚至还有反作用。因此,在 InnoDB 缓存充足的情况下,可以考虑使用 Raw Device 来存放 InnoDB 共享表空间。

  • 相关阅读:
    【AtCoder】ARC075
    【BZOJ】3022: [Balkan2012]The Best Teams
    【Codeforces】Gym100633 D. LWDB
    MIME协议在邮件中的应用详解
    struts返回json数据
    mysql-存储过程(转载)
    安卓OKhttp请求封装
    安卓动态添加碎片
    通过163smtp服务器向各大邮箱发送邮件(SOCKET编程)
    安卓原生与hml交互(WebView基础)
  • 原文地址:https://www.cnblogs.com/wubug/p/13526443.html
Copyright © 2020-2023  润新知