我有一个由 4 台服务器组成的集群。其中一个命名空间基于原始设备。设备位于 SAS 机械硬盘上。
现在故事的奇怪部分来了。我正在运行一个包含小记录的测试(2x50 字节 = 总共 100 字节)。我以 150 - 200k OPS 的速度写入。现在,在读取时 - 吞吐量下降到 4k OPS!!!是的,我知道 - 这可能很奇怪,我完全糊涂了。
读取期间服务器显示负载很小。iotop 和 nload 没有显示任何我认为有问题的内容。
这是设备配置:
namespace test-raw {
replication-factor 4
memory-size 16G
default-ttl 7200
max-ttl 2D
high-water-disk-pct 80
high-water-memory-pct 60
stop-writes-pct 90
partition-tree-locks 64
partition-tree-sprigs 4096
storage-engine device {
device /dev/sdb1
write-block-size 1M
max-write-cache 8G
data-in-memory false
cold-start-empty true
}
}
任何见解都将不胜感激。
干杯,
鲍里斯。
答案1
您不应将 HDD 与 Aerospike 一起使用作为主存储设备,因为您将错过所有针对 SSD 的低级优化。HDD 并非为处理大量并发读取而设计的,而这是 SSD 的主要优势之一。Aerospike 中 HDD 唯一适合的地方是作为内存命名空间的持久层。 您的命名空间将其数据存储在设备上,该设备应该是合适的企业级(又称 DC 质量)SSD。
看根据“配置配方”比较 SSD 性能以及以下内容常见问题 (FAQ):
我可以将数据存储在硬盘而不是 SSD 上吗?
否。Aerospike 数据库旨在成为高性能、低延迟的数据库。因此,旋转磁盘的物理限制会给数据带来不可接受的延迟。
现在进行一些快速修复:
- 在命名空间配置块中
storage-engine device
,确保scheduler-mode
明确设置为noop
。请参阅常见问题 - 磁盘调度程序的用途是什么? - 最大限度地提高您的
post-write-queue
,将其设置为 2048。请参阅当客户端将记录写入 Aerospike 数据库中的持久存储时会发生什么?。您可以动态调整:asadm -e "asinfo -v 'set-config:context=namespace;id=test-raw;post-write-queue=2048' "
答案2
...由于您的记录只有 100 字节,因此您可能每条记录使用 256 字节(包括开销和 128 字节边界)。如果写入块大小默认为 1 MB,则写入时您将在 RAM 中的 1 MB 中装入大约 4K 条记录,这些记录将以 1 MB 块的形式异步刷新到磁盘。在读取时,您将以 128 字节的读取块从磁盘读取单个记录。如果您正在读取最近更新的记录,则您可能正在从 RAM 中的写入后队列中获取它,否则您将访问磁盘。因此,您的读取延迟来自磁盘对必须从磁盘获取的记录的缓慢性能。如果写入块大小为 128K,那么每个块大约可以容纳 500 条记录。您可以在测试集群上使用写入块大小,看看性能是否有所提升。检查 /var/log/aerospike/aerospike.log 中的 write-q 值以查看磁盘是否很慢。如果磁盘不是瓶颈,则在写入吞吐量下 write-q 将为零。您有一个非常大的最大写入缓存 - 8G -(默认为 64M),这也有助于您进行写入。您还可以通过将 post-write-queue 减少到非常小的数字进行测试,看看读取吞吐量是否会变得更糟。