分类归档: Database

Linux 上常见的 IO 基准测试工具比较

经常要对一些新存储系统进行 I/O Benchmark 测试,每次测试又有可能针对不同的目的,但基本也都是围绕数据库转悠,心血来潮,对几个常见的工具做个比较。

IO_benchmarks_compare.png
(点击查看全图)

要强调的几点:
ORION –Oracle I/O Numbers Calibration Tool 还是比较全面的针对数据库应用的 IO 测试工具。现在 Oracle 发布了不少平台的移植版本。该工具也比较好用。

数据库应用必需要考虑异步 I/O 的因素,否则结果会有很大偏差,当然如果只测试存储能力的话,到可以忽略。AIO 压力测试可以考虑以下 AIO-Stress

Unix 命令 dd 虽然很土,但还是一个测试 I/O 的基本手段和方法.有的时候即使没别的工具只用它也能发现很多问题。另外一个需要注意的就是字符设备和块设备的差别啦。更新: 就当我说得是 GNU dd 吧,谢谢下面留言的朋友。

有些工具因为用过很久了,记忆难免有问题,表格中会有误导。仅供参考。今天太累,等有空继续补充内容。

EOF
BTW: 我收集的关于 Benchmark 的书签 内容。

补充工具:VDbench 是跨平台的,也可以尝试一下。

Oracle 技术杂志电子版

OracleMag_cover.gif

Oracle 正式出版的技术杂志还是值得一看的。这个杂志现在也有了电子版的了,我连续收到两期了,制作得很精致。一样是PDF ,你说人家做的咋这么好呢?

这一期的杂志地址:
点击观看或者下载 PDF 版本的。

直接下载PDF(在微软共享文件夹上)

EOF

从 MySQL 迁移到 Oracle (傻瓜篇)

如果用关键字 “MySQL 迁移 Oracle” 在网上搜索,基本上得到的内容都是关于从 Oracle 如何迁移到 MySQL 的,而从 MySQL 迁移到 Oracle 的信息则少之又少。

抛开那些手工一点点做的方法不谈,网络上也可以找到一些第三方工具来做这个事情,免费的? 我只找到了一个,那就是 Oracle SQL Developer 了。如果采用比较傻瓜化的方法,不妨考虑这个工具。在这个工具之前,Oracle 提供了单独的 Migration Workbench 工具。在 SQL Developer 1.2 版中,Oracle 干脆把这个功能集成进来。

数据流示意图:

Source Database(MySQL/DB2 etc.) --->SQL Developer (ETL)-->Target Database (Oracle)

MySQL JDBC 下载地址:

http://dev.mysql.com/downloads/connector/j/5.0.html

配置 MySQL JDBC:

SQL_developer_JDBC_drivers.png

还需要注意一点就是需要调整一下迁移时候的参数:

SQL_developer_Tuning.png

剩下的事情就简单了,配置到不同数据库以及准备存放 Metadata 数据库的信息。然后就可以迁移了。不赘述。

这个方法只是够傻瓜化,由于运行机制的限制,速度不是非常好。对于迁移过程中产生的变化数据,也无能为力。

EOF

RHEL 的 I/O 调度器(Scheduler)与 Database 的关系

今天参加 AIX 的技术培训,听了一些关于 CPU 调度的算法,倒也都是些基本知识,回想讲课内容的时候倒让我想起 Linux Kernel 的 I/O Scheduler 来。

这篇 Choosing an I/O Scheduler for Red Hat Enterprise Linux 4 and the 2.6 Kernel 是必须的参考资料。相比 Linux 2.4 Kernel 的一种 IO 调度器,2.6 做了很多改进,共有四种 IO 调度器。

Deadline scheduler

Deadline scheduler 用 deadline 算法保证对于既定的 IO 请求以最小的延迟时间,从这一点理解,对于 DSS 应用应该会是很适合的。

Anticipatory scheduler

Anticipatory scheduler(as) 曾经一度是 Linux 2.6 Kernel 的 IO scheduler 。Anticipatory 的中文含义是”预料的, 预想的”, 这个词的确揭示了这个算法的特点,简单的说,有个 IO 发生的时候,如果又有进程请求 IO 操作,则将产生一个默认的 6 毫秒猜测时间,猜测下一个 进程请求 IO 是要干什么的。这对于随即读取会造成比较大的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也可以简单理解为面向低速磁盘的,因为那个”猜测”实际上的目的是为了减少磁头移动时间。

Completely Fair Queuing

虽然这世界上没有完全公平的事情,但是并不妨碍开源爱好者们设计一个完全公平的 IO 调度算法。Completely Fair Queuing (cfq, 完全公平队列) 在 2.6.18 取代了 Anticipatory scheduler 成为 Linux Kernel 默认的 IO scheduler 。cfq 对每个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理。也就是对每一个 IO 请求都是公平的。这使得 cfq 很适合离散读的应用(eg: OLTP DB)。我所知道的企业级 Linux 发行版中,SuSE Linux 好像是最先默认用 cfq 的.

NOOP

Noop 对于 IO 不那么操心,对所有的 IO请求都用 FIFO 队列形式处理,默认认为 IO 不会存在性能问题。这也使得 CPU 也不用那么操心。当然,对于复杂一点的应用类型,使用这个调度器,用户自己就会非常操心。

那么如果跑数据库应用,那个更好一些呢? 我们看Choosing an I/O Scheduler for Red Hat Enterprise Linux 4 and the 2.6 Kernel一文中的测试结果:

scheduler.jpg

对于数据库应用, Anticipatory Scheduler 的表现是最差的。Deadline 在 DSS 环境表现比 cfq 更好一点,而 cfq 综合来看表现更好一些。这也难怪 RHEL 4 默认的 IO 调度器设置为 cfq. 而 RHEL 4 比 RHEL 3,整体 IO 改进还是不小的。

哪一种方式更好? 很难说,每一种方式都有特定的应用对它是最适合的。就像上面的 as 好像表现比较差,如果是 CPU 密集型的应用呢?

Tip:
Q:如何确认当前用什么 IO 调度器?
A: 过滤 /var/log/boot.msg 文件, 查找 “io scheduler”, 看到了么?

在 操作系统上可以查到的相关文档:
/usr/src/linux/Documentation/block/as-iosched.txt
/usr/src/linux/Documentation/block/deadline-iosched.txt

EOF

更新: Ubuntu Server 使用 Deadline 而不是桌面版的 CFQ 算法

从很多实际测试场景来看,Deadline 更适合跑 MySQL 数据库。