Performance Aerospike-从磁盘群集移动到内存群集时,延迟没有改善

Performance Aerospike-从磁盘群集移动到内存群集时,延迟没有改善,performance,amazon-ec2,aerospike,Performance,Amazon Ec2,Aerospike,首先,我们有一个aerospike集群,在AWS中有5个i2.2xlarge类型的节点,我们大约200台服务器的生产团队正在使用该集群存储/检索数据。集群的aerospike配置如下所示- service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1

首先,我们有一个aerospike集群,在AWS中有5个i2.2xlarge类型的节点,我们大约200台服务器的生产团队正在使用该集群存储/检索数据。集群的aerospike配置如下所示-

service {
        user root
        group root
        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 4
        fabric-workers 8
        transaction-pending-limit 100
        proto-fd-max 25000
}

logging {
        # Log file must be an absolute path.
        file /var/log/aerospike/aerospike.log {
                context any info
        }
}

network {
        service {
                address any
                port 3000
        }

        heartbeat {
                mode mesh
                port 3002 # Heartbeat port for this node.

                # List one or more other nodes, one ip-address & port per line:
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
               # mesh-seed-address-port <IP> 3002
                interval 250
                timeout 10
        }

        fabric {
                port 3001
        }

        info {
                port 3003
        }
}

namespace FC {
        replication-factor 2
        memory-size 7G
        default-ttl 30d # 30 days, use 0 to never expire/evict.


        high-water-disk-pct 80    # How full may the disk become before the server begins eviction
            high-water-memory-pct 70 # Evict non-zero TTL data if capacity exceeds # 70% of 15GB
               stop-writes-pct 90       # Stop writes if capacity exceeds 90% of 15GB


                  storage-engine device {
                  device /dev/xvdb1
                  write-block-size 256K
                      }

}
以下是观察结果-

--FC命名空间--

20 - servers, 6k Write TPS, 16K Read TPS
set latency = 10ms
set timeouts = 1
get latency = 15ms
get timeouts = 3

40 - servers, 12k Write TPS, 17K Read TPS
set latency = 12ms
set timeouts = 1 
get latency = 20ms
get timeouts = 5

60 - servers, 17k Write TPS, 18K Read TPS
set latency = 25ms
set timeouts = 5
get latency = 30ms
get timeouts = 10-50 (fluctuating)
--重空间--

20 - del servers, 6k Write TPS, 16K Read TPS
set latency = 7ms
set timeouts = 1
get latency = 5ms
get timeouts = 0
no of keys = 47 million x 2
disk usage = 121 gb
ram usage = 5.62 gb

40 - del servers, 12k Write TPS, 17K Read TPS
set latency = 15ms
set timeouts = 5
get latency = 12ms
get timeouts = 2

60 - del servers, 17k Write TPS, 18K Read TPS
set latency = 25ms
set timeouts = 25-75 (fluctuating)
get latency = 25ms
get timeouts = 2-15 (fluctuating)
*Set latency是指设置aerospike缓存密钥的延迟,类似地,get用于获取密钥

到达60台服务器后,我们不得不关闭名称空间HEAVYNAMESPACE

然后,我们启动了一个全新的POC,该集群的节点为r3.4xAWS find details的大型实例,aerospike配置的关键区别在于仅将内存用于缓存,希望它能提供更好的性能。这是aerospike.conf文件-

service {
        user root
        group root
        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 16
        transaction-queues 16
        transaction-threads-per-queue 4
        proto-fd-max 15000
}

logging {
        # Log file must be an absolute path.
        file /var/log/aerospike/aerospike.log {
                context any info
        }
}

network {
        service {
                address any
                port 3000
        }

        heartbeat {
                mode mesh
                port 3002 # Heartbeat port for this node.

                # List one or more other nodes, one ip-address & port per line:
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002
                mesh-seed-address-port <IP> 3002

                interval 250
                timeout 10
        }

        fabric {
                port 3001
        }

        info {
                port 3003
        }
}

namespace FC {
        replication-factor 2
        memory-size 30G
        storage-engine memory
                default-ttl 30d # 30 days, use 0 to never expire/evict.

        high-water-memory-pct 80 # Evict non-zero TTL data if capacity exceeds # 70% of 15GB
        stop-writes-pct 90       # Stop writes if capacity exceeds 90% of 15GB

}
如果我没有错的话,SI似乎是0.2%。我在集群的所有节点上都进行了相同的检查,其中一个节点为0.2%,其余三个节点为0.1%

此外,这是同一节点上的网络统计数据的输出-

$ sar -n DEV 10 10
Linux 4.4.30-32.54.amzn1.x86_64 (ip-10-111-215-72)      07/10/17        _x86_64_        (16 CPU)

08:09:16        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:09:26           lo     12.20     12.20      5.61      5.61      0.00      0.00      0.00      0.00
08:09:26         eth0   2763.60   1471.60    299.24    233.08      0.00      0.00      0.00      0.00

08:09:26        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:09:36           lo     12.00     12.00      5.60      5.60      0.00      0.00      0.00      0.00
08:09:36         eth0   2772.60   1474.50    300.08    233.48      0.00      0.00      0.00      0.00

08:09:36        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:09:46           lo     17.90     17.90     15.21     15.21      0.00      0.00      0.00      0.00
08:09:46         eth0   2802.80   1491.90    304.63    245.33      0.00      0.00      0.00      0.00

08:09:46        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:09:56           lo     12.00     12.00      5.60      5.60      0.00      0.00      0.00      0.00
08:09:56         eth0   2805.20   1494.30    304.37    237.51      0.00      0.00      0.00      0.00

08:09:56        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:06           lo      9.40      9.40      5.05      5.05      0.00      0.00      0.00      0.00
08:10:06         eth0   3144.10   1702.30    342.54    255.34      0.00      0.00      0.00      0.00

08:10:06        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:16           lo     12.00     12.00      5.60      5.60      0.00      0.00      0.00      0.00
08:10:16         eth0   2862.70   1522.20    310.15    238.32      0.00      0.00      0.00      0.00

08:10:16        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:26           lo     12.00     12.00      5.60      5.60      0.00      0.00      0.00      0.00
08:10:26         eth0   2738.40   1453.80    295.85    231.47      0.00      0.00      0.00      0.00

08:10:26        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:36           lo     11.79     11.79      5.59      5.59      0.00      0.00      0.00      0.00
08:10:36         eth0   2758.14   1464.14    297.59    231.47      0.00      0.00      0.00      0.00

08:10:36        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:46           lo     12.00     12.00      5.60      5.60      0.00      0.00      0.00      0.00
08:10:46         eth0   3100.40   1811.30    328.31    289.92      0.00      0.00      0.00      0.00

08:10:46        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08:10:56           lo      9.40      9.40      5.05      5.05      0.00      0.00      0.00      0.00
08:10:56         eth0   2753.40   1460.80    297.15    231.98      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo     12.07     12.07      6.45      6.45      0.00      0.00      0.00      0.00
Average:         eth0   2850.12   1534.68    307.99    242.79      0.00      0.00      0.00      0.00
从上面可以看出,我认为每秒处理的数据包总数应该是2850.12+1534.68=4384.8 rxpck/s和txpck/s之和,这在每秒250K数据包之内,如@RonenBotzer的回答中所述

更新2

我在集群的一个节点上运行了asadm命令,然后是show latency,从输出来看,读取和写入的延迟似乎都不超过1ms-

Admin> show latency
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~read Latency~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                               Node                 Time   Ops/Sec   >1Ms   >8Ms   >64Ms
                                  .                 Span         .      .      .       .
ip-10-111-215-72.ec2.internal:3000    11:35:01->11:35:11    1242.1    0.0    0.0     0.0
ip-10-13-215-20.ec2.internal:3000     11:34:57->11:35:07    1297.5    0.0    0.0     0.0
ip-10-150-147-167.ec2.internal:3000   11:35:04->11:35:14    1147.7    0.0    0.0     0.0
ip-10-165-168-246.ec2.internal:3000   11:34:59->11:35:09    1342.2    0.0    0.0     0.0
ip-10-233-158-213.ec2.internal:3000   11:35:00->11:35:10    1218.0    0.0    0.0     0.0
Number of rows: 5

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~write Latency~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                               Node                 Time   Ops/Sec   >1Ms   >8Ms   >64Ms
                                  .                 Span         .      .      .       .
ip-10-111-215-72.ec2.internal:3000    11:35:01->11:35:11      33.0    0.0    0.0     0.0
ip-10-13-215-20.ec2.internal:3000     11:34:57->11:35:07      37.2    0.0    0.0     0.0
ip-10-150-147-167.ec2.internal:3000   11:35:04->11:35:14      36.4    0.0    0.0     0.0
ip-10-165-168-246.ec2.internal:3000   11:34:59->11:35:09      36.9    0.0    0.0     0.0
ip-10-233-158-213.ec2.internal:3000   11:35:00->11:35:10      33.9    0.0    0.0     0.0
Number of rows: 5
Aerospike有几个可供配置的组件:

内存中没有持久性的数据 内存中的数据,保存到磁盘 SSD上的数据、内存中的AKA体系结构 内存优化

及 Aerospike包括内存名称空间的几项重大性能改进

其中包括对分区表示方式的更改,从单个红黑树到多个子树。应适当使用新的配置参数和。在您的情况下,由于r3.4X大型实例有122G的DRAM,您可以承担将分区树分支设置为最大值4096所带来的311M开销

<>你也应该考虑一下设置。这个选项确实需要Linux内核>=3.19,它是Ubuntu>=15.04的一部分,但还没有很多其他版本

聚类改进

最近的测试包括重写集群管理器。一般来说,你应该考虑使用最新的版本,但是我指出了直接影响你的性能的方面。

EC2网络和Aerospike

您没有显示集群本身的延迟数,因此我怀疑问题在于网络,而不是节点

较旧的实例族类型,如r3、c3、i2,随附具有单个发送/接收队列的ENIs-NIC。随着CPU数量的增加,访问此队列的内核的软件中断可能成为瓶颈,所有CPU都需要等待轮到它们使用NIC。Aerospike社区讨论论坛上有一篇知识库文章,可以帮助您绕过最初使用此类实例获得的单个ENI的有限性能。Aerospike网站上的讨论是在使用ENIs的情况下使用RPS最大化TPS

另一方面,您应该考虑移动到带有多队列的更新实例R4、I3等。这些不需要RPS,并且在不添加额外卡的情况下支持更高的TPS。他们也碰巧有更好的芯片组,成本大大低于他们的兄弟姐妹r4大约比r3便宜30%,i3大约是i2价格的1/3。

Aerospike有几个可以配置的:

内存中没有持久性的数据 内存中的数据,保存到磁盘 SSD上的数据、内存中的AKA体系结构 内存优化

及 Aerospike包括内存名称空间的几项重大性能改进

其中包括对分区表示方式的更改,从单个红黑树到多个子树。应适当使用新的配置参数和。在您的情况下,由于r3.4X大型实例有122G的DRAM,您可以承担将分区树分支设置为最大值4096所带来的311M开销

<>你也应该考虑一下设置。这个选项确实需要Linux内核>=3.19,它是Ubuntu>=15.04的一部分,但还没有很多其他版本

聚类改进

最近的测试包括重写集群管理器。一般来说,你应该考虑使用最新的版本,但是我指出了直接影响你的性能的方面。

EC2网络和Aerospike

您没有显示集群本身的延迟数,因此我怀疑问题在于网络,而不是节点

较旧的实例族类型(如r3、c3、i2)随E一起提供 NIs—具有单个发送/接收队列的NIC。随着CPU数量的增加,访问此队列的内核的软件中断可能成为瓶颈,所有CPU都需要等待轮到它们使用NIC。Aerospike社区讨论论坛上有一篇知识库文章,可以帮助您绕过最初使用此类实例获得的单个ENI的有限性能。Aerospike网站上的讨论是在使用ENIs的情况下使用RPS最大化TPS


另一方面,您应该考虑移动到带有多队列的更新实例R4、I3等。这些不需要RPS,并且在不添加额外卡的情况下支持更高的TPS。他们也碰巧有更好的芯片组,而且成本明显低于他们的兄弟姐妹r4大约比r3便宜30%,i3大约是i2价格的1/3。

你的标题有误导性。请考虑改变它。您已从磁盘上移动到内存中。 mem+磁盘意味着数据在磁盘上,并且mem使用内存中的数据=真

我最好的猜测是,一个CPU在进行网络I/O时是瓶颈。 您可以查看顶部输出,并查看si软件中断 如果一个CPU的显示值比另一个高很多, 您可以尝试的最简单的方法是RPS接收数据包控制

echo f|sudo tee  /sys/class/net/eth0/queues/rx-0/rps_cpus
一旦确认其网络瓶颈, 你可以按照@Ronen的建议试试ENA

细说,, 当您只有FC的延迟为15毫秒时,假设其tps较低。 但当您在prod中的HEAVYNAMESPACE上添加高负载时, 随着您添加更多的客户端节点和tps,延迟不断增加

同样,在您的POC中,延迟随着客户端节点的增加而增加。 即使使用130台服务器,延迟也低于15毫秒。这部分是好的。 我不确定我是否理解你的SETU成功图。以ktps为单位对其进行赋值

更新:

在查看服务器端延迟柱状图之后,看起来服务器运行良好。
很可能是客户的问题。检查客户端计算机上的CPU和网络

你的标题有误导性。请考虑改变它。您已从磁盘上移动到内存中。 mem+磁盘意味着数据在磁盘上,并且mem使用内存中的数据=真

我最好的猜测是,一个CPU在进行网络I/O时是瓶颈。 您可以查看顶部输出,并查看si软件中断 如果一个CPU的显示值比另一个高很多, 您可以尝试的最简单的方法是RPS接收数据包控制

echo f|sudo tee  /sys/class/net/eth0/queues/rx-0/rps_cpus
一旦确认其网络瓶颈, 你可以按照@Ronen的建议试试ENA

细说,, 当您只有FC的延迟为15毫秒时,假设其tps较低。 但当您在prod中的HEAVYNAMESPACE上添加高负载时, 随着您添加更多的客户端节点和tps,延迟不断增加

同样,在您的POC中,延迟随着客户端节点的增加而增加。 即使使用130台服务器,延迟也低于15毫秒。这部分是好的。 我不确定我是否理解你的SETU成功图。以ktps为单位对其进行赋值

更新:

在查看服务器端延迟柱状图之后,看起来服务器运行良好。
很可能是客户的问题。检查客户端计算机上的CPU和网络

1什么版本的Aerospike?2服务器是否报告了此延迟?3我不希望disk+mem和just mem之间有太大的性能差异。请说明您最初使用的实例。您提到在60节点集群中使用r3.4xl节点,但这与最初的5个节点有所不同。@kporter我们使用的是Aerospike Community Edition build 3.10.1。此处报告的延迟是在客户端节点上计算的延迟。我不确定如何从服务器读取延迟。我试图查看服务器上生成的aerospike.log文件,但无法确定。@RonenBotzer最初的5个实例是i2.2xlarge类型。1 aerospike的哪个版本?2服务器是否报告了此延迟?3我不希望disk+mem和just mem之间有太大的性能差异。请说明您最初使用的实例。您提到在60节点集群中使用r3.4xl节点,但这与最初的5个节点有所不同。@kporter我们使用的是Aerospike Community Edition build 3.10.1。此处报告的延迟是在客户端节点上计算的延迟。我不确定如何从服务器读取延迟。我试图查看服务器上生成的aerospike.log文件,但无法确定。@RonenBotzer最初的5个实例是i2.2xlarge类型。set_成功图是一个客户端节点上成功设置aerospike缓存密钥的图。因为我们没有写失败,它基本上是写请求图,是一个客户端节点上流量的度量。在我看来,软件中断%甚至跨越了所有节点。请复习一下。谢谢。我的意思是我们应该在同一台机器的内核之间比较si。当您在交互式顶部输出中时,如果按1,它将显示per core i
信息。请分享这一成果。从您已经共享的内容来看,si的cpu%似乎很低。此外,根据sar输出,您的tps似乎较低。下一步是使微基准点能够获得更多深入的细节。您应该启用读写基准点启用基准点读写基准点。一个节点就足够了。然后,您可以使用asloglatency工具以良好的方式打印信息。你能检查一下柱状图并分享最差的一个吗。只是确认一下,asinfo-v'set-config:context=namespace;id=FC;enable benchmarks read=true”将是打开显示我的FC名称空间的直方图所需数据的命令,对吗?在此之后,我可以看到以下命令的柱状图-asloglatency-h FC read?set_success graph是一个客户端节点上成功的aerospike缓存密钥设置图。因为我们没有写失败,它基本上是写请求图,是一个客户端节点上流量的度量。在我看来,软件中断%甚至跨越了所有节点。请复习一下。谢谢。我的意思是我们应该在同一台机器的内核之间比较si。当您在交互式顶部输出中时,如果按1,它将显示每个核心的信息。请分享这一成果。从您已经共享的内容来看,si的cpu%似乎很低。此外,根据sar输出,您的tps似乎较低。下一步是使微基准点能够获得更多深入的细节。您应该启用读写基准点启用基准点读写基准点。一个节点就足够了。然后,您可以使用asloglatency工具以良好的方式打印信息。你能检查一下柱状图并分享最差的一个吗。只是确认一下,asinfo-v'set-config:context=namespace;id=FC;enable benchmarks read=true”将是打开显示我的FC名称空间的直方图所需数据的命令,对吗?在此之后,我可以看到针对以下命令的柱状图-asloglatency-h FC read?感谢所有的细节,我仍在努力弄清楚。我在我的问题中添加了一个更新,其中包含网络统计信息,根据您的建议,这应该是添加更多NIC/ENI或应用接收数据包控制的决定因素。我还在我的问题中添加了一个更新2,在asadm命令之后添加了show latency命令的输出。不过,我无法使用show latency命令的所有可用选项。感谢您提供的所有详细信息,我仍在努力解决这些问题。我在我的问题中添加了一个更新,其中包含网络统计信息,根据您的建议,这应该是添加更多NIC/ENI或应用接收数据包控制的决定因素。我还在我的问题中添加了一个更新2,在asadm命令之后添加了show latency命令的输出。尽管如此,我无法在ShowLatency命令中使用所有可用选项。
echo f|sudo tee  /sys/class/net/eth0/queues/rx-0/rps_cpus