latency - aerospike 与 aws 的不良延迟
问题描述
我们在 2 节点集群的裸机机器的软层中运行 aerospike。我们的配置文件平均大小为 1.5 KB,在峰值时,每个节点的操作将约为 6000 ops/sec。延迟都很好,峰值 > 1ms 将在 5% 左右。
现在我们计划迁移到 aws。所以我们启动了 2 台 i3.xlarge 机器。我们以 1.5KB 的对象大小和 3 倍的负载运行基准测试。结果令人满意,大约为 4-5%(>1ms)。现在我们开始实际处理,峰值延迟跃升至 25-30%,即 > 1 毫秒,它可以容纳的最大值约为 5K 操作/秒。所以我们又增加了一个节点,我们做了基准测试(4.5KB 的对象大小和 3 倍的负载)。结果为 2-4%(>1ms)。现在加入集群后,峰值下降到 16-22%。我们又增加了一个节点,峰值现在为 10-15%。
aws 中的版本是 aerospike-server-community-3.15.0.2 Sl 中的版本是 Aerospike Enterprise Edition 3.6.3
我们的配置如下
#Aerospike database configuration file.
service {
user xxxxx
group xxxxx
run-as-daemon
paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
pidfile /var/run/aerospike/asd.pid
service-threads 8
transaction-queues 8
transaction-threads-per-queue 8
proto-fd-max 15000
}
logging {
#Log file must be an absolute path.
file /var/log/aerospike/aerospike.log {
context any info
}
}
network {
service {
port 13000
address h1 reuse-address
}
heartbeat {
mode mesh
port 13001
address h1
mesh-seed-address-port h1 13001
mesh-seed-address-port h2 13001
mesh-seed-address-port h3 13001
mesh-seed-address-port h4 13001
interval 150
timeout 10
}
fabric {
port 13002
address h1
}
info {
port 13003
address h1
}
}
namespace XXXX {
replication-factor 2
memory-size 27G
default-ttl 10d
high-water-memory-pct 70
high-water-disk-pct 60
stop-writes-pct 90
storage-engine device {
device /dev/nvme0n1
scheduler-mode noop
write-block-size 128K
}
}
应该做些什么来降低aws中的延迟?
解决方案
这归结为 i3 节点 SSD 的性能特征与 Softlayer 上的不同。如果您在软盘上运行 Aerospike,您将获得 0.5TPS。
Piyush 的评论提到了ACT,这是 Aerospike 创建的开源工具,用于对具有真实数据库工作负载的 SSD 进行基准测试。ACT 的重点是找到可以依靠 SSD 提供所需延迟的持续速率。突发率对数据库来说并不重要。
Aerospike 的性能工程团队已经使用 ACT 来发现 i3 1900G SSD 可以做什么,并在帖子中发布了结果。它的 ACT 等级是 4 倍,这意味着完整的1900G SSD 可以在标准 1.5K 对象大小、128K 块大小下进行 8Ktps 读取、4Ktps 写入,并且保持在 95% < 1ms、99% < 8ms、99.9% < 64ms。这对于 SSD 来说并不是特别好。相比之下,美光 9200 PRO 的速率为 94.5 倍,TPS 负载高出近 24 倍。更重要的是,使用 i3.xlarge,您可以与邻居共享一半的驱动器. 没有办法限制 IOPS,以便每个人得到一半,只有一个存储分区。这意味着您可以预期源自邻居的延迟峰值。i3.2xlarge 是为您提供整个 SSD 的最小实例。
因此,您获取 ACT 信息并使用它来进行容量规划。您需要了解的主要因素是平均对象大小(您可以使用objsz histogram找到)、对象数量(同样,可通过asadm 获得)、峰值读取 TPS 和峰值写入 TPS(您提到的 60Ktps 如何在读取之间拆分并写?)。
检查您的日志以获取您的cache-read-pct
值。如果它们在 10% 或更高的范围内,您应该提高您的post-write-queue
值以获得更好的读取延迟(并减少来自驱动器的 IOPS 压力)。
推荐阅读
- java - Netbeans + ANT 自定义库目录
- expression - Can you create an expression, for use in google docs, for finding line breaks that are NOT using the 'Normal text' format?
- winsock - 由于 10060 错误,SIlk 执行者无法加载页面
- vega-lite - VegaLite 高亮表中每列的单独着色标度
- html - CSS样式表中的背景
- javascript - Vuejs v-for循环,表单看不到数据
- javascript - Javascript列表过滤器 - 包含任何单词而不是包含
- python - Python mysql无法处理参数
- canoe - 为什么即使在 dbc 中定义了消息,CAN 跟踪也不显示消息名称?你能弄清楚它背后的一些原因吗?
- regex - Perl 上的正则表达式来捕获这种类型的值 (a)(2)