【问题标题】:faster InnoDB writes?更快的 InnoDB 写入?
【发布时间】:2012-11-14 10:19:15
【问题描述】:

我打算用全新的硬件替换旧服务器,但发生了一些奇怪的事情。

  • 旧机器AMD Athlon 64 X2 5600+ @ 1GHz,具有 2 GB RAM,运行 Debian 4.0 32bit strong> 和 RAID1 中的 2x380 GB(左右)硬盘
  • 新机器Intel i7-3770 @ 3.4GHz,具有 32 GB RAM,运行 Debian 6.0 64 位 strong> 在 RAID1 中使用 2x3TB 硬盘(6Gbps SATA,7200rpm)

在加载 SQL 转储(见下文)时,新服务器忙了大约 32 分钟!新安装的服务器无事可做。另一方面,服务器虽然忙于其他事情,却花费32%时间怎么可能?

两台机器都使用 Debian 最小镜像安装,然后根据需要安装软件包。

my.cnf settings of the old servernew server 都使用 innodb_file_per_tableinnodb_buffer_pool_size 在新服务器上要大得多(16 GB 对 0.5 GB)。

关于 SQL 转储的数据:

  • 加载一个全新的数据库 (CREATE DATABASE)
  • 16张桌子
  • 单个大表(大约 1.2M 行 / 240MB SQL 数据),速度很慢
  • 带有外键的 InnoDB
  • 转储使用LOCK TABLES "xxx" WRITE; ALTER TABLE "xxx" DISABLE KEYS;(由mysqldump生成)

任何想法如何加快这件事?

更新

我注意到旧机器在/var 上使用了一个专用的 50GB ext3 分区,而新机器在/home 上有一个 1TB ext4 根分区(包括/var)和一个 2TB ext4。在这两种情况下,MySQL 数据都位于/var/lib/mysql/

更新 2

显然是硬盘在缓慢处理小块:

# dd if=/dev/zero of=test bs=1024 count=100 oflag=direct,sync
102400 bytes (102 kB) copied, 2.49824 s, 41.0 kB/s

旧服务器在相同的测试中达到 1.1 MB/s

新服务器可以处理更大的块:

# dd if=/dev/zero of=test bs=1024k count=100 oflag=direct,sync
104857600 bytes (105 MB) copied, 7.11175 s, 14.7 MB/s

hdparm 表示写缓存在两个驱动器上。分区表对齐问题?见my partition table

【问题讨论】:

    标签: mysql performance mysqldump


    【解决方案1】:

    好的,我找到了原因,希望这对其他人有帮助。

    ext4 在该系统上启用了“障碍”,导致小型写入变得非常缓慢。这样的写入对于数据库文件来说是正常的。

    禁用障碍可提高性能,并且在大约 8 分钟内加载相同的 SQL 转储(快 4 倍)。

    mount -o remount,barrier=0 /
    

    禁用屏障会带来 fs 完整性的缺点,因此请先考虑一下...

    【讨论】:

      【解决方案2】:

      您的新配置文件末尾有这一行:

      !includedir /etc/mysql/conf.d/
      

      假设其中的文件与这些相同:https://github.com/biapy/howto.biapy.com/tree/master/mysql,这意味着它正在添加您可能想要查看的这些设置(以及其他设置):

      基础优化.cnf:

      log_bin = /var/log/mysql/mysql-bin.log
      sync_binlog = 1
      

      【讨论】:

      • 感谢您的回答。但是,包含目录只包含 Debian 标准 mysqld_safe_syslog.cnf,其中包含 [mysqld_safe] syslog,并且不会激活二进制日志记录。 /var/log/mysql 是那台机器上的一个空目录。
      • 您是否已从 10K/15K SCSI/SAS 驱动器切换到 7200RPM SATA 驱动器?这些机器有哪些 RAID 控制器?任一阵列上的写入缓存状态如何?新机器上是否还有其他东西可以同时写入磁盘?如果您的系统支持,请尝试命令 iotop。
      • 旧硬盘为 SAMSUNG HD401LJ (7200rpm SATA 300),新硬盘为三星 ST3000DM001-9YN1。两台机器都使用 Linux 软件 RAID。当不导入 SQL 转储时,机器完全处于空闲状态(CPU 99.8% 空闲,负载 0.01,根据 iotop 几乎没有磁盘 I/O)。 OTOH,old 机器的负载值通常为 1 到 3,CPU 空闲约为 75%。不知道如何查看写缓存状态..?
      • 运行 hdparm -W /dev/(你的驱动器在这里)。您可以使用 hdparm -W 1 /dev/... 或 hdparm -W 0 /dev/... 切换写入缓存,但无论如何它可能已经开启,我认为它不会导致性能下降。希望其他人有其他想法。
      • 写入缓存已开启:/dev/sda: write-caching = 1 (on)。请注意我在问题中的两个更新。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2011-10-14
      相关资源
      最近更新 更多