我在运行 Ubuntu 10.10(32 位,带有 ext4 分区)的 Macbook Pro 上运行 ActiveMQ。
Linux iker-laptop 2.6.35-23-generic-pae #40-Ubuntu SMP Wed Nov 17 22:32:51 UTC 2010 i686 GNU/Linux
如果我在 ActiveMQ 中启用持久性,性能会急剧下降。我在其他机器上测试过同样的事情,差异有2个数量级。
有一个带有activeMQ的工具可以测试HD,结果如下:
iker@iker-laptop:~/apps/apache-activemq-5.4.1$ java -classpath lib/kahadb-5.4.1.jar org.apache.kahadb.util.DiskBenchmark
Benchmarking: /home/iker/apps/apache-activemq-5.4.1/disk-benchmark.dat
Writes:
146171 writes of size 4096 written in 11.074 seconds.
13199.477 writes/second.
51.560455 megs/second.
Sync Writes:
197 writes of size 4096 written in 10.006 seconds.
19.688187 writes/second.
0.07690698 megs/second.
Reads:
5589861 reads of size 4096 read in 10.001 seconds.
558930.2 writes/second.
2183.321 megs/second.
同步写入的性能很糟糕。肯定有什么配置错误,但这是我注意到高清性能问题的唯一应用程序。
hdparm 抛出预期值:
iker@iker-laptop:~$ sudo hdparm -tT /dev/sda
/dev/sda:
Timing cached reads: 6282 MB in 2.00 seconds = 3141.73 MB/sec
Timing buffered disk reads: 240 MB in 3.00 seconds = 79.88 MB/sec
答案1
同步 IO 的主要限制因素不是硬盘的吞吐量,而是从发出写入到将其提交到磁盘所需的时间。在这方面,硬盘驱动器最相关的性能指标是硬盘驱动器的寻道时间,而不是理想情况下的吞吐量。
除了硬件对你不利之外,内核也是如此,我猜你可能会看到一个小小的改进(尽管,可能远不及你从异步 IO 中获得的效果),如果你可以将基准测试(应用程序)在实时IO调度类下运行。默认情况下,应用程序将安排在尽力而为类别下,这也可能会增加写入的等待时间。使用实时调度类需要您自担风险,因为它会在访问磁盘时对其他应用程序的性能产生不利影响。
总的来说,我真的不认为您所看到的同步写入性能有什么严重错误。与异步 IO 相比,同步 IO 通常会表现得非常糟糕。
作为旁注,快速谷歌一下 activemq 和同步 io 给出了下列的:
出于性能原因,即使您使用的是持久消息,您也可能希望尽快将消息流式传输到代理
答案2
cfq I/O 调度程序在此类测试中往往表现得很糟糕。除了前面的 ionice 建议之外,您可能还想尝试切换到截止时间 I/O 调度程序(通过使用 root 启动elevator=deadline
或以 root 身份执行for n in /sys/block/sd*/queue/scheduler ; do echo deadline > $n ; done
)。
答案3
同步写入必须先收到写入已提交的确认(无论提交成功还是错误),然后才能返回自身。这是设计使然,并且由于旋转金属磁盘涉及的高延迟时间(磁盘 RAM 缓存不计算在内),本质上会使同步写入速度变慢。
异步写入通常写入 RAM,操作系统稍后将其提交到磁盘(稍后通常只需几秒或更短时间(我相信 ZFS 是 5x/秒,或每 5 秒一次))。磁盘寻道时间以毫秒为单位,而 RAM 寻道时间以纳秒为单位。这是 1000 倍的差异。
当在继续之前永久存储数据绝对至关重要并且可能发生断电的 1 秒延迟是不可接受的时,请使用同步写入。
在所有其他时间使用异步写入。
答案4
同步写入很慢,这就是我们缓冲所有内容的原因。看一眼IOPS在 Wikipedia 上,您会看到典型的 7,200 rpm HDD 具有 75-100 IOPS。现在看一下Macbook Pro 的技术规格,并且它有一个 5,400 rpm 的硬盘。这最多相当于 75% 的性能,因此您最多只能看到笔记本电脑的 50-75 IOPS。
MQ 可能会编写一个数据分类账和一个会计分类账,这会让您达到在 ActiveMQ 基准测试中看到的 20 IOPS。
你有两个选择,测试一下临时文件系统,即内存文件系统,或者使用SSD。通常,使用同步写入的服务器将拥有一个带有 15,000 rpm 磁盘的重要 SAS/SCSI RAID 阵列。向阵列添加额外的磁盘是为了提高性能,而不是增加容量。